125210b06SDavid du Colombier typedef struct BIOS32si BIOS32si; 225210b06SDavid du Colombier typedef struct BIOS32ci BIOS32ci; 325210b06SDavid du Colombier typedef struct Conf Conf; 425210b06SDavid du Colombier typedef struct Confmem Confmem; 525210b06SDavid du Colombier typedef struct FPsave FPsave; 625210b06SDavid du Colombier typedef struct ISAConf ISAConf; 725210b06SDavid du Colombier typedef struct Label Label; 825210b06SDavid du Colombier typedef struct Lock Lock; 925210b06SDavid du Colombier typedef struct MMU MMU; 1025210b06SDavid du Colombier typedef struct Mach Mach; 1125210b06SDavid du Colombier typedef struct PCArch PCArch; 1225210b06SDavid du Colombier typedef struct Pcidev Pcidev; 1325210b06SDavid du Colombier typedef struct PCMmap PCMmap; 1425210b06SDavid du Colombier typedef struct PCMslot PCMslot; 1525210b06SDavid du Colombier typedef struct Page Page; 1625210b06SDavid du Colombier typedef struct PMMU PMMU; 1725210b06SDavid du Colombier typedef struct Proc Proc; 1825210b06SDavid du Colombier typedef struct Segdesc Segdesc; 1925210b06SDavid du Colombier typedef vlong Tval; 2025210b06SDavid du Colombier typedef struct Ureg Ureg; 2125210b06SDavid du Colombier typedef struct Vctl Vctl; 2225210b06SDavid du Colombier 2325210b06SDavid du Colombier #pragma incomplete BIOS32si 2425210b06SDavid du Colombier #pragma incomplete Pcidev 2525210b06SDavid du Colombier #pragma incomplete Ureg 2625210b06SDavid du Colombier 2725210b06SDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */ 2825210b06SDavid du Colombier 2925210b06SDavid du Colombier /* 3025210b06SDavid du Colombier * Where configuration info is left for the loaded programme. 3125210b06SDavid du Colombier * There are 3584 bytes available at CONFADDR. 3225210b06SDavid du Colombier */ 3325210b06SDavid du Colombier #define BOOTLINE ((char*)CONFADDR) 3425210b06SDavid du Colombier #define BOOTLINELEN 64 3525210b06SDavid du Colombier #define BOOTARGS ((char*)(CONFADDR+BOOTLINELEN)) 3625210b06SDavid du Colombier #define BOOTARGSLEN (3584-0x200-BOOTLINELEN) 3725210b06SDavid du Colombier #define MAXCONF 100 3825210b06SDavid du Colombier 39e4575fb1SDavid du Colombier enum { 40e4575fb1SDavid du Colombier Promptsecs = 60, 41e4575fb1SDavid du Colombier }; 42e4575fb1SDavid du Colombier 4325210b06SDavid du Colombier char *confname[MAXCONF]; 4425210b06SDavid du Colombier char *confval[MAXCONF]; 4525210b06SDavid du Colombier int nconf; 4625210b06SDavid du Colombier 4725210b06SDavid du Colombier #define KMESGSIZE 64 4825210b06SDavid du Colombier #define PCICONSSIZE 64 4925210b06SDavid du Colombier #define STAGESIZE 64 5025210b06SDavid du Colombier 5125210b06SDavid du Colombier #define NAMELEN 28 5225210b06SDavid du Colombier 5325210b06SDavid du Colombier #define GSHORT(p) (((p)[1]<<8)|(p)[0]) 5425210b06SDavid du Colombier #define GLSHORT(p) (((p)[0]<<8)|(p)[1]) 5562579e34SDavid du Colombier 5662579e34SDavid du Colombier #define GLONG(p) ((GSHORT(p+2)<<16)|GSHORT(p)) 5725210b06SDavid du Colombier #define GLLONG(p) (((ulong)GLSHORT(p)<<16)|GLSHORT(p+2)) 5825210b06SDavid du Colombier #define PLLONG(p,v) (p)[3]=(v);(p)[2]=(v)>>8;(p)[1]=(v)>>16;(p)[0]=(v)>>24 5925210b06SDavid du Colombier 6062579e34SDavid du Colombier #define PLVLONG(p,v) (p)[7]=(v);(p)[6]=(v)>>8;(p)[5]=(v)>>16;(p)[4]=(v)>>24;\ 6162579e34SDavid du Colombier (p)[3]=(v)>>32; (p)[2]=(v)>>40;\ 6262579e34SDavid du Colombier (p)[1]=(v)>>48; (p)[0]=(v)>>56; 6362579e34SDavid du Colombier 6425210b06SDavid du Colombier enum { 6525210b06SDavid du Colombier Stkpat = 0, 6625210b06SDavid du Colombier }; 6725210b06SDavid du Colombier 6825210b06SDavid du Colombier /* 6925210b06SDavid du Colombier * parameters for sysproc.c 7025210b06SDavid du Colombier */ 7125210b06SDavid du Colombier #define AOUT_MAGIC (I_MAGIC) 7225210b06SDavid du Colombier 7325210b06SDavid du Colombier struct Lock 7425210b06SDavid du Colombier { 7525210b06SDavid du Colombier ulong magic; 7625210b06SDavid du Colombier ulong key; 7725210b06SDavid du Colombier ulong sr; 7825210b06SDavid du Colombier ulong pc; 7925210b06SDavid du Colombier Proc *p; 8025210b06SDavid du Colombier Mach *m; 8125210b06SDavid du Colombier ushort isilock; 8225210b06SDavid du Colombier long lockcycles; 8325210b06SDavid du Colombier }; 8425210b06SDavid du Colombier 8525210b06SDavid du Colombier struct Label 8625210b06SDavid du Colombier { 8725210b06SDavid du Colombier ulong sp; 8825210b06SDavid du Colombier ulong pc; 8925210b06SDavid du Colombier }; 9025210b06SDavid du Colombier 9125210b06SDavid du Colombier 9225210b06SDavid du Colombier /* 9325210b06SDavid du Colombier * FPsave.status 9425210b06SDavid du Colombier */ 9525210b06SDavid du Colombier enum 9625210b06SDavid du Colombier { 9725210b06SDavid du Colombier /* this is a state */ 9825210b06SDavid du Colombier FPinit= 0, 9925210b06SDavid du Colombier FPactive= 1, 10025210b06SDavid du Colombier FPinactive= 2, 10125210b06SDavid du Colombier 10225210b06SDavid du Colombier /* the following is a bit that can be or'd into the state */ 10325210b06SDavid du Colombier FPillegal= 0x100, 10425210b06SDavid du Colombier }; 10525210b06SDavid du Colombier 10625210b06SDavid du Colombier struct FPsave 10725210b06SDavid du Colombier { 10825210b06SDavid du Colombier ushort control; 10925210b06SDavid du Colombier ushort r1; 11025210b06SDavid du Colombier ushort status; 11125210b06SDavid du Colombier ushort r2; 11225210b06SDavid du Colombier ushort tag; 11325210b06SDavid du Colombier ushort r3; 11425210b06SDavid du Colombier ulong pc; 11525210b06SDavid du Colombier ushort selector; 11625210b06SDavid du Colombier ushort r4; 11725210b06SDavid du Colombier ulong operand; 11825210b06SDavid du Colombier ushort oselector; 11925210b06SDavid du Colombier ushort r5; 12025210b06SDavid du Colombier uchar regs[80]; /* floating point registers */ 12125210b06SDavid du Colombier }; 12225210b06SDavid du Colombier 12325210b06SDavid du Colombier struct Confmem 12425210b06SDavid du Colombier { 12525210b06SDavid du Colombier ulong base; 12625210b06SDavid du Colombier ulong npage; 12725210b06SDavid du Colombier ulong kbase; 12825210b06SDavid du Colombier ulong klimit; 12925210b06SDavid du Colombier }; 13025210b06SDavid du Colombier 13125210b06SDavid du Colombier struct Conf 13225210b06SDavid du Colombier { 13325210b06SDavid du Colombier ulong nmach; /* processors */ 13425210b06SDavid du Colombier ulong nproc; /* processes */ 13525210b06SDavid du Colombier ulong monitor; /* has monitor? */ 13625210b06SDavid du Colombier Confmem mem[4]; /* physical memory */ 13725210b06SDavid du Colombier ulong npage; /* total physical pages of memory */ 13825210b06SDavid du Colombier ulong upages; /* user page pool */ 13925210b06SDavid du Colombier ulong nimage; /* number of page cache image headers */ 14025210b06SDavid du Colombier ulong nswap; /* number of swap pages */ 14125210b06SDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 14225210b06SDavid du Colombier ulong base0; /* base of bank 0 */ 14325210b06SDavid du Colombier ulong base1; /* base of bank 1 */ 14425210b06SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 14525210b06SDavid du Colombier ulong ialloc; /* max interrupt time allocation in bytes */ 14625210b06SDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 14725210b06SDavid du Colombier int nuart; /* number of uart devices */ 14825210b06SDavid du Colombier }; 14925210b06SDavid du Colombier 15025210b06SDavid du Colombier /* 15125210b06SDavid du Colombier * MMU stuff in proc 15225210b06SDavid du Colombier */ 15325210b06SDavid du Colombier #define NCOLOR 1 15425210b06SDavid du Colombier struct PMMU 15525210b06SDavid du Colombier { 15625210b06SDavid du Colombier Page* mmupdb; /* page directory base */ 15725210b06SDavid du Colombier Page* mmufree; /* unused page table pages */ 15825210b06SDavid du Colombier Page* mmuused; /* used page table pages */ 15925210b06SDavid du Colombier Page* kmaptable; /* page table used by kmap */ 16025210b06SDavid du Colombier uint lastkmap; /* last entry used by kmap */ 16125210b06SDavid du Colombier int nkmap; /* number of current kmaps */ 16225210b06SDavid du Colombier }; 16325210b06SDavid du Colombier 16425210b06SDavid du Colombier #include "../port/portdat.h" 16525210b06SDavid du Colombier 16625210b06SDavid du Colombier typedef struct { 16725210b06SDavid du Colombier ulong link; /* link (old TSS selector) */ 16825210b06SDavid du Colombier ulong esp0; /* privilege level 0 stack pointer */ 16925210b06SDavid du Colombier ulong ss0; /* privilege level 0 stack selector */ 17025210b06SDavid du Colombier ulong esp1; /* privilege level 1 stack pointer */ 17125210b06SDavid du Colombier ulong ss1; /* privilege level 1 stack selector */ 17225210b06SDavid du Colombier ulong esp2; /* privilege level 2 stack pointer */ 17325210b06SDavid du Colombier ulong ss2; /* privilege level 2 stack selector */ 17425210b06SDavid du Colombier ulong xcr3; /* page directory base register - not used because we don't use trap gates */ 17525210b06SDavid du Colombier ulong eip; /* instruction pointer */ 17625210b06SDavid du Colombier ulong eflags; /* flags register */ 17725210b06SDavid du Colombier ulong eax; /* general registers */ 17825210b06SDavid du Colombier ulong ecx; 17925210b06SDavid du Colombier ulong edx; 18025210b06SDavid du Colombier ulong ebx; 18125210b06SDavid du Colombier ulong esp; 18225210b06SDavid du Colombier ulong ebp; 18325210b06SDavid du Colombier ulong esi; 18425210b06SDavid du Colombier ulong edi; 18525210b06SDavid du Colombier ulong es; /* segment selectors */ 18625210b06SDavid du Colombier ulong cs; 18725210b06SDavid du Colombier ulong ss; 18825210b06SDavid du Colombier ulong ds; 18925210b06SDavid du Colombier ulong fs; 19025210b06SDavid du Colombier ulong gs; 19125210b06SDavid du Colombier ulong ldt; /* selector for task's LDT */ 19225210b06SDavid du Colombier ulong iomap; /* I/O map base address + T-bit */ 19325210b06SDavid du Colombier } Tss; 19425210b06SDavid du Colombier 19525210b06SDavid du Colombier struct Segdesc 19625210b06SDavid du Colombier { 19725210b06SDavid du Colombier ulong d0; 19825210b06SDavid du Colombier ulong d1; 19925210b06SDavid du Colombier }; 20025210b06SDavid du Colombier 20125210b06SDavid du Colombier struct Mach 20225210b06SDavid du Colombier { 20325210b06SDavid du Colombier int machno; /* physical id of processor (KNOWN TO ASSEMBLY) */ 20425210b06SDavid du Colombier ulong splpc; /* pc of last caller to splhi */ 20525210b06SDavid du Colombier 20625210b06SDavid du Colombier ulong* pdb; /* page directory base for this processor (va) */ 20725210b06SDavid du Colombier Tss* tss; /* tss for this processor */ 20825210b06SDavid du Colombier Segdesc *gdt; /* gdt for this processor */ 20925210b06SDavid du Colombier 21025210b06SDavid du Colombier Proc* proc; /* current process on this processor */ 21125210b06SDavid du Colombier Proc* externup; /* extern register Proc *up */ 21225210b06SDavid du Colombier 21325210b06SDavid du Colombier Page* pdbpool; 21425210b06SDavid du Colombier int pdbcnt; 21525210b06SDavid du Colombier 21625210b06SDavid du Colombier ulong ticks; /* of the clock since boot time */ 21725210b06SDavid du Colombier Label sched; /* scheduler wakeup */ 21825210b06SDavid du Colombier Lock alarmlock; /* access to alarm list */ 21925210b06SDavid du Colombier void* alarm; /* alarms bound to this clock */ 22025210b06SDavid du Colombier int inclockintr; 22125210b06SDavid du Colombier 22225210b06SDavid du Colombier Proc* readied; /* for runproc */ 22325210b06SDavid du Colombier ulong schedticks; /* next forced context switch */ 22425210b06SDavid du Colombier 22525210b06SDavid du Colombier int tlbfault; 22625210b06SDavid du Colombier int tlbpurge; 22725210b06SDavid du Colombier int pfault; 22825210b06SDavid du Colombier int cs; 22925210b06SDavid du Colombier int syscall; 23025210b06SDavid du Colombier int load; 23125210b06SDavid du Colombier int intr; 23225210b06SDavid du Colombier int flushmmu; /* make current proc flush it's mmu state */ 23325210b06SDavid du Colombier int ilockdepth; 23425210b06SDavid du Colombier Perf perf; /* performance counters */ 23525210b06SDavid du Colombier 23625210b06SDavid du Colombier ulong spuriousintr; 23725210b06SDavid du Colombier int lastintr; 23825210b06SDavid du Colombier 23925210b06SDavid du Colombier int loopconst; 24025210b06SDavid du Colombier 24125210b06SDavid du Colombier Lock apictimerlock; 24225210b06SDavid du Colombier int cpumhz; 24325210b06SDavid du Colombier uvlong cyclefreq; /* Frequency of user readable cycle counter */ 24425210b06SDavid du Colombier uvlong cpuhz; 24525210b06SDavid du Colombier int cpuidax; 24625210b06SDavid du Colombier int cpuiddx; 24725210b06SDavid du Colombier char cpuidid[16]; 24825210b06SDavid du Colombier char* cpuidtype; 24925210b06SDavid du Colombier int havetsc; 25025210b06SDavid du Colombier int havepge; 25125210b06SDavid du Colombier uvlong tscticks; 25225210b06SDavid du Colombier int pdballoc; 25325210b06SDavid du Colombier int pdbfree; 25425210b06SDavid du Colombier 25525210b06SDavid du Colombier vlong mtrrcap; 25625210b06SDavid du Colombier vlong mtrrdef; 25725210b06SDavid du Colombier vlong mtrrfix[11]; 25825210b06SDavid du Colombier vlong mtrrvar[32]; /* 256 max. */ 25925210b06SDavid du Colombier 26025210b06SDavid du Colombier int stack[1]; 26125210b06SDavid du Colombier }; 26225210b06SDavid du Colombier 26325210b06SDavid du Colombier /* 26425210b06SDavid du Colombier * KMap the structure doesn't exist, but the functions do. 26525210b06SDavid du Colombier */ 26625210b06SDavid du Colombier typedef struct KMap KMap; 26725210b06SDavid du Colombier #define VA(k) ((void*)(k)) 26825210b06SDavid du Colombier KMap* kmap(Page*); 26925210b06SDavid du Colombier void kunmap(KMap*); 27025210b06SDavid du Colombier 27125210b06SDavid du Colombier struct 27225210b06SDavid du Colombier { 27325210b06SDavid du Colombier Lock; 27425210b06SDavid du Colombier int machs; /* bitmap of active CPUs */ 27525210b06SDavid du Colombier int exiting; /* shutdown */ 27625210b06SDavid du Colombier int ispanic; /* shutdown in response to a panic */ 27725210b06SDavid du Colombier int thunderbirdsarego; /* lets the added processors continue to schedinit */ 27825210b06SDavid du Colombier int rebooting; /* just idle cpus > 0 */ 27925210b06SDavid du Colombier }active; 28025210b06SDavid du Colombier 28125210b06SDavid du Colombier /* 28225210b06SDavid du Colombier * routines for things outside the PC model, like power management 28325210b06SDavid du Colombier */ 28425210b06SDavid du Colombier struct PCArch 28525210b06SDavid du Colombier { 28625210b06SDavid du Colombier char* id; 28725210b06SDavid du Colombier int (*ident)(void); /* this should be in the model */ 28825210b06SDavid du Colombier void (*reset)(void); /* this should be in the model */ 28925210b06SDavid du Colombier int (*serialpower)(int); /* 1 == on, 0 == off */ 29025210b06SDavid du Colombier int (*modempower)(int); /* 1 == on, 0 == off */ 29125210b06SDavid du Colombier 29225210b06SDavid du Colombier void (*intrinit)(void); 29325210b06SDavid du Colombier int (*intrenable)(Vctl*); 29425210b06SDavid du Colombier int (*intrvecno)(int); 29525210b06SDavid du Colombier int (*intrdisable)(int); 29625210b06SDavid du Colombier void (*introff)(void); 29725210b06SDavid du Colombier void (*intron)(void); 29825210b06SDavid du Colombier 29925210b06SDavid du Colombier void (*clockenable)(void); 30025210b06SDavid du Colombier uvlong (*fastclock)(uvlong*); 30125210b06SDavid du Colombier void (*timerset)(uvlong); 30225210b06SDavid du Colombier 30325210b06SDavid du Colombier void (*resetothers)(void); /* put other cpus into reset */ 30425210b06SDavid du Colombier }; 30525210b06SDavid du Colombier 30625210b06SDavid du Colombier /* cpuid instruction result register bits */ 30725210b06SDavid du Colombier enum { 30825210b06SDavid du Colombier /* dx */ 30925210b06SDavid du Colombier Fpuonchip = 1<<0, 310c9834a71SDavid du Colombier Pse = 1<<3, /* page size extensions */ 31125210b06SDavid du Colombier Tsc = 1<<4, /* time-stamp counter */ 31225210b06SDavid du Colombier Cpumsr = 1<<5, /* model-specific registers, rdmsr/wrmsr */ 31325210b06SDavid du Colombier Pae = 1<<6, /* physical-addr extensions */ 31425210b06SDavid du Colombier Mce = 1<<7, /* machine-check exception */ 31525210b06SDavid du Colombier Cmpxchg8b = 1<<8, 31625210b06SDavid du Colombier Cpuapic = 1<<9, 31725210b06SDavid du Colombier Mtrr = 1<<12, /* memory-type range regs. */ 31825210b06SDavid du Colombier Pge = 1<<13, /* page global extension */ 319c9834a71SDavid du Colombier Pse2 = 1<<17, /* more page size extensions */ 32025210b06SDavid du Colombier Clflush = 1<<19, 321*48489f93SDavid du Colombier Acpif = 1<<22, 32225210b06SDavid du Colombier Mmx = 1<<23, 32325210b06SDavid du Colombier Fxsr = 1<<24, /* have SSE FXSAVE/FXRSTOR */ 32425210b06SDavid du Colombier Sse = 1<<25, /* thus sfence instr. */ 32525210b06SDavid du Colombier Sse2 = 1<<26, /* thus mfence & lfence instr.s */ 32625210b06SDavid du Colombier }; 32725210b06SDavid du Colombier 32825210b06SDavid du Colombier /* 32925210b06SDavid du Colombier * a parsed plan9.ini line 33025210b06SDavid du Colombier */ 33125210b06SDavid du Colombier #define NISAOPT 8 33225210b06SDavid du Colombier 33325210b06SDavid du Colombier struct ISAConf { 33425210b06SDavid du Colombier char *type; 33525210b06SDavid du Colombier ulong port; 33625210b06SDavid du Colombier int irq; 33725210b06SDavid du Colombier ulong dma; 33825210b06SDavid du Colombier ulong mem; 33925210b06SDavid du Colombier ulong size; 34025210b06SDavid du Colombier ulong freq; 34125210b06SDavid du Colombier 34225210b06SDavid du Colombier int nopt; 34325210b06SDavid du Colombier char *opt[NISAOPT]; 34425210b06SDavid du Colombier }; 34525210b06SDavid du Colombier 34625210b06SDavid du Colombier extern PCArch *arch; /* PC architecture */ 34725210b06SDavid du Colombier 34825210b06SDavid du Colombier /* 34925210b06SDavid du Colombier * Each processor sees its own Mach structure at address MACHADDR. 35025210b06SDavid du Colombier * However, the Mach structures must also be available via the per-processor 35125210b06SDavid du Colombier * MMU information array machp, mainly for disambiguation and access to 35225210b06SDavid du Colombier * the clock which is only maintained by the bootstrap processor (0). 35325210b06SDavid du Colombier */ 35425210b06SDavid du Colombier Mach* machp[MAXMACH]; 35525210b06SDavid du Colombier 35625210b06SDavid du Colombier #define MACHP(n) (machp[n]) 35725210b06SDavid du Colombier 35825210b06SDavid du Colombier extern Mach *m; 35925210b06SDavid du Colombier #define up (((Mach*)MACHADDR)->externup) 36025210b06SDavid du Colombier 36125210b06SDavid du Colombier /* 36225210b06SDavid du Colombier * hardware info about a device 36325210b06SDavid du Colombier */ 36425210b06SDavid du Colombier typedef struct { 36525210b06SDavid du Colombier ulong port; 36625210b06SDavid du Colombier int size; 36725210b06SDavid du Colombier } Devport; 36825210b06SDavid du Colombier 36925210b06SDavid du Colombier struct DevConf 37025210b06SDavid du Colombier { 37125210b06SDavid du Colombier ulong intnum; /* interrupt number */ 37225210b06SDavid du Colombier char *type; /* card type, malloced */ 37325210b06SDavid du Colombier int nports; /* Number of ports */ 37425210b06SDavid du Colombier Devport *ports; /* The ports themselves */ 37525210b06SDavid du Colombier }; 37625210b06SDavid du Colombier 37725210b06SDavid du Colombier typedef struct BIOS32ci { /* BIOS32 Calling Interface */ 37825210b06SDavid du Colombier u32int eax; 37925210b06SDavid du Colombier u32int ebx; 38025210b06SDavid du Colombier u32int ecx; 38125210b06SDavid du Colombier u32int edx; 38225210b06SDavid du Colombier u32int esi; 38325210b06SDavid du Colombier u32int edi; 38425210b06SDavid du Colombier } BIOS32ci; 38525210b06SDavid du Colombier 38625210b06SDavid du Colombier /* misc. */ 38725210b06SDavid du Colombier extern int v_flag; 38825210b06SDavid du Colombier 38925210b06SDavid du Colombier /* APM goo */ 39025210b06SDavid du Colombier typedef struct Apminfo { 39125210b06SDavid du Colombier int haveinfo; 39225210b06SDavid du Colombier int ax; 39325210b06SDavid du Colombier int cx; 39425210b06SDavid du Colombier int dx; 39525210b06SDavid du Colombier int di; 39625210b06SDavid du Colombier int ebx; 39725210b06SDavid du Colombier int esi; 39825210b06SDavid du Colombier } Apminfo; 39925210b06SDavid du Colombier extern Apminfo apm; 40025210b06SDavid du Colombier 40125210b06SDavid du Colombier /* 40225210b06SDavid du Colombier * Multiboot grot. 40325210b06SDavid du Colombier */ 40425210b06SDavid du Colombier typedef struct Mbi Mbi; 40525210b06SDavid du Colombier struct Mbi { 40625210b06SDavid du Colombier u32int flags; 40725210b06SDavid du Colombier u32int memlower; 40825210b06SDavid du Colombier u32int memupper; 40925210b06SDavid du Colombier u32int bootdevice; 41025210b06SDavid du Colombier u32int cmdline; 41125210b06SDavid du Colombier u32int modscount; 41225210b06SDavid du Colombier u32int modsaddr; 41325210b06SDavid du Colombier u32int syms[4]; 41425210b06SDavid du Colombier u32int mmaplength; 41525210b06SDavid du Colombier u32int mmapaddr; 41625210b06SDavid du Colombier u32int driveslength; 41725210b06SDavid du Colombier u32int drivesaddr; 41825210b06SDavid du Colombier u32int configtable; 41925210b06SDavid du Colombier u32int bootloadername; 42025210b06SDavid du Colombier u32int apmtable; 42125210b06SDavid du Colombier u32int vbe[6]; 42225210b06SDavid du Colombier }; 42325210b06SDavid du Colombier 42425210b06SDavid du Colombier enum { /* flags */ 42525210b06SDavid du Colombier Fmem = 0x00000001, /* mem* valid */ 42625210b06SDavid du Colombier Fbootdevice = 0x00000002, /* bootdevice valid */ 42725210b06SDavid du Colombier Fcmdline = 0x00000004, /* cmdline valid */ 42825210b06SDavid du Colombier Fmods = 0x00000008, /* mod* valid */ 42925210b06SDavid du Colombier Fsyms = 0x00000010, /* syms[] has a.out info */ 43025210b06SDavid du Colombier Felf = 0x00000020, /* syms[] has ELF info */ 43125210b06SDavid du Colombier Fmmap = 0x00000040, /* mmap* valid */ 43225210b06SDavid du Colombier Fdrives = 0x00000080, /* drives* valid */ 43325210b06SDavid du Colombier Fconfigtable = 0x00000100, /* configtable* valid */ 43425210b06SDavid du Colombier Fbootloadername = 0x00000200, /* bootloadername* valid */ 43525210b06SDavid du Colombier Fapmtable = 0x00000400, /* apmtable* valid */ 43625210b06SDavid du Colombier Fvbe = 0x00000800, /* vbe[] valid */ 43725210b06SDavid du Colombier }; 43825210b06SDavid du Colombier 43925210b06SDavid du Colombier typedef struct Mod Mod; 44025210b06SDavid du Colombier struct Mod { 44125210b06SDavid du Colombier u32int modstart; 44225210b06SDavid du Colombier u32int modend; 44325210b06SDavid du Colombier u32int string; 44425210b06SDavid du Colombier u32int reserved; 44525210b06SDavid du Colombier }; 44625210b06SDavid du Colombier 44725210b06SDavid du Colombier typedef struct MMap MMap; 44825210b06SDavid du Colombier struct MMap { 44925210b06SDavid du Colombier u32int size; 45025210b06SDavid du Colombier u32int base[2]; 45125210b06SDavid du Colombier u32int length[2]; 45225210b06SDavid du Colombier u32int type; 45325210b06SDavid du Colombier }; 45425210b06SDavid du Colombier 45525210b06SDavid du Colombier MMap mmap[32+1]; 45625210b06SDavid du Colombier int nmmap; 45725210b06SDavid du Colombier 45825210b06SDavid du Colombier Mbi *multibootheader; 45925210b06SDavid du Colombier 46025210b06SDavid du Colombier enum { 46125210b06SDavid du Colombier Maxfile = 4096, 46225210b06SDavid du Colombier }; 46325210b06SDavid du Colombier 46425210b06SDavid du Colombier /* from 9load */ 46525210b06SDavid du Colombier 46625210b06SDavid du Colombier enum { /* returned by bootpass */ 46725210b06SDavid du Colombier MORE, ENOUGH, FAIL 46825210b06SDavid du Colombier }; 46925210b06SDavid du Colombier enum { 47025210b06SDavid du Colombier INITKERNEL, 47125210b06SDavid du Colombier READEXEC, 47225210b06SDavid du Colombier READ9TEXT, 47325210b06SDavid du Colombier READ9DATA, 47425210b06SDavid du Colombier READGZIP, 47562579e34SDavid du Colombier READEHDR, /* elf states ... */ 47625210b06SDavid du Colombier READPHDR, 47725210b06SDavid du Colombier READEPAD, 47862579e34SDavid du Colombier READEDATA, /* through here */ 47962579e34SDavid du Colombier READE64HDR, /* elf64 states ... */ 48062579e34SDavid du Colombier READ64PHDR, 48162579e34SDavid du Colombier READE64PAD, 48262579e34SDavid du Colombier READE64DATA, /* through here */ 48325210b06SDavid du Colombier TRYBOOT, 48462579e34SDavid du Colombier TRYEBOOT, /* another elf state */ 48562579e34SDavid du Colombier TRYE64BOOT, /* another elf state */ 48625210b06SDavid du Colombier INIT9LOAD, 48725210b06SDavid du Colombier READ9LOAD, 48825210b06SDavid du Colombier FAILED 48925210b06SDavid du Colombier }; 49025210b06SDavid du Colombier 49125210b06SDavid du Colombier typedef struct Execbytes Execbytes; 49225210b06SDavid du Colombier struct Execbytes 49325210b06SDavid du Colombier { 49425210b06SDavid du Colombier uchar magic[4]; /* magic number */ 49525210b06SDavid du Colombier uchar text[4]; /* size of text segment */ 49625210b06SDavid du Colombier uchar data[4]; /* size of initialized data */ 49725210b06SDavid du Colombier uchar bss[4]; /* size of uninitialized data */ 49825210b06SDavid du Colombier uchar syms[4]; /* size of symbol table */ 49925210b06SDavid du Colombier uchar entry[4]; /* entry point */ 50025210b06SDavid du Colombier uchar spsz[4]; /* size of sp/pc offset table */ 50125210b06SDavid du Colombier uchar pcsz[4]; /* size of pc/line number table */ 50225210b06SDavid du Colombier }; 50325210b06SDavid du Colombier 50425210b06SDavid du Colombier typedef struct { 50525210b06SDavid du Colombier Execbytes; 50625210b06SDavid du Colombier uvlong uvl[1]; 50725210b06SDavid du Colombier } Exechdr; 50825210b06SDavid du Colombier 50925210b06SDavid du Colombier typedef struct Boot Boot; 51025210b06SDavid du Colombier struct Boot { 51125210b06SDavid du Colombier int state; 51225210b06SDavid du Colombier 51325210b06SDavid du Colombier Exechdr hdr; 51462579e34SDavid du Colombier uvlong entry; 51525210b06SDavid du Colombier 51625210b06SDavid du Colombier char *bp; /* base ptr */ 51725210b06SDavid du Colombier char *wp; /* write ptr */ 51825210b06SDavid du Colombier char *ep; /* end ptr */ 51925210b06SDavid du Colombier }; 52025210b06SDavid du Colombier 52125210b06SDavid du Colombier extern int debugload; 52225210b06SDavid du Colombier extern Apminfo apm; 523c1e5ebd3SDavid du Colombier extern Chan *conschan; 52425210b06SDavid du Colombier extern char *defaultpartition; 52525210b06SDavid du Colombier extern int iniread; 52625210b06SDavid du Colombier extern u32int memstart; 52725210b06SDavid du Colombier extern u32int memend; 52825210b06SDavid du Colombier extern int noclock; 52925210b06SDavid du Colombier extern int pxe; 53025210b06SDavid du Colombier extern int vga; 53125210b06SDavid du Colombier 53225210b06SDavid du Colombier extern int biosinited; 53325210b06SDavid du Colombier 53425210b06SDavid du Colombier extern void _KTZERO(void); 53525210b06SDavid du Colombier #define KTZERO ((uintptr)_KTZERO) 536