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; 137dd7cddfSDavid du Colombier typedef struct Notsave Notsave; 14bd389b36SDavid du Colombier typedef struct PCArch PCArch; 157dd7cddfSDavid du Colombier typedef struct Pcidev Pcidev; 16219b2ee8SDavid du Colombier typedef struct PCMmap PCMmap; 1780ee5cbfSDavid du Colombier typedef struct PCMslot PCMslot; 183e12c5d1SDavid du Colombier typedef struct Page Page; 193e12c5d1SDavid du Colombier typedef struct PMMU PMMU; 207dd7cddfSDavid du Colombier typedef struct Proc Proc; 213e12c5d1SDavid du Colombier typedef struct Segdesc Segdesc; 22*4e3613abSDavid du Colombier typedef struct SFPssestate SFPssestate; 23fdc61599SDavid du Colombier typedef vlong Tval; 243e12c5d1SDavid du Colombier typedef struct Ureg Ureg; 257dd7cddfSDavid du Colombier typedef struct Vctl Vctl; 263e12c5d1SDavid du Colombier 274fafed5dSDavid du Colombier #pragma incomplete BIOS32si 28d04cc87cSDavid du Colombier #pragma incomplete Pcidev 2912fd1c83SDavid du Colombier #pragma incomplete Ureg 3012fd1c83SDavid du Colombier 319a747e4fSDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */ 329a747e4fSDavid du Colombier 3385878a71SDavid du Colombier #define KMESGSIZE (256*1024) /* lots, for acpi debugging */ 34cc162d66SDavid du Colombier #define STAGESIZE 2048 3585878a71SDavid du Colombier 363e12c5d1SDavid du Colombier /* 373e12c5d1SDavid du Colombier * parameters for sysproc.c 383e12c5d1SDavid du Colombier */ 397dd7cddfSDavid du Colombier #define AOUT_MAGIC (I_MAGIC) 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier struct Lock 423e12c5d1SDavid du Colombier { 433e12c5d1SDavid du Colombier ulong key; 44219b2ee8SDavid du Colombier ulong sr; 457dd7cddfSDavid du Colombier ulong pc; 467dd7cddfSDavid du Colombier Proc *p; 474de34a7eSDavid du Colombier Mach *m; 487dd7cddfSDavid du Colombier ushort isilock; 49208510e1SDavid du Colombier long lockcycles; 503e12c5d1SDavid du Colombier }; 513e12c5d1SDavid du Colombier 523e12c5d1SDavid du Colombier struct Label 533e12c5d1SDavid du Colombier { 543e12c5d1SDavid du Colombier ulong sp; 553e12c5d1SDavid du Colombier ulong pc; 563e12c5d1SDavid du Colombier }; 573e12c5d1SDavid du Colombier 583e12c5d1SDavid du Colombier 593e12c5d1SDavid du Colombier /* 603e12c5d1SDavid du Colombier * FPsave.status 613e12c5d1SDavid du Colombier */ 623e12c5d1SDavid du Colombier enum 633e12c5d1SDavid du Colombier { 643ff48bf5SDavid du Colombier /* this is a state */ 653ff48bf5SDavid du Colombier FPinit= 0, 663ff48bf5SDavid du Colombier FPactive= 1, 673ff48bf5SDavid du Colombier FPinactive= 2, 683ff48bf5SDavid du Colombier 693ff48bf5SDavid du Colombier /* the following is a bit that can be or'd into the state */ 703ff48bf5SDavid du Colombier FPillegal= 0x100, 713e12c5d1SDavid du Colombier }; 723e12c5d1SDavid du Colombier 7391e577b2SDavid du Colombier struct FPstate /* x87 fpu state */ 743e12c5d1SDavid du Colombier { 753e12c5d1SDavid du Colombier ushort control; 763e12c5d1SDavid du Colombier ushort r1; 773e12c5d1SDavid du Colombier ushort status; 783e12c5d1SDavid du Colombier ushort r2; 793e12c5d1SDavid du Colombier ushort tag; 803e12c5d1SDavid du Colombier ushort r3; 813e12c5d1SDavid du Colombier ulong pc; 823e12c5d1SDavid du Colombier ushort selector; 833e12c5d1SDavid du Colombier ushort r4; 843e12c5d1SDavid du Colombier ulong operand; 853e12c5d1SDavid du Colombier ushort oselector; 863e12c5d1SDavid du Colombier ushort r5; 873e12c5d1SDavid du Colombier uchar regs[80]; /* floating point registers */ 883e12c5d1SDavid du Colombier }; 893e12c5d1SDavid du Colombier 9091e577b2SDavid du Colombier struct FPssestate /* SSE fp state */ 9191e577b2SDavid du Colombier { 9291e577b2SDavid du Colombier ushort fcw; /* control */ 9391e577b2SDavid du Colombier ushort fsw; /* status */ 9491e577b2SDavid du Colombier ushort ftw; /* tag */ 9591e577b2SDavid du Colombier ushort fop; /* opcode */ 9691e577b2SDavid du Colombier ulong fpuip; /* pc */ 9791e577b2SDavid du Colombier ushort cs; /* pc segment */ 9891e577b2SDavid du Colombier ushort r1; /* reserved */ 9991e577b2SDavid du Colombier ulong fpudp; /* data pointer */ 10091e577b2SDavid du Colombier ushort ds; /* data pointer segment */ 10191e577b2SDavid du Colombier ushort r2; 10291e577b2SDavid du Colombier ulong mxcsr; /* MXCSR register state */ 10391e577b2SDavid du Colombier ulong mxcsr_mask; /* MXCSR mask register */ 10491e577b2SDavid du Colombier uchar xregs[480]; /* extended registers */ 105*4e3613abSDavid du Colombier }; 106*4e3613abSDavid du Colombier 107*4e3613abSDavid du Colombier struct SFPssestate /* SSE fp state with alignment slop */ 108*4e3613abSDavid du Colombier { 109*4e3613abSDavid du Colombier FPssestate; 110*4e3613abSDavid du Colombier uchar alignpad[FPalign]; /* slop to allow copying to aligned addr */ 111*4e3613abSDavid du Colombier ulong magic; /* debugging: check for overrun */ 11291e577b2SDavid du Colombier }; 11391e577b2SDavid du Colombier 114401314a3SDavid du Colombier /* 115401314a3SDavid du Colombier * the FP regs must be stored here, not somewhere pointed to from here. 116401314a3SDavid du Colombier * port code assumes this. 117401314a3SDavid du Colombier */ 118401314a3SDavid du Colombier union FPsave { 11991e577b2SDavid du Colombier FPstate; 120*4e3613abSDavid du Colombier SFPssestate; 12191e577b2SDavid du Colombier }; 12291e577b2SDavid du Colombier 1234de34a7eSDavid du Colombier struct Confmem 1244de34a7eSDavid du Colombier { 1254de34a7eSDavid du Colombier ulong base; 1264de34a7eSDavid du Colombier ulong npage; 1274de34a7eSDavid du Colombier ulong kbase; 1284de34a7eSDavid du Colombier ulong klimit; 1294de34a7eSDavid du Colombier }; 1304de34a7eSDavid du Colombier 1313e12c5d1SDavid du Colombier struct Conf 1323e12c5d1SDavid du Colombier { 1333e12c5d1SDavid du Colombier ulong nmach; /* processors */ 1343e12c5d1SDavid du Colombier ulong nproc; /* processes */ 1353e12c5d1SDavid du Colombier ulong monitor; /* has monitor? */ 1364de34a7eSDavid du Colombier Confmem mem[4]; /* physical memory */ 1373e12c5d1SDavid du Colombier ulong npage; /* total physical pages of memory */ 1383e12c5d1SDavid du Colombier ulong upages; /* user page pool */ 1393e12c5d1SDavid du Colombier ulong nimage; /* number of page cache image headers */ 1403e12c5d1SDavid du Colombier ulong nswap; /* number of swap pages */ 1417dd7cddfSDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 1423e12c5d1SDavid du Colombier ulong base0; /* base of bank 0 */ 1433e12c5d1SDavid du Colombier ulong base1; /* base of bank 1 */ 1443e12c5d1SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 1457dd7cddfSDavid du Colombier ulong ialloc; /* max interrupt time allocation in bytes */ 1467dd7cddfSDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 1479a747e4fSDavid du Colombier int nuart; /* number of uart devices */ 1483e12c5d1SDavid du Colombier }; 1493e12c5d1SDavid du Colombier 1503e12c5d1SDavid du Colombier /* 1513e12c5d1SDavid du Colombier * MMU stuff in proc 1523e12c5d1SDavid du Colombier */ 1537dd7cddfSDavid du Colombier #define NCOLOR 1 1543e12c5d1SDavid du Colombier struct PMMU 1553e12c5d1SDavid du Colombier { 1567dd7cddfSDavid du Colombier Page* mmupdb; /* page directory base */ 1573e12c5d1SDavid du Colombier Page* mmufree; /* unused page table pages */ 1583e12c5d1SDavid du Colombier Page* mmuused; /* used page table pages */ 159ea15f0ccSDavid du Colombier Page* kmaptable; /* page table used by kmap */ 1604de34a7eSDavid du Colombier uint lastkmap; /* last entry used by kmap */ 161ea15f0ccSDavid du Colombier int nkmap; /* number of current kmaps */ 1623e12c5d1SDavid du Colombier }; 1633e12c5d1SDavid du Colombier 1647dd7cddfSDavid du Colombier /* 1657dd7cddfSDavid du Colombier * things saved in the Proc structure during a notify 1667dd7cddfSDavid du Colombier */ 1677dd7cddfSDavid du Colombier struct Notsave 1687dd7cddfSDavid du Colombier { 1697dd7cddfSDavid du Colombier ulong svflags; 1707dd7cddfSDavid du Colombier ulong svcs; 1717dd7cddfSDavid du Colombier ulong svss; 1727dd7cddfSDavid du Colombier }; 1737dd7cddfSDavid du Colombier 1743e12c5d1SDavid du Colombier #include "../port/portdat.h" 1753e12c5d1SDavid du Colombier 1767dd7cddfSDavid du Colombier typedef struct { 1777dd7cddfSDavid du Colombier ulong link; /* link (old TSS selector) */ 1787dd7cddfSDavid du Colombier ulong esp0; /* privilege level 0 stack pointer */ 1797dd7cddfSDavid du Colombier ulong ss0; /* privilege level 0 stack selector */ 1807dd7cddfSDavid du Colombier ulong esp1; /* privilege level 1 stack pointer */ 1817dd7cddfSDavid du Colombier ulong ss1; /* privilege level 1 stack selector */ 1827dd7cddfSDavid du Colombier ulong esp2; /* privilege level 2 stack pointer */ 1837dd7cddfSDavid du Colombier ulong ss2; /* privilege level 2 stack selector */ 184425afbabSDavid du Colombier ulong xcr3; /* page directory base register - not used because we don't use trap gates */ 185219b2ee8SDavid du Colombier ulong eip; /* instruction pointer */ 1867dd7cddfSDavid du Colombier ulong eflags; /* flags register */ 1877dd7cddfSDavid du Colombier ulong eax; /* general registers */ 188219b2ee8SDavid du Colombier ulong ecx; 189219b2ee8SDavid du Colombier ulong edx; 190219b2ee8SDavid du Colombier ulong ebx; 191219b2ee8SDavid du Colombier ulong esp; 192219b2ee8SDavid du Colombier ulong ebp; 193219b2ee8SDavid du Colombier ulong esi; 194219b2ee8SDavid du Colombier ulong edi; 195219b2ee8SDavid du Colombier ulong es; /* segment selectors */ 196219b2ee8SDavid du Colombier ulong cs; 197219b2ee8SDavid du Colombier ulong ss; 198219b2ee8SDavid du Colombier ulong ds; 199219b2ee8SDavid du Colombier ulong fs; 200219b2ee8SDavid du Colombier ulong gs; 2017dd7cddfSDavid du Colombier ulong ldt; /* selector for task's LDT */ 2027dd7cddfSDavid du Colombier ulong iomap; /* I/O map base address + T-bit */ 2037dd7cddfSDavid du Colombier } Tss; 204219b2ee8SDavid du Colombier 205219b2ee8SDavid du Colombier struct Segdesc 206219b2ee8SDavid du Colombier { 207219b2ee8SDavid du Colombier ulong d0; 208219b2ee8SDavid du Colombier ulong d1; 209219b2ee8SDavid du Colombier }; 210219b2ee8SDavid du Colombier 2113e12c5d1SDavid du Colombier struct Mach 2123e12c5d1SDavid du Colombier { 2139a747e4fSDavid du Colombier int machno; /* physical id of processor (KNOWN TO ASSEMBLY) */ 2143e12c5d1SDavid du Colombier ulong splpc; /* pc of last caller to splhi */ 215219b2ee8SDavid du Colombier 2167dd7cddfSDavid du Colombier ulong* pdb; /* page directory base for this processor (va) */ 2177dd7cddfSDavid du Colombier Tss* tss; /* tss for this processor */ 2189a747e4fSDavid du Colombier Segdesc *gdt; /* gdt for this processor */ 2197dd7cddfSDavid du Colombier 2203e12c5d1SDavid du Colombier Proc* proc; /* current process on this processor */ 2217dd7cddfSDavid du Colombier Proc* externup; /* extern register Proc *up */ 2227dd7cddfSDavid du Colombier 2237dd7cddfSDavid du Colombier Page* pdbpool; 2247dd7cddfSDavid du Colombier int pdbcnt; 2257dd7cddfSDavid du Colombier 2267dd7cddfSDavid du Colombier ulong ticks; /* of the clock since boot time */ 2273e12c5d1SDavid du Colombier Label sched; /* scheduler wakeup */ 2283e12c5d1SDavid du Colombier Lock alarmlock; /* access to alarm list */ 2293e12c5d1SDavid du Colombier void* alarm; /* alarms bound to this clock */ 23080ee5cbfSDavid du Colombier int inclockintr; 2313e12c5d1SDavid du Colombier 23259c21d95SDavid du Colombier Proc* readied; /* for runproc */ 23359c21d95SDavid du Colombier ulong schedticks; /* next forced context switch */ 2347dd7cddfSDavid du Colombier 2353e12c5d1SDavid du Colombier int tlbfault; 2363e12c5d1SDavid du Colombier int tlbpurge; 2373e12c5d1SDavid du Colombier int pfault; 2383e12c5d1SDavid du Colombier int cs; 2393e12c5d1SDavid du Colombier int syscall; 2403e12c5d1SDavid du Colombier int load; 2413e12c5d1SDavid du Colombier int intr; 2427dd7cddfSDavid du Colombier int flushmmu; /* make current proc flush it's mmu state */ 2439a747e4fSDavid du Colombier int ilockdepth; 2443ff48bf5SDavid du Colombier Perf perf; /* performance counters */ 2453e12c5d1SDavid du Colombier 2467dd7cddfSDavid du Colombier ulong spuriousintr; 2477dd7cddfSDavid du Colombier int lastintr; 2487dd7cddfSDavid du Colombier 2497dd7cddfSDavid du Colombier int loopconst; 2507dd7cddfSDavid du Colombier 2519a747e4fSDavid du Colombier Lock apictimerlock; 2527dd7cddfSDavid du Colombier int cpumhz; 253e288d156SDavid du Colombier uvlong cyclefreq; /* Frequency of user readable cycle counter */ 2549a747e4fSDavid du Colombier uvlong cpuhz; 2557dd7cddfSDavid du Colombier int cpuidax; 2567dd7cddfSDavid du Colombier int cpuiddx; 2577dd7cddfSDavid du Colombier char cpuidid[16]; 2587dd7cddfSDavid du Colombier char* cpuidtype; 2599a747e4fSDavid du Colombier int havetsc; 2609a747e4fSDavid du Colombier int havepge; 2619a747e4fSDavid du Colombier uvlong tscticks; 2621bd28109SDavid du Colombier int pdballoc; 2631bd28109SDavid du Colombier int pdbfree; 264d7e44d0dSDavid du Colombier FPsave *fpsavalign; 2657dd7cddfSDavid du Colombier 2667dd7cddfSDavid du Colombier vlong mtrrcap; 2677dd7cddfSDavid du Colombier vlong mtrrdef; 2687dd7cddfSDavid du Colombier vlong mtrrfix[11]; 2697dd7cddfSDavid du Colombier vlong mtrrvar[32]; /* 256 max. */ 270219b2ee8SDavid du Colombier 2713e12c5d1SDavid du Colombier int stack[1]; 2723e12c5d1SDavid du Colombier }; 2733e12c5d1SDavid du Colombier 2743e12c5d1SDavid du Colombier /* 2754de34a7eSDavid du Colombier * KMap the structure doesn't exist, but the functions do. 2763e12c5d1SDavid du Colombier */ 2774de34a7eSDavid du Colombier typedef struct KMap KMap; 2784de34a7eSDavid du Colombier #define VA(k) ((void*)(k)) 2794de34a7eSDavid du Colombier KMap* kmap(Page*); 2804de34a7eSDavid du Colombier void kunmap(KMap*); 2813e12c5d1SDavid du Colombier 2823e12c5d1SDavid du Colombier struct 2833e12c5d1SDavid du Colombier { 2843e12c5d1SDavid du Colombier Lock; 2857dd7cddfSDavid du Colombier int machs; /* bitmap of active CPUs */ 2867dd7cddfSDavid du Colombier int exiting; /* shutdown */ 2877dd7cddfSDavid du Colombier int ispanic; /* shutdown in response to a panic */ 288da51d93aSDavid du Colombier int thunderbirdsarego; /* lets the added processors continue to schedinit */ 289dadaab63SDavid du Colombier int rebooting; /* just idle cpus > 0 */ 2903e12c5d1SDavid du Colombier }active; 2913e12c5d1SDavid du Colombier 292bd389b36SDavid du Colombier /* 293bd389b36SDavid du Colombier * routines for things outside the PC model, like power management 294bd389b36SDavid du Colombier */ 295bd389b36SDavid du Colombier struct PCArch 296bd389b36SDavid du Colombier { 297bd389b36SDavid du Colombier char* id; 2987dd7cddfSDavid du Colombier int (*ident)(void); /* this should be in the model */ 299bd389b36SDavid du Colombier void (*reset)(void); /* this should be in the model */ 300bd389b36SDavid du Colombier int (*serialpower)(int); /* 1 == on, 0 == off */ 301bd389b36SDavid du Colombier int (*modempower)(int); /* 1 == on, 0 == off */ 3027dd7cddfSDavid du Colombier 3037dd7cddfSDavid du Colombier void (*intrinit)(void); 3047dd7cddfSDavid du Colombier int (*intrenable)(Vctl*); 3059a747e4fSDavid du Colombier int (*intrvecno)(int); 3069a747e4fSDavid du Colombier int (*intrdisable)(int); 3074de34a7eSDavid du Colombier void (*introff)(void); 3084de34a7eSDavid du Colombier void (*intron)(void); 3097dd7cddfSDavid du Colombier 3107dd7cddfSDavid du Colombier void (*clockenable)(void); 3117dd7cddfSDavid du Colombier uvlong (*fastclock)(uvlong*); 3129a747e4fSDavid du Colombier void (*timerset)(uvlong); 3131206f3fcSDavid du Colombier 3141206f3fcSDavid du Colombier void (*resetothers)(void); /* put other cpus into reset */ 315bd389b36SDavid du Colombier }; 316bd389b36SDavid du Colombier 317fdc61599SDavid du Colombier /* cpuid instruction result register bits */ 318fdc61599SDavid du Colombier enum { 319fdc61599SDavid du Colombier /* dx */ 320fdc61599SDavid du Colombier Fpuonchip = 1<<0, 32161fd6f66SDavid du Colombier Vmex = 1<<1, /* virtual-mode extensions */ 32261fd6f66SDavid du Colombier Pse = 1<<3, /* page size extensions */ 323fdc61599SDavid du Colombier Tsc = 1<<4, /* time-stamp counter */ 324fdc61599SDavid du Colombier Cpumsr = 1<<5, /* model-specific registers, rdmsr/wrmsr */ 325fdc61599SDavid du Colombier Pae = 1<<6, /* physical-addr extensions */ 326fdc61599SDavid du Colombier Mce = 1<<7, /* machine-check exception */ 327fdc61599SDavid du Colombier Cmpxchg8b = 1<<8, 328fdc61599SDavid du Colombier Cpuapic = 1<<9, 329fdc61599SDavid du Colombier Mtrr = 1<<12, /* memory-type range regs. */ 330fdc61599SDavid du Colombier Pge = 1<<13, /* page global extension */ 33161fd6f66SDavid du Colombier Pse2 = 1<<17, /* more page size extensions */ 332fdc61599SDavid du Colombier Clflush = 1<<19, 333fdc61599SDavid du Colombier Mmx = 1<<23, 33491e577b2SDavid du Colombier Fxsr = 1<<24, /* have SSE FXSAVE/FXRSTOR */ 335fdc61599SDavid du Colombier Sse = 1<<25, /* thus sfence instr. */ 336fdc61599SDavid du Colombier Sse2 = 1<<26, /* thus mfence & lfence instr.s */ 337fdc61599SDavid du Colombier }; 338fdc61599SDavid du Colombier 3397dd7cddfSDavid du Colombier /* 3407dd7cddfSDavid du Colombier * a parsed plan9.ini line 3417dd7cddfSDavid du Colombier */ 3427dd7cddfSDavid du Colombier #define NISAOPT 8 343219b2ee8SDavid du Colombier 344219b2ee8SDavid du Colombier struct ISAConf { 3459a747e4fSDavid du Colombier char *type; 346219b2ee8SDavid du Colombier ulong port; 347fb7f0c93SDavid du Colombier int irq; 3487dd7cddfSDavid du Colombier ulong dma; 349219b2ee8SDavid du Colombier ulong mem; 350219b2ee8SDavid du Colombier ulong size; 3517dd7cddfSDavid du Colombier ulong freq; 3527dd7cddfSDavid du Colombier 3537dd7cddfSDavid du Colombier int nopt; 3549a747e4fSDavid du Colombier char *opt[NISAOPT]; 355219b2ee8SDavid du Colombier }; 356219b2ee8SDavid du Colombier 3577dd7cddfSDavid du Colombier extern PCArch *arch; /* PC architecture */ 3587dd7cddfSDavid du Colombier 359219b2ee8SDavid du Colombier /* 3607dd7cddfSDavid du Colombier * Each processor sees its own Mach structure at address MACHADDR. 3617dd7cddfSDavid du Colombier * However, the Mach structures must also be available via the per-processor 3627dd7cddfSDavid du Colombier * MMU information array machp, mainly for disambiguation and access to 3637dd7cddfSDavid du Colombier * the clock which is only maintained by the bootstrap processor (0). 364219b2ee8SDavid du Colombier */ 3657dd7cddfSDavid du Colombier Mach* machp[MAXMACH]; 366219b2ee8SDavid du Colombier 3677dd7cddfSDavid du Colombier #define MACHP(n) (machp[n]) 368219b2ee8SDavid du Colombier 3697dd7cddfSDavid du Colombier extern Mach *m; 3707dd7cddfSDavid du Colombier #define up (((Mach*)MACHADDR)->externup) 3719a747e4fSDavid du Colombier 3729a747e4fSDavid du Colombier /* 3739a747e4fSDavid du Colombier * hardware info about a device 3749a747e4fSDavid du Colombier */ 3759a747e4fSDavid du Colombier typedef struct { 3769a747e4fSDavid du Colombier ulong port; 3779a747e4fSDavid du Colombier int size; 37859c21d95SDavid du Colombier } Devport; 3799a747e4fSDavid du Colombier 3809a747e4fSDavid du Colombier struct DevConf 3819a747e4fSDavid du Colombier { 3823ff48bf5SDavid du Colombier ulong intnum; /* interrupt number */ 3839a747e4fSDavid du Colombier char *type; /* card type, malloced */ 3849a747e4fSDavid du Colombier int nports; /* Number of ports */ 38559c21d95SDavid du Colombier Devport *ports; /* The ports themselves */ 3869a747e4fSDavid du Colombier }; 3874fafed5dSDavid du Colombier 3884fafed5dSDavid du Colombier typedef struct BIOS32ci { /* BIOS32 Calling Interface */ 3894fafed5dSDavid du Colombier u32int eax; 3904fafed5dSDavid du Colombier u32int ebx; 3914fafed5dSDavid du Colombier u32int ecx; 3924fafed5dSDavid du Colombier u32int edx; 3934fafed5dSDavid du Colombier u32int esi; 3944fafed5dSDavid du Colombier u32int edi; 3954fafed5dSDavid du Colombier } BIOS32ci; 396