14fafed5dSDavid du Colombier typedef struct BIOS32si BIOS32si; 24fafed5dSDavid du Colombier typedef struct BIOS32ci BIOS32ci; 33e12c5d1SDavid du Colombier typedef struct Conf Conf; 44de34a7eSDavid du Colombier typedef struct Confmem Confmem; 5401314a3SDavid du Colombier typedef union FPsave FPsave; 691e577b2SDavid du Colombier typedef struct FPssestate FPssestate; 791e577b2SDavid du Colombier typedef struct FPstate FPstate; 8219b2ee8SDavid du Colombier typedef struct ISAConf ISAConf; 93e12c5d1SDavid du Colombier typedef struct Label Label; 103e12c5d1SDavid du Colombier typedef struct Lock Lock; 113e12c5d1SDavid du Colombier typedef struct MMU MMU; 123e12c5d1SDavid du Colombier typedef struct Mach Mach; 13bd389b36SDavid du Colombier typedef struct PCArch PCArch; 147dd7cddfSDavid du Colombier typedef struct Pcidev Pcidev; 15219b2ee8SDavid du Colombier typedef struct PCMmap PCMmap; 1680ee5cbfSDavid du Colombier typedef struct PCMslot PCMslot; 173e12c5d1SDavid du Colombier typedef struct Page Page; 183e12c5d1SDavid du Colombier typedef struct PMMU PMMU; 197dd7cddfSDavid du Colombier typedef struct Proc Proc; 203e12c5d1SDavid du Colombier typedef struct Segdesc Segdesc; 214e3613abSDavid du Colombier typedef struct SFPssestate SFPssestate; 22fdc61599SDavid du Colombier typedef vlong Tval; 233e12c5d1SDavid du Colombier typedef struct Ureg Ureg; 247dd7cddfSDavid du Colombier typedef struct Vctl Vctl; 253e12c5d1SDavid du Colombier 264fafed5dSDavid du Colombier #pragma incomplete BIOS32si 27d04cc87cSDavid du Colombier #pragma incomplete Pcidev 2812fd1c83SDavid du Colombier #pragma incomplete Ureg 2912fd1c83SDavid du Colombier 309a747e4fSDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */ 319a747e4fSDavid du Colombier 3285878a71SDavid du Colombier #define KMESGSIZE (256*1024) /* lots, for acpi debugging */ 33cc162d66SDavid du Colombier #define STAGESIZE 2048 3485878a71SDavid du Colombier 353e12c5d1SDavid du Colombier /* 363e12c5d1SDavid du Colombier * parameters for sysproc.c 373e12c5d1SDavid du Colombier */ 387dd7cddfSDavid du Colombier #define AOUT_MAGIC (I_MAGIC) 393e12c5d1SDavid du Colombier 403e12c5d1SDavid du Colombier struct Lock 413e12c5d1SDavid du Colombier { 423e12c5d1SDavid du Colombier ulong key; 43219b2ee8SDavid du Colombier ulong sr; 447dd7cddfSDavid du Colombier ulong pc; 457dd7cddfSDavid du Colombier Proc *p; 464de34a7eSDavid du Colombier Mach *m; 477dd7cddfSDavid du Colombier ushort isilock; 48208510e1SDavid du Colombier long lockcycles; 493e12c5d1SDavid du Colombier }; 503e12c5d1SDavid du Colombier 513e12c5d1SDavid du Colombier struct Label 523e12c5d1SDavid du Colombier { 533e12c5d1SDavid du Colombier ulong sp; 543e12c5d1SDavid du Colombier ulong pc; 553e12c5d1SDavid du Colombier }; 563e12c5d1SDavid du Colombier 573e12c5d1SDavid du Colombier 583e12c5d1SDavid du Colombier /* 593e12c5d1SDavid du Colombier * FPsave.status 603e12c5d1SDavid du Colombier */ 613e12c5d1SDavid du Colombier enum 623e12c5d1SDavid du Colombier { 633ff48bf5SDavid du Colombier /* this is a state */ 643ff48bf5SDavid du Colombier FPinit= 0, 653ff48bf5SDavid du Colombier FPactive= 1, 663ff48bf5SDavid du Colombier FPinactive= 2, 673ff48bf5SDavid du Colombier 683ff48bf5SDavid du Colombier /* the following is a bit that can be or'd into the state */ 693ff48bf5SDavid du Colombier FPillegal= 0x100, 703e12c5d1SDavid du Colombier }; 713e12c5d1SDavid du Colombier 7291e577b2SDavid du Colombier struct FPstate /* x87 fpu state */ 733e12c5d1SDavid du Colombier { 743e12c5d1SDavid du Colombier ushort control; 753e12c5d1SDavid du Colombier ushort r1; 763e12c5d1SDavid du Colombier ushort status; 773e12c5d1SDavid du Colombier ushort r2; 783e12c5d1SDavid du Colombier ushort tag; 793e12c5d1SDavid du Colombier ushort r3; 803e12c5d1SDavid du Colombier ulong pc; 813e12c5d1SDavid du Colombier ushort selector; 823e12c5d1SDavid du Colombier ushort r4; 833e12c5d1SDavid du Colombier ulong operand; 843e12c5d1SDavid du Colombier ushort oselector; 853e12c5d1SDavid du Colombier ushort r5; 863e12c5d1SDavid du Colombier uchar regs[80]; /* floating point registers */ 873e12c5d1SDavid du Colombier }; 883e12c5d1SDavid du Colombier 8991e577b2SDavid du Colombier struct FPssestate /* SSE fp state */ 9091e577b2SDavid du Colombier { 9191e577b2SDavid du Colombier ushort fcw; /* control */ 9291e577b2SDavid du Colombier ushort fsw; /* status */ 9391e577b2SDavid du Colombier ushort ftw; /* tag */ 9491e577b2SDavid du Colombier ushort fop; /* opcode */ 9591e577b2SDavid du Colombier ulong fpuip; /* pc */ 9691e577b2SDavid du Colombier ushort cs; /* pc segment */ 9791e577b2SDavid du Colombier ushort r1; /* reserved */ 9891e577b2SDavid du Colombier ulong fpudp; /* data pointer */ 9991e577b2SDavid du Colombier ushort ds; /* data pointer segment */ 10091e577b2SDavid du Colombier ushort r2; 10191e577b2SDavid du Colombier ulong mxcsr; /* MXCSR register state */ 10291e577b2SDavid du Colombier ulong mxcsr_mask; /* MXCSR mask register */ 10391e577b2SDavid du Colombier uchar xregs[480]; /* extended registers */ 1044e3613abSDavid du Colombier }; 1054e3613abSDavid du Colombier 1064e3613abSDavid du Colombier struct SFPssestate /* SSE fp state with alignment slop */ 1074e3613abSDavid du Colombier { 1084e3613abSDavid du Colombier FPssestate; 1094e3613abSDavid du Colombier uchar alignpad[FPalign]; /* slop to allow copying to aligned addr */ 1104e3613abSDavid du Colombier ulong magic; /* debugging: check for overrun */ 11191e577b2SDavid du Colombier }; 11291e577b2SDavid du Colombier 113401314a3SDavid du Colombier /* 114401314a3SDavid du Colombier * the FP regs must be stored here, not somewhere pointed to from here. 115401314a3SDavid du Colombier * port code assumes this. 116401314a3SDavid du Colombier */ 117401314a3SDavid du Colombier union FPsave { 11891e577b2SDavid du Colombier FPstate; 1194e3613abSDavid du Colombier SFPssestate; 12091e577b2SDavid du Colombier }; 12191e577b2SDavid du Colombier 1224de34a7eSDavid du Colombier struct Confmem 1234de34a7eSDavid du Colombier { 1244de34a7eSDavid du Colombier ulong base; 1254de34a7eSDavid du Colombier ulong npage; 1264de34a7eSDavid du Colombier ulong kbase; 1274de34a7eSDavid du Colombier ulong klimit; 1284de34a7eSDavid du Colombier }; 1294de34a7eSDavid du Colombier 1303e12c5d1SDavid du Colombier struct Conf 1313e12c5d1SDavid du Colombier { 1323e12c5d1SDavid du Colombier ulong nmach; /* processors */ 1333e12c5d1SDavid du Colombier ulong nproc; /* processes */ 1343e12c5d1SDavid du Colombier ulong monitor; /* has monitor? */ 1354de34a7eSDavid du Colombier Confmem mem[4]; /* physical memory */ 1363e12c5d1SDavid du Colombier ulong npage; /* total physical pages of memory */ 1373e12c5d1SDavid du Colombier ulong upages; /* user page pool */ 1383e12c5d1SDavid du Colombier ulong nimage; /* number of page cache image headers */ 1393e12c5d1SDavid du Colombier ulong nswap; /* number of swap pages */ 1407dd7cddfSDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 1413e12c5d1SDavid du Colombier ulong base0; /* base of bank 0 */ 1423e12c5d1SDavid du Colombier ulong base1; /* base of bank 1 */ 1433e12c5d1SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 1447dd7cddfSDavid du Colombier ulong ialloc; /* max interrupt time allocation in bytes */ 1457dd7cddfSDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 1469a747e4fSDavid du Colombier int nuart; /* number of uart devices */ 1473e12c5d1SDavid du Colombier }; 1483e12c5d1SDavid du Colombier 1493e12c5d1SDavid du Colombier /* 1503e12c5d1SDavid du Colombier * MMU stuff in proc 1513e12c5d1SDavid du Colombier */ 1527dd7cddfSDavid du Colombier #define NCOLOR 1 1533e12c5d1SDavid du Colombier struct PMMU 1543e12c5d1SDavid du Colombier { 1557dd7cddfSDavid du Colombier Page* mmupdb; /* page directory base */ 1563e12c5d1SDavid du Colombier Page* mmufree; /* unused page table pages */ 1573e12c5d1SDavid du Colombier Page* mmuused; /* used page table pages */ 158ea15f0ccSDavid du Colombier Page* kmaptable; /* page table used by kmap */ 1594de34a7eSDavid du Colombier uint lastkmap; /* last entry used by kmap */ 160ea15f0ccSDavid du Colombier int nkmap; /* number of current kmaps */ 1613e12c5d1SDavid du Colombier }; 1623e12c5d1SDavid du Colombier 1633e12c5d1SDavid du Colombier #include "../port/portdat.h" 1643e12c5d1SDavid du Colombier 1657dd7cddfSDavid du Colombier typedef struct { 1667dd7cddfSDavid du Colombier ulong link; /* link (old TSS selector) */ 1677dd7cddfSDavid du Colombier ulong esp0; /* privilege level 0 stack pointer */ 1687dd7cddfSDavid du Colombier ulong ss0; /* privilege level 0 stack selector */ 1697dd7cddfSDavid du Colombier ulong esp1; /* privilege level 1 stack pointer */ 1707dd7cddfSDavid du Colombier ulong ss1; /* privilege level 1 stack selector */ 1717dd7cddfSDavid du Colombier ulong esp2; /* privilege level 2 stack pointer */ 1727dd7cddfSDavid du Colombier ulong ss2; /* privilege level 2 stack selector */ 173425afbabSDavid du Colombier ulong xcr3; /* page directory base register - not used because we don't use trap gates */ 174219b2ee8SDavid du Colombier ulong eip; /* instruction pointer */ 1757dd7cddfSDavid du Colombier ulong eflags; /* flags register */ 1767dd7cddfSDavid du Colombier ulong eax; /* general registers */ 177219b2ee8SDavid du Colombier ulong ecx; 178219b2ee8SDavid du Colombier ulong edx; 179219b2ee8SDavid du Colombier ulong ebx; 180219b2ee8SDavid du Colombier ulong esp; 181219b2ee8SDavid du Colombier ulong ebp; 182219b2ee8SDavid du Colombier ulong esi; 183219b2ee8SDavid du Colombier ulong edi; 184219b2ee8SDavid du Colombier ulong es; /* segment selectors */ 185219b2ee8SDavid du Colombier ulong cs; 186219b2ee8SDavid du Colombier ulong ss; 187219b2ee8SDavid du Colombier ulong ds; 188219b2ee8SDavid du Colombier ulong fs; 189219b2ee8SDavid du Colombier ulong gs; 1907dd7cddfSDavid du Colombier ulong ldt; /* selector for task's LDT */ 1917dd7cddfSDavid du Colombier ulong iomap; /* I/O map base address + T-bit */ 1927dd7cddfSDavid du Colombier } Tss; 193219b2ee8SDavid du Colombier 194219b2ee8SDavid du Colombier struct Segdesc 195219b2ee8SDavid du Colombier { 196219b2ee8SDavid du Colombier ulong d0; 197219b2ee8SDavid du Colombier ulong d1; 198219b2ee8SDavid du Colombier }; 199219b2ee8SDavid du Colombier 2003e12c5d1SDavid du Colombier struct Mach 2013e12c5d1SDavid du Colombier { 2029a747e4fSDavid du Colombier int machno; /* physical id of processor (KNOWN TO ASSEMBLY) */ 2033e12c5d1SDavid du Colombier ulong splpc; /* pc of last caller to splhi */ 204219b2ee8SDavid du Colombier 2057dd7cddfSDavid du Colombier ulong* pdb; /* page directory base for this processor (va) */ 2067dd7cddfSDavid du Colombier Tss* tss; /* tss for this processor */ 2079a747e4fSDavid du Colombier Segdesc *gdt; /* gdt for this processor */ 2087dd7cddfSDavid du Colombier 2093e12c5d1SDavid du Colombier Proc* proc; /* current process on this processor */ 2107dd7cddfSDavid du Colombier Proc* externup; /* extern register Proc *up */ 2117dd7cddfSDavid du Colombier 2127dd7cddfSDavid du Colombier Page* pdbpool; 2137dd7cddfSDavid du Colombier int pdbcnt; 2147dd7cddfSDavid du Colombier 2157dd7cddfSDavid du Colombier ulong ticks; /* of the clock since boot time */ 2163e12c5d1SDavid du Colombier Label sched; /* scheduler wakeup */ 2173e12c5d1SDavid du Colombier Lock alarmlock; /* access to alarm list */ 2183e12c5d1SDavid du Colombier void* alarm; /* alarms bound to this clock */ 21980ee5cbfSDavid du Colombier int inclockintr; 2203e12c5d1SDavid du Colombier 22159c21d95SDavid du Colombier Proc* readied; /* for runproc */ 22259c21d95SDavid du Colombier ulong schedticks; /* next forced context switch */ 2237dd7cddfSDavid du Colombier 2243e12c5d1SDavid du Colombier int tlbfault; 2253e12c5d1SDavid du Colombier int tlbpurge; 2263e12c5d1SDavid du Colombier int pfault; 2273e12c5d1SDavid du Colombier int cs; 2283e12c5d1SDavid du Colombier int syscall; 2293e12c5d1SDavid du Colombier int load; 2303e12c5d1SDavid du Colombier int intr; 2317dd7cddfSDavid du Colombier int flushmmu; /* make current proc flush it's mmu state */ 2329a747e4fSDavid du Colombier int ilockdepth; 2333ff48bf5SDavid du Colombier Perf perf; /* performance counters */ 2343e12c5d1SDavid du Colombier 2357dd7cddfSDavid du Colombier ulong spuriousintr; 2367dd7cddfSDavid du Colombier int lastintr; 2377dd7cddfSDavid du Colombier 2387dd7cddfSDavid du Colombier int loopconst; 2397dd7cddfSDavid du Colombier 2409a747e4fSDavid du Colombier Lock apictimerlock; 2417dd7cddfSDavid du Colombier int cpumhz; 242e288d156SDavid du Colombier uvlong cyclefreq; /* Frequency of user readable cycle counter */ 2439a747e4fSDavid du Colombier uvlong cpuhz; 2447dd7cddfSDavid du Colombier int cpuidax; 2457dd7cddfSDavid du Colombier int cpuiddx; 2467dd7cddfSDavid du Colombier char cpuidid[16]; 2477dd7cddfSDavid du Colombier char* cpuidtype; 2489a747e4fSDavid du Colombier int havetsc; 2499a747e4fSDavid du Colombier int havepge; 2509a747e4fSDavid du Colombier uvlong tscticks; 2511bd28109SDavid du Colombier int pdballoc; 2521bd28109SDavid du Colombier int pdbfree; 253d7e44d0dSDavid du Colombier FPsave *fpsavalign; 2547dd7cddfSDavid du Colombier 2557dd7cddfSDavid du Colombier vlong mtrrcap; 2567dd7cddfSDavid du Colombier vlong mtrrdef; 2577dd7cddfSDavid du Colombier vlong mtrrfix[11]; 2587dd7cddfSDavid du Colombier vlong mtrrvar[32]; /* 256 max. */ 259219b2ee8SDavid du Colombier 2603e12c5d1SDavid du Colombier int stack[1]; 2613e12c5d1SDavid du Colombier }; 2623e12c5d1SDavid du Colombier 2633e12c5d1SDavid du Colombier /* 2644de34a7eSDavid du Colombier * KMap the structure doesn't exist, but the functions do. 2653e12c5d1SDavid du Colombier */ 2664de34a7eSDavid du Colombier typedef struct KMap KMap; 2674de34a7eSDavid du Colombier #define VA(k) ((void*)(k)) 2684de34a7eSDavid du Colombier KMap* kmap(Page*); 2694de34a7eSDavid du Colombier void kunmap(KMap*); 2703e12c5d1SDavid du Colombier 2713e12c5d1SDavid du Colombier struct 2723e12c5d1SDavid du Colombier { 2733e12c5d1SDavid du Colombier Lock; 274*405829f1SDavid du Colombier union { 275*405829f1SDavid du Colombier uvlong machs; /* bitmap of active CPUs */ 276*405829f1SDavid du Colombier ulong machsmap[(MAXMACH+BI2WD-1)/BI2WD]; 277*405829f1SDavid du Colombier }; 278*405829f1SDavid du Colombier int nmachs; /* number of bits set in machs(map) */ 2797dd7cddfSDavid du Colombier int exiting; /* shutdown */ 2807dd7cddfSDavid du Colombier int ispanic; /* shutdown in response to a panic */ 281da51d93aSDavid du Colombier int thunderbirdsarego; /* lets the added processors continue to schedinit */ 282dadaab63SDavid du Colombier int rebooting; /* just idle cpus > 0 */ 2833e12c5d1SDavid du Colombier }active; 2843e12c5d1SDavid du Colombier 285bd389b36SDavid du Colombier /* 286bd389b36SDavid du Colombier * routines for things outside the PC model, like power management 287bd389b36SDavid du Colombier */ 288bd389b36SDavid du Colombier struct PCArch 289bd389b36SDavid du Colombier { 290bd389b36SDavid du Colombier char* id; 2917dd7cddfSDavid du Colombier int (*ident)(void); /* this should be in the model */ 292bd389b36SDavid du Colombier void (*reset)(void); /* this should be in the model */ 293bd389b36SDavid du Colombier int (*serialpower)(int); /* 1 == on, 0 == off */ 294bd389b36SDavid du Colombier int (*modempower)(int); /* 1 == on, 0 == off */ 2957dd7cddfSDavid du Colombier 2967dd7cddfSDavid du Colombier void (*intrinit)(void); 2977dd7cddfSDavid du Colombier int (*intrenable)(Vctl*); 2989a747e4fSDavid du Colombier int (*intrvecno)(int); 2999a747e4fSDavid du Colombier int (*intrdisable)(int); 3004de34a7eSDavid du Colombier void (*introff)(void); 3014de34a7eSDavid du Colombier void (*intron)(void); 3027dd7cddfSDavid du Colombier 3037dd7cddfSDavid du Colombier void (*clockenable)(void); 3047dd7cddfSDavid du Colombier uvlong (*fastclock)(uvlong*); 3059a747e4fSDavid du Colombier void (*timerset)(uvlong); 3061206f3fcSDavid du Colombier 3071206f3fcSDavid du Colombier void (*resetothers)(void); /* put other cpus into reset */ 308bd389b36SDavid du Colombier }; 309bd389b36SDavid du Colombier 310fdc61599SDavid du Colombier /* cpuid instruction result register bits */ 311fdc61599SDavid du Colombier enum { 312fdc61599SDavid du Colombier /* dx */ 313fdc61599SDavid du Colombier Fpuonchip = 1<<0, 31461fd6f66SDavid du Colombier Vmex = 1<<1, /* virtual-mode extensions */ 31561fd6f66SDavid du Colombier Pse = 1<<3, /* page size extensions */ 316fdc61599SDavid du Colombier Tsc = 1<<4, /* time-stamp counter */ 317fdc61599SDavid du Colombier Cpumsr = 1<<5, /* model-specific registers, rdmsr/wrmsr */ 318fdc61599SDavid du Colombier Pae = 1<<6, /* physical-addr extensions */ 319fdc61599SDavid du Colombier Mce = 1<<7, /* machine-check exception */ 320fdc61599SDavid du Colombier Cmpxchg8b = 1<<8, 321fdc61599SDavid du Colombier Cpuapic = 1<<9, 322fdc61599SDavid du Colombier Mtrr = 1<<12, /* memory-type range regs. */ 323fdc61599SDavid du Colombier Pge = 1<<13, /* page global extension */ 32461fd6f66SDavid du Colombier Pse2 = 1<<17, /* more page size extensions */ 325fdc61599SDavid du Colombier Clflush = 1<<19, 32648489f93SDavid du Colombier Acpif = 1<<22, 327fdc61599SDavid du Colombier Mmx = 1<<23, 32891e577b2SDavid du Colombier Fxsr = 1<<24, /* have SSE FXSAVE/FXRSTOR */ 329fdc61599SDavid du Colombier Sse = 1<<25, /* thus sfence instr. */ 330fdc61599SDavid du Colombier Sse2 = 1<<26, /* thus mfence & lfence instr.s */ 331fdc61599SDavid du Colombier }; 332fdc61599SDavid du Colombier 3337dd7cddfSDavid du Colombier /* 3347dd7cddfSDavid du Colombier * a parsed plan9.ini line 3357dd7cddfSDavid du Colombier */ 3367dd7cddfSDavid du Colombier #define NISAOPT 8 337219b2ee8SDavid du Colombier 338219b2ee8SDavid du Colombier struct ISAConf { 3399a747e4fSDavid du Colombier char *type; 340219b2ee8SDavid du Colombier ulong port; 341fb7f0c93SDavid du Colombier int irq; 3427dd7cddfSDavid du Colombier ulong dma; 343219b2ee8SDavid du Colombier ulong mem; 344219b2ee8SDavid du Colombier ulong size; 3457dd7cddfSDavid du Colombier ulong freq; 3467dd7cddfSDavid du Colombier 3477dd7cddfSDavid du Colombier int nopt; 3489a747e4fSDavid du Colombier char *opt[NISAOPT]; 349219b2ee8SDavid du Colombier }; 350219b2ee8SDavid du Colombier 3517dd7cddfSDavid du Colombier extern PCArch *arch; /* PC architecture */ 3527dd7cddfSDavid du Colombier 353219b2ee8SDavid du Colombier /* 3547dd7cddfSDavid du Colombier * Each processor sees its own Mach structure at address MACHADDR. 3557dd7cddfSDavid du Colombier * However, the Mach structures must also be available via the per-processor 3567dd7cddfSDavid du Colombier * MMU information array machp, mainly for disambiguation and access to 3577dd7cddfSDavid du Colombier * the clock which is only maintained by the bootstrap processor (0). 358219b2ee8SDavid du Colombier */ 3597dd7cddfSDavid du Colombier Mach* machp[MAXMACH]; 360219b2ee8SDavid du Colombier 3617dd7cddfSDavid du Colombier #define MACHP(n) (machp[n]) 362219b2ee8SDavid du Colombier 3637dd7cddfSDavid du Colombier extern Mach *m; 3647dd7cddfSDavid du Colombier #define up (((Mach*)MACHADDR)->externup) 3659a747e4fSDavid du Colombier 3669a747e4fSDavid du Colombier /* 3679a747e4fSDavid du Colombier * hardware info about a device 3689a747e4fSDavid du Colombier */ 3699a747e4fSDavid du Colombier typedef struct { 3709a747e4fSDavid du Colombier ulong port; 3719a747e4fSDavid du Colombier int size; 37259c21d95SDavid du Colombier } Devport; 3739a747e4fSDavid du Colombier 3749a747e4fSDavid du Colombier struct DevConf 3759a747e4fSDavid du Colombier { 3763ff48bf5SDavid du Colombier ulong intnum; /* interrupt number */ 3779a747e4fSDavid du Colombier char *type; /* card type, malloced */ 3789a747e4fSDavid du Colombier int nports; /* Number of ports */ 37959c21d95SDavid du Colombier Devport *ports; /* The ports themselves */ 3809a747e4fSDavid du Colombier }; 3814fafed5dSDavid du Colombier 3824fafed5dSDavid du Colombier typedef struct BIOS32ci { /* BIOS32 Calling Interface */ 3834fafed5dSDavid du Colombier u32int eax; 3844fafed5dSDavid du Colombier u32int ebx; 3854fafed5dSDavid du Colombier u32int ecx; 3864fafed5dSDavid du Colombier u32int edx; 3874fafed5dSDavid du Colombier u32int esi; 3884fafed5dSDavid du Colombier u32int edi; 3894fafed5dSDavid du Colombier } BIOS32ci; 390