1 /***************************************************************************
2 * FILENAME: cload.h
3 * VERSION: 2.4 5/2/96 13:12:48
4 * SCCS ID: "@(#)cload.h 2.4 5/2/96"
5 ***************************************************************************/
6 /*****************************************************************************/
7 /* CLOAD.H - Header file for Generic COFF Loader Version 4.00 9/92 */
8 /*****************************************************************************/
9 #ifndef _CLOAD_H_
10 #define _CLOAD_H_
12 typedef unsigned int T_ADDR; /* TYPE FOR TARGET ADDRESS */
13 typedef unsigned int T_DATA; /* TYPE FOR TARGET DATA WORD */
14 typedef unsigned int T_SIZE; /* TYPE FOR CINIT SIZE FIELD */
15 typedef unsigned int T_IADDR; /* TYPE FOR CINIT ADDRESS FIELD */
16 typedef unsigned int T_INSTRUCT; /* TYPE FOR INSTRUCTION OPCODE */
18 #define FT_IEEE_FLT 1
19 #define FT_IEEE_DBL 2
20 #define FLT_PRECISION 4
22 typedef struct trg_fval {
23 unsigned int fval1;
24 unsigned int fval2;
25 } TRG_FVAL;
27 #define MAGIC MAGIC_C60 /* C60 Magic Number */
29 #define LOCTOBYTE(x) (x) /* C60 addresses are same as bytes */
30 #define BYTETOLOC(x) (x)
31 #define BIT_OFFSET(a) (0) /* BIT OFFSET OF ADDR WITHIN BYTE */
33 #ifdef OTIS
34 #define LOADBUFSIZE (TRG_MAX_MBLK/8) /* USE OTIS BUFFER SIZE */
35 #else
36 #define LOADBUFSIZE 0x4000 /* 16K BUFFER FOR LOADING DATA */
37 //#define UNBUFFERED 1
38 #endif
40 #define LOADWORDSIZE 8 /* MINIMUM DIVISOR OF LOAD SIZE */
41 #define CINIT ".cinit" /* NAME OF CINIT SECTION */
42 #define INIT_ALIGN 8 /* ALIGNMENT OF CINIT RECORDS */
43 #define INIT_WSIZE 4 /* SIZE IN BYTES OF INIT DATA ITEMS */
46 /*---------------------------------------------------------------------------*/
47 /* THIS MACRO IS USED TO FACILIATE ACCESS TO THE SECTION HEADERS */
48 /*---------------------------------------------------------------------------*/
49 #define SECT_HDR(i) ((SCNHDR *)(sect_hdrs + (i) * SCNHSZ))
51 /*---------------------------------------------------------------------------*/
52 /* THIS MACRO IS USED TO FACILITATE BACKWARDS COMPATIBILITY FOR COFF- */
53 /* DEPENDENT TOOLS THAT SUPPORT COFF VERSION 2. */
54 /*---------------------------------------------------------------------------*/
55 #define O_SECT_HDR(i) ((O_SCNHDR *)(o_sect_hdrs + (i)*SCNHSZ_IN(coff_version)))
57 /*----------------------------------------------------------------------------*/
58 /* STATIC COPY OF 8 CHARACTER SECTION NAME, GUARANTEED NULL TERMINATION WHEN */
59 /* USED AS A STRING. */
60 /*----------------------------------------------------------------------------*/
61 static char stat_nm[SYMNMLEN+1]={'\0','\0','\0','\0','\0','\0','\0','\0','\0'};
62 #define SNAMECPY(s) (strncpy(stat_nm, (s), SYMNMLEN))
64 /*---------------------------------------------------------------------------*/
65 /* THESE MACROS ARE USED TO FIND CINIT AND BSS SECTIONS */
66 /*---------------------------------------------------------------------------*/
67 #define IS_BSS(sptr) (!str_comp(sptr->s_name, ".bss"))
68 #define IS_CINIT(sptr) ((sptr->s_flags & STYP_COPY) && \
69 !str_comp(sptr->s_name, CINIT) )
71 /*---------------------------------------------------------------------------*/
72 /* VARIABLES SET BY THE APPLICATION. */
73 /*---------------------------------------------------------------------------*/
74 #define FILE_BASED 0
75 #define STRIP_RELOC 1
76 #define REMOVE_MALLOC 0
78 #if (FILE_BASED)
79 FILE *fin; /* INPUT FILE */
80 #else
81 /* extern unsigned char gRxBuffer[0x400040]; */
82 extern unsigned char gRxBuffer[0x10];
83 #endif
85 extern int need_data; /* READ IN RAW DATA */
86 extern int need_symbols; /* READ IN SYMBOL TABLE */
87 extern int clear_bss; /* CLEAR BSS SECTION */
88 extern int big_e_config; /* ENDIANNESS CONFIGURATION OF TARGET */
89 #if TMS320C60 || RTC
90 extern int fill_bss_value; /* NUMBER FOR FILL VALUE */
91 #endif
93 /*---------------------------------------------------------------------------*/
94 /* VARIABLES SET BY THE LOADER. */
95 /*---------------------------------------------------------------------------*/
96 extern FILHDR file_hdr; /* FILE HEADER STRUCTURE */
97 extern int coff_version; /* VERSION OF COFF USED BY FILE */
98 extern AOUTHDR o_filehdr; /* OPTIONAL (A.OUT) FILE HEADER */
99 extern T_ADDR entry_point; /* ENTRY POINT OF MODULE */
100 extern T_ADDR *reloc_amount; /* AMOUNT OF RELOCATION PER SECTION */
101 extern SCNHDR sect_hdrs[]; /* Array of loadable sections */
102 extern O_SCNHDR o_sect_hdr; /* A single old section header */
103 extern int n_sections; /* NUMBER OF SECTIONS IN THE FILE */
104 extern int big_e_target; /* OBJECT DATA IS STORED MSB FIRST */
105 extern int byte_swapped; /* BYTE ORDERING OPPOSITE OF HOST */
106 extern int curr_sect; /* INDEX OF SECTION CURRENTLY LOADING */
107 extern int load_err; /* ERROR CODE RETURNED IF LOADER FAILS */
108 extern struct strtab *str_head; /* HEAD OF STRING BUFFER LIST */
110 /*--------------------------------------------------------------------------*/
111 /* CLOAD.C PROTOTYPES */
112 /*--------------------------------------------------------------------------*/
113 extern int cload(BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *ientry_point);
114 extern int cload_headers(BOOT_MODULE_FXN_TABLE *bootFxn, Uint32 *ientry_point);
115 extern int cload_data(BOOT_MODULE_FXN_TABLE *bootFxn);
116 extern int cload_sect_data(SCNHDR *sptr, BOOT_MODULE_FXN_TABLE *bootFxn);
117 extern int cload_cinit (unsigned char *, int *, int *);
118 extern int cload_symbols (void);
119 extern int cload_strings (void);
120 extern void str_free (struct strtab *);
121 extern int sym_read (int, struct syment *, union auxent *);
122 extern char *sym_name (struct syment *);
123 extern char *sym_add_name (struct syment *);
124 extern int reloc_add (int, struct syment *);
125 extern int relocate (RELOC *, unsigned char *, int);
126 extern int reloc_read (RELOC *, unsigned int offset);
127 extern int reloc_size (int);
128 extern int reloc_offset (int);
129 extern int reloc_stop (int);
130 extern int sym_reloc_amount (RELOC *);
131 extern unsigned int unpack (unsigned char *, int, int, int);
132 extern void repack (unsigned int, unsigned char *, int,int,int);
133 extern int cload_lineno (int, int, struct lineno *, int);
134 extern void swap4byte (void *);
135 extern void swap2byte (void *);
137 /*--------------------------------------------------------------------------*/
138 /* PROTOTYPES FOR FUNCTIONS REQUIRED BY CLOAD.C */
139 /*--------------------------------------------------------------------------*/
140 extern void lookup_sym(int indx, SYMENT *sym, AUXENT *aux);
141 extern int mem_write(unsigned char *, unsigned int, T_ADDR, unsigned char);
142 extern void load_msg(const char *);
143 extern int set_reloc_amount(void);
144 extern int load_syms(int);
146 /*---------------------------------------------------------------------------*/
147 /* VALUE OF big_e_config IF THERE IS NO TARGET AND SO IT'S A DON'T CARE. */
148 /*---------------------------------------------------------------------------*/
149 #define DONTCARE -1
151 /*---------------------------------------------------------------------------*/
152 /* ERROR CODES */
153 /*---------------------------------------------------------------------------*/
154 #define E_FILE 1 /* ERROR READING COFF FILE */
155 #define E_MAGIC 2 /* WRONG MAGIC NUMBER */
156 #define E_RELOC 3 /* FILE IS NOT RELOCATABLE */
157 #define E_SYM 4 /* LOAD_SYM RETURNED FALSE */
158 #define E_ALLOC 5 /* MYALLOC OR MRALLOC RETURNED FALSE */
159 #define E_SETRELOC 6 /* SET_RELOC_AMOUNT RETURNED FALSE */
160 #define E_MEMWRITE 7 /* MEM_WRITE RETURNED FALSE */
161 #define E_RELOCENT 8 /* RELOC ENTRY RULES VIOLATED */
162 #define E_ENDIAN 9 /* OBJ ENDIANESS CONFLICTS WITH TARGET */
164 #endif /* _CLOAD_H_ */