140d01547SDavid du Colombier #include <u.h> 240d01547SDavid du Colombier #include <libc.h> 340d01547SDavid du Colombier #include <bio.h> 440d01547SDavid du Colombier #include "../ld/elf.h" 540d01547SDavid du Colombier 640d01547SDavid du Colombier typedef vlong int64; 740d01547SDavid du Colombier 840d01547SDavid du Colombier /* 940d01547SDavid du Colombier * basic types in all loaders 1040d01547SDavid du Colombier */ 1140d01547SDavid du Colombier 1240d01547SDavid du Colombier typedef struct Adr Adr; 1340d01547SDavid du Colombier typedef struct Auto Auto; 1440d01547SDavid du Colombier typedef struct Count Count; 1540d01547SDavid du Colombier typedef struct Ieee Ieee; 1640d01547SDavid du Colombier typedef struct Prog Prog; 1740d01547SDavid du Colombier typedef struct Sym Sym; 1840d01547SDavid du Colombier 1940d01547SDavid du Colombier #ifndef EXTERN 2040d01547SDavid du Colombier #define EXTERN extern 2140d01547SDavid du Colombier #endif 2240d01547SDavid du Colombier 2340d01547SDavid du Colombier #define LIBNAMELEN 300 2440d01547SDavid du Colombier 2540d01547SDavid du Colombier #define P ((Prog*)0) 2640d01547SDavid du Colombier #define S ((Sym*)0) 2740d01547SDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 2840d01547SDavid du Colombier 2940d01547SDavid du Colombier struct Auto 3040d01547SDavid du Colombier { 3140d01547SDavid du Colombier Sym* asym; 3240d01547SDavid du Colombier Auto* link; 3340d01547SDavid du Colombier vlong aoffset; 3440d01547SDavid du Colombier short type; 3540d01547SDavid du Colombier }; 3640d01547SDavid du Colombier 3740d01547SDavid du Colombier struct Count 3840d01547SDavid du Colombier { 3940d01547SDavid du Colombier long count; 4040d01547SDavid du Colombier long outof; 4140d01547SDavid du Colombier }; 4240d01547SDavid du Colombier 4340d01547SDavid du Colombier enum 4440d01547SDavid du Colombier { 4540d01547SDavid du Colombier 4640d01547SDavid du Colombier STRINGSZ = 200, 4740d01547SDavid du Colombier NHASH = 10007, 4840d01547SDavid du Colombier NHUNK = 100000, 49*2ec6491fSDavid du Colombier MAXIO = 16*1024, 5040d01547SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 5140d01547SDavid du Colombier }; 5240d01547SDavid du Colombier 5340d01547SDavid du Colombier #define SIGNINTERN (1729*325*1729) /* signature of internal functions such as _div */ 5440d01547SDavid du Colombier 5540d01547SDavid du Colombier EXTERN union 5640d01547SDavid du Colombier { 5740d01547SDavid du Colombier struct 5840d01547SDavid du Colombier { 5940d01547SDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 6040d01547SDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 6140d01547SDavid du Colombier } u; 6240d01547SDavid du Colombier char dbuf[1]; 6340d01547SDavid du Colombier } buf; 6440d01547SDavid du Colombier 6540d01547SDavid du Colombier #define cbuf u.obuf 6640d01547SDavid du Colombier #define xbuf u.ibuf 6740d01547SDavid du Colombier 6840d01547SDavid du Colombier EXTERN int cbc; 6940d01547SDavid du Colombier EXTERN uchar* cbp; 7040d01547SDavid du Colombier EXTERN int cout; 7140d01547SDavid du Colombier EXTERN char debug[128]; 7240d01547SDavid du Colombier EXTERN char fnuxi4[4]; 7340d01547SDavid du Colombier EXTERN char fnuxi8[8]; 7440d01547SDavid du Colombier EXTERN Sym* hash[NHASH]; 7540d01547SDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 7640d01547SDavid du Colombier EXTERN int histfrogp; 7740d01547SDavid du Colombier EXTERN int histgen; 7840d01547SDavid du Colombier EXTERN char* library[50]; 7940d01547SDavid du Colombier EXTERN char* libraryobj[50]; 8040d01547SDavid du Colombier EXTERN int libraryp; 8140d01547SDavid du Colombier EXTERN int xrefresolv; 8240d01547SDavid du Colombier EXTERN char inuxi1[1]; 8340d01547SDavid du Colombier EXTERN char inuxi2[2]; 8440d01547SDavid du Colombier EXTERN char inuxi4[4]; 8540d01547SDavid du Colombier EXTERN uchar inuxi8[8]; 8640d01547SDavid du Colombier EXTERN char* thestring; 8740d01547SDavid du Colombier EXTERN char thechar; 8840d01547SDavid du Colombier 8940d01547SDavid du Colombier EXTERN int doexp, dlm; 9040d01547SDavid du Colombier EXTERN int imports, nimports; 9140d01547SDavid du Colombier EXTERN int exports, nexports; 9240d01547SDavid du Colombier EXTERN char* EXPTAB; 9340d01547SDavid du Colombier EXTERN Prog undefp; 9440d01547SDavid du Colombier 9540d01547SDavid du Colombier #define UP (&undefp) 9640d01547SDavid du Colombier 9740d01547SDavid du Colombier int Sconv(Fmt*); 9840d01547SDavid du Colombier void addhist(long, int); 9940d01547SDavid du Colombier void addlib(char*); 10040d01547SDavid du Colombier void addlibpath(char*); 10140d01547SDavid du Colombier void addlibroot(void); 10240d01547SDavid du Colombier vlong atolwhex(char*); 10340d01547SDavid du Colombier Prog* brchain(Prog*); 10440d01547SDavid du Colombier Prog* brloop(Prog*); 10540d01547SDavid du Colombier void cflush(void); 10640d01547SDavid du Colombier void ckoff(Sym*, long); 10740d01547SDavid du Colombier void collapsefrog(Sym*); 10840d01547SDavid du Colombier void cput(int); 10940d01547SDavid du Colombier void diag(char*, ...); 11040d01547SDavid du Colombier void errorexit(void); 11140d01547SDavid du Colombier double cputime(void); 11240d01547SDavid du Colombier void dodata(void); 11340d01547SDavid du Colombier void export(void); 11440d01547SDavid du Colombier int fileexists(char*); 11540d01547SDavid du Colombier int find1(long, int); 11640d01547SDavid du Colombier char* findlib(char*); 11740d01547SDavid du Colombier char* findlib(char*); 11840d01547SDavid du Colombier void follow(void); 11940d01547SDavid du Colombier void gethunk(void); 12040d01547SDavid du Colombier long hunkspace(void); 12140d01547SDavid du Colombier uchar* readsome(int, uchar*, uchar*, uchar*, int); 12240d01547SDavid du Colombier void* halloc(usize); 12340d01547SDavid du Colombier void histtoauto(void); 12440d01547SDavid du Colombier double ieeedtod(Ieee*); 12540d01547SDavid du Colombier long ieeedtof(Ieee*); 12640d01547SDavid du Colombier void import(void); 12740d01547SDavid du Colombier int isobjfile(char*); 12840d01547SDavid du Colombier void loadlib(void); 12940d01547SDavid du Colombier Sym* lookup(char*, int); 13040d01547SDavid du Colombier void mkfwd(void); 13140d01547SDavid du Colombier void* mysbrk(ulong); 13240d01547SDavid du Colombier void nopstat(char*, Count*); 13340d01547SDavid du Colombier void objfile(char*); 13440d01547SDavid du Colombier void patch(void); 13540d01547SDavid du Colombier void prasm(Prog*); 13640d01547SDavid du Colombier Prog* prg(void); 13740d01547SDavid du Colombier void readundefs(char*, int); 13840d01547SDavid du Colombier uchar* readsome(int, uchar*, uchar*, uchar*, int); 13940d01547SDavid du Colombier void readundefs(char*, int); 14040d01547SDavid du Colombier vlong rnd(vlong, long); 14140d01547SDavid du Colombier void strnput(char*, int); 14240d01547SDavid du Colombier void undef(void); 14340d01547SDavid du Colombier void undefsym(Sym*); 14440d01547SDavid du Colombier void xdefine(char*, int, vlong); 14540d01547SDavid du Colombier void xfol(Prog*); 14640d01547SDavid du Colombier void zerosig(char*); 14740d01547SDavid du Colombier 14840d01547SDavid du Colombier #pragma varargck type "A" int 14940d01547SDavid du Colombier #pragma varargck type "A" uint 15040d01547SDavid du Colombier #pragma varargck type "C" int 15140d01547SDavid du Colombier #pragma varargck type "D" Adr* 15240d01547SDavid du Colombier #pragma varargck type "N" Adr* 15340d01547SDavid du Colombier #pragma varargck type "P" Prog* 15440d01547SDavid du Colombier #pragma varargck type "S" char* 15540d01547SDavid du Colombier 15640d01547SDavid du Colombier #pragma varargck argpos diag 1 157