1*da917039SDavid du Colombier enum { 2*da917039SDavid du Colombier PRINTSIZE = 256, 3*da917039SDavid du Colombier }; 4*da917039SDavid du Colombier 5*da917039SDavid du Colombier #define MS2NS(n) (((vlong)(n))*1000000LL) 6*da917039SDavid du Colombier #define TK2MS(x) ((x)*(1000/HZ)) 7*da917039SDavid du Colombier 8*da917039SDavid du Colombier #define MB (1024*1024) 9*da917039SDavid du Colombier 10*da917039SDavid du Colombier /* 11*da917039SDavid du Colombier * Where configuration info is left for the loaded programme. 12*da917039SDavid du Colombier * This will turn into a structure as more is done by the boot loader 13*da917039SDavid du Colombier * (e.g. why parse the .ini file twice?). 14*da917039SDavid du Colombier * There are 3584 bytes available at CONFADDR on the PC. 15*da917039SDavid du Colombier * 16*da917039SDavid du Colombier * The low-level boot routines in l.s leave data for us at CONFADDR, 17*da917039SDavid du Colombier * which we pick up before reading the plan9.ini file. 18*da917039SDavid du Colombier */ 19*da917039SDavid du Colombier #define BOOTLINELEN 64 20*da917039SDavid du Colombier #define BOOTARGS ((char*)(CONFADDR+BOOTLINELEN)) 21*da917039SDavid du Colombier #define BOOTARGSLEN 1024 /* size reduction */ 22*da917039SDavid du Colombier #define MAXCONF 15 /* from 100; size reduction */ 23*da917039SDavid du Colombier 24*da917039SDavid du Colombier /* 25*da917039SDavid du Colombier * intc bits, as of 18 aug 2009. 26*da917039SDavid du Colombier * specific to rae's virtex4 design 27*da917039SDavid du Colombier * vanilla design defines Intuarttx. 28*da917039SDavid du Colombier */ 29*da917039SDavid du Colombier enum { 30*da917039SDavid du Colombier Bitllfifo, 31*da917039SDavid du Colombier Bittemac, 32*da917039SDavid du Colombier Bitdma, 33*da917039SDavid du Colombier Bitdma2, 34*da917039SDavid du Colombier Bituart, 35*da917039SDavid du Colombier Bitmiiphy, 36*da917039SDavid du Colombier Bitqtmmacfail, /* qtm only */ 37*da917039SDavid du Colombier Bitqtmdraminit, /* qtm only */ 38*da917039SDavid du Colombier 39*da917039SDavid du Colombier Intllfifo=1<<Bitllfifo, /* local-link FIFO */ 40*da917039SDavid du Colombier Inttemac= 1<<Bittemac, 41*da917039SDavid du Colombier Intdma = 1<<Bitdma, 42*da917039SDavid du Colombier Intdma2 = 1<<Bitdma2, 43*da917039SDavid du Colombier Intuart = 1<<Bituart, 44*da917039SDavid du Colombier Intmiiphy = 1<<Bitmiiphy, 45*da917039SDavid du Colombier Intqtmmacfail= 1<<Bitqtmmacfail, 46*da917039SDavid du Colombier Intqtmdraminit= 1<<Bitqtmdraminit, 47*da917039SDavid du Colombier }; 48*da917039SDavid du Colombier 49*da917039SDavid du Colombier typedef struct Boot Boot; 50*da917039SDavid du Colombier typedef struct File File; 51*da917039SDavid du Colombier typedef struct Fs Fs; 52*da917039SDavid du Colombier typedef struct Lock Lock; 53*da917039SDavid du Colombier typedef union Mach Mach; 54*da917039SDavid du Colombier typedef struct Medium Medium; 55*da917039SDavid du Colombier typedef u32int Mreg; /* Msr - bloody UART */ 56*da917039SDavid du Colombier typedef struct Proc Proc; 57*da917039SDavid du Colombier typedef struct Timer Timer; 58*da917039SDavid du Colombier typedef struct Type Type; 59*da917039SDavid du Colombier typedef struct Ureg Ureg; 60*da917039SDavid du Colombier 61*da917039SDavid du Colombier struct Lock 62*da917039SDavid du Colombier { 63*da917039SDavid du Colombier uint key; 64*da917039SDavid du Colombier ulong sr; 65*da917039SDavid du Colombier ulong pc; 66*da917039SDavid du Colombier // Proc *p; 67*da917039SDavid du Colombier Mach *m; 68*da917039SDavid du Colombier ushort isilock; 69*da917039SDavid du Colombier long lockcycles; 70*da917039SDavid du Colombier }; 71*da917039SDavid du Colombier 72*da917039SDavid du Colombier 73*da917039SDavid du Colombier typedef union Mach { 74*da917039SDavid du Colombier struct { 75*da917039SDavid du Colombier int machno; 76*da917039SDavid du Colombier void* up; /* offset known in assember */ 77*da917039SDavid du Colombier 78*da917039SDavid du Colombier /* ordering from here on irrelevant */ 79*da917039SDavid du Colombier 80*da917039SDavid du Colombier ulong ticks; /* of the clock since boot time */ 81*da917039SDavid du Colombier long oscclk; /* oscillator frequency (MHz) */ 82*da917039SDavid du Colombier long cpuhz; /* general system clock (cycles) */ 83*da917039SDavid du Colombier long clockgen; /* clock generator frequency (cycles) */ 84*da917039SDavid du Colombier long vcohz; 85*da917039SDavid du Colombier long pllhz; 86*da917039SDavid du Colombier long plbhz; 87*da917039SDavid du Colombier long opbhz; 88*da917039SDavid du Colombier long epbhz; 89*da917039SDavid du Colombier long pcihz; 90*da917039SDavid du Colombier int cputype; 91*da917039SDavid du Colombier ulong delayloop; 92*da917039SDavid du Colombier // uvlong cyclefreq; /* frequency of user readable cycle clock */ 93*da917039SDavid du Colombier uvlong fastclock; 94*da917039SDavid du Colombier int intr; 95*da917039SDavid du Colombier }; 96*da917039SDavid du Colombier // uintptr stack[MACHSIZE/sizeof(uintptr)]; /* now in dram */ 97*da917039SDavid du Colombier } Mach; 98*da917039SDavid du Colombier 99*da917039SDavid du Colombier extern Mach* machptr[MAXMACH]; 100*da917039SDavid du Colombier 101*da917039SDavid du Colombier #define MACHP(n) machptr[n] 102*da917039SDavid du Colombier 103*da917039SDavid du Colombier extern register Mach* m; 104*da917039SDavid du Colombier extern register void* up; 105*da917039SDavid du Colombier 106*da917039SDavid du Colombier /* 107*da917039SDavid du Colombier * rest copied from /sys/src/boot/pc/dat.h: 108*da917039SDavid du Colombier */ 109*da917039SDavid du Colombier 110*da917039SDavid du Colombier typedef struct Medium Medium; 111*da917039SDavid du Colombier typedef struct Boot Boot; 112*da917039SDavid du Colombier 113*da917039SDavid du Colombier enum { /* type */ 114*da917039SDavid du Colombier Tether = 0, 115*da917039SDavid du Colombier Tany = -1, 116*da917039SDavid du Colombier }; 117*da917039SDavid du Colombier 118*da917039SDavid du Colombier enum { /* name and flag */ 119*da917039SDavid du Colombier Fnone = 0x00, 120*da917039SDavid du Colombier 121*da917039SDavid du Colombier Nfs = 0x00, 122*da917039SDavid du Colombier Ffs = (1<<Nfs), 123*da917039SDavid du Colombier Nboot = 0x01, 124*da917039SDavid du Colombier Fboot = (1<<Nboot), 125*da917039SDavid du Colombier Nbootp = 0x02, 126*da917039SDavid du Colombier Fbootp = (1<<Nbootp), 127*da917039SDavid du Colombier NName = 3, 128*da917039SDavid du Colombier 129*da917039SDavid du Colombier Fany = Fbootp|Fboot|Ffs, 130*da917039SDavid du Colombier 131*da917039SDavid du Colombier Fini = 0x10, 132*da917039SDavid du Colombier Fprobe = 0x80, 133*da917039SDavid du Colombier }; 134*da917039SDavid du Colombier 135*da917039SDavid du Colombier typedef struct Type { 136*da917039SDavid du Colombier ushort type; 137*da917039SDavid du Colombier ushort flag; 138*da917039SDavid du Colombier int (*init)(void); 139*da917039SDavid du Colombier void (*initdev)(int, char*); 140*da917039SDavid du Colombier void* (*getfspart)(int, char*, int); /* actually returns Dos* */ 141*da917039SDavid du Colombier void (*addconf)(int); 142*da917039SDavid du Colombier int (*boot)(int, char*, Boot*); 143*da917039SDavid du Colombier void (*printdevs)(int); 144*da917039SDavid du Colombier char** parts; 145*da917039SDavid du Colombier char** inis; 146*da917039SDavid du Colombier int mask; 147*da917039SDavid du Colombier Medium* media; 148*da917039SDavid du Colombier } Type; 149*da917039SDavid du Colombier 150*da917039SDavid du Colombier extern void (*etherdetach)(void); 151*da917039SDavid du Colombier 152*da917039SDavid du Colombier #define _MAGIC(f, b) ((f)|((((4*(b))+0)*(b))+7)) 153*da917039SDavid du Colombier #define Q_MAGIC _MAGIC(0, 21) /* powerpc */ 154*da917039SDavid du Colombier 155*da917039SDavid du Colombier typedef struct Exec Exec; 156*da917039SDavid du Colombier struct Exec 157*da917039SDavid du Colombier { 158*da917039SDavid du Colombier uchar magic[4]; /* magic number */ 159*da917039SDavid du Colombier uchar text[4]; /* size of text segment */ 160*da917039SDavid du Colombier uchar data[4]; /* size of initialized data */ 161*da917039SDavid du Colombier uchar bss[4]; /* size of uninitialized data */ 162*da917039SDavid du Colombier uchar syms[4]; /* size of symbol table */ 163*da917039SDavid du Colombier uchar entry[4]; /* entry point */ 164*da917039SDavid du Colombier uchar spsz[4]; /* size of sp/pc offset table */ 165*da917039SDavid du Colombier uchar pcsz[4]; /* size of pc/line number table */ 166*da917039SDavid du Colombier }; 167*da917039SDavid du Colombier 168*da917039SDavid du Colombier typedef struct Block Block; 169*da917039SDavid du Colombier struct Block { 170*da917039SDavid du Colombier Block* next; 171*da917039SDavid du Colombier uchar* rp; /* first unconsumed byte */ 172*da917039SDavid du Colombier uchar* wp; /* first empty byte */ 173*da917039SDavid du Colombier uchar* lim; /* 1 past the end of the buffer */ 174*da917039SDavid du Colombier uchar* base; /* start of the buffer */ 175*da917039SDavid du Colombier ulong flag; 176*da917039SDavid du Colombier }; 177*da917039SDavid du Colombier #define BLEN(s) ((s)->wp - (s)->rp) 178*da917039SDavid du Colombier 179*da917039SDavid du Colombier enum { 180*da917039SDavid du Colombier Eaddrlen = 6, 181*da917039SDavid du Colombier /* next two exclude 4-byte ether CRC */ 182*da917039SDavid du Colombier ETHERMINTU = 60, /* minimum transmit size */ 183*da917039SDavid du Colombier ETHERMAXTU = 1514, /* maximum transmit size */ 184*da917039SDavid du Colombier ETHERHDRSIZE = 14, /* size of an ethernet header */ 185*da917039SDavid du Colombier 186*da917039SDavid du Colombier MaxEther = 1, /* from 6; size reduction */ 187*da917039SDavid du Colombier }; 188*da917039SDavid du Colombier 189*da917039SDavid du Colombier typedef struct { 190*da917039SDavid du Colombier uchar d[Eaddrlen]; 191*da917039SDavid du Colombier uchar s[Eaddrlen]; 192*da917039SDavid du Colombier uchar type[2]; 193*da917039SDavid du Colombier uchar data[1500]; 194*da917039SDavid du Colombier uchar crc[4]; 195*da917039SDavid du Colombier } Etherpkt; 196*da917039SDavid du Colombier 197*da917039SDavid du Colombier enum { /* returned by bootpass */ 198*da917039SDavid du Colombier MORE, ENOUGH, FAIL 199*da917039SDavid du Colombier }; 200*da917039SDavid du Colombier enum { 201*da917039SDavid du Colombier INITKERNEL, 202*da917039SDavid du Colombier READEXEC, 203*da917039SDavid du Colombier READ9TEXT, 204*da917039SDavid du Colombier READ9DATA, 205*da917039SDavid du Colombier READGZIP, 206*da917039SDavid du Colombier READEHDR, 207*da917039SDavid du Colombier READPHDR, 208*da917039SDavid du Colombier READEPAD, 209*da917039SDavid du Colombier READEDATA, 210*da917039SDavid du Colombier TRYBOOT, 211*da917039SDavid du Colombier INIT9LOAD, 212*da917039SDavid du Colombier READ9LOAD, 213*da917039SDavid du Colombier FAILED 214*da917039SDavid du Colombier }; 215*da917039SDavid du Colombier 216*da917039SDavid du Colombier struct Boot { 217*da917039SDavid du Colombier int state; 218*da917039SDavid du Colombier 219*da917039SDavid du Colombier Exec exec; 220*da917039SDavid du Colombier char *bp; /* base ptr */ 221*da917039SDavid du Colombier char *wp; /* write ptr */ 222*da917039SDavid du Colombier char *ep; /* end ptr */ 223*da917039SDavid du Colombier }; 224*da917039SDavid du Colombier 225*da917039SDavid du Colombier extern uvlong clockintrs; 226*da917039SDavid du Colombier extern int debug; 227*da917039SDavid du Colombier extern char *defaultpartition; 228*da917039SDavid du Colombier extern int iniread; 229*da917039SDavid du Colombier extern uvlong myhz; 230*da917039SDavid du Colombier extern int pxe; 231*da917039SDavid du Colombier extern int securemem; 232*da917039SDavid du Colombier extern int vga; 233