ref: f1d768235e45e9489e04cb46705e7b065855aaa6
parent: ce9665da6b82c016e72ef61201fb9cc75dac78ca
author: glenda <glenda@cirno>
date: Fri May 3 11:24:07 EDT 2024
dat.h from 9front, with nix additions.
--- /dev/null
+++ b/sys/src/nix/pc64/dat.h
@@ -1,0 +1,365 @@
+typedef struct BIOS32si BIOS32si;
+typedef struct BIOS32ci BIOS32ci;
+typedef struct Conf Conf;
+typedef struct Confmem Confmem;
+typedef struct FPssestate FPssestate;
+typedef struct FPavxstate FPavxstate;
+typedef struct FPsave FPsave;
+typedef struct PFPU PFPU;
+typedef struct ISAConf ISAConf;
+typedef struct Label Label;
+typedef struct Lock Lock;
+typedef struct MMU MMU;
+typedef struct Mach Mach;
+typedef struct PCArch PCArch;
+typedef struct Pcidev Pcidev;
+typedef struct PCMmap PCMmap;
+typedef struct PCMslot PCMslot;
+typedef struct Page Page;
+typedef struct PMMU PMMU;
+typedef struct Proc Proc;
+typedef struct Segdesc Segdesc;
+typedef vlong Tval;
+typedef struct Ureg Ureg;
+typedef struct Vctl Vctl;
+
+#pragma incomplete BIOS32si
+#pragma incomplete Pcidev
+#pragma incomplete Ureg
+
+#define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */
+
+/*
+ * parameters for sysproc.c
+ */
+#define AOUT_MAGIC (S_MAGIC)
+
+struct Lock
+{
+ ulong key;
+ ulong sr;
+ uintptr pc;
+ Proc *p;
+ Mach *m;
+ ushort isilock;
+ long lockcycles;
+};
+
+struct Label
+{
+ uintptr sp;
+ uintptr pc;
+};
+
+struct FPssestate
+{
+ u16int fcw; /* x87 control word */
+ u16int fsw; /* x87 status word */
+ u8int ftw; /* x87 tag word */
+ u8int zero; /* 0 */
+ u16int fop; /* last x87 opcode */
+ u64int rip; /* last x87 instruction pointer */
+ u64int rdp; /* last x87 data pointer */
+ u32int mxcsr; /* MMX control and status */
+ u32int mxcsrmask; /* supported MMX feature bits */
+ uchar st[128]; /* shared 64-bit media and x87 regs */
+ uchar xmm[256]; /* 128-bit media regs */
+ uchar ign[96]; /* reserved, ignored */
+};
+
+struct FPavxstate
+{
+ FPssestate;
+ uchar header[64]; /* XSAVE header */
+ uchar ymm[256]; /* upper 128-bit regs (AVX) */
+};
+
+struct FPsave
+{
+ FPavxstate;
+};
+
+enum
+{
+ FPinit,
+ FPactive,
+ FPinactive,
+ FPprotected,
+
+ FPillegal= 0x100, /* fp forbidden in note handler */
+};
+
+#define KFPSTATE
+
+struct PFPU
+{
+ int fpstate;
+ int kfpstate;
+ FPsave *fpsave;
+ FPsave *kfpsave;
+};
+
+struct Confmem
+{
+ uintptr base;
+ ulong npage;
+ uintptr kbase;
+ uintptr klimit;
+};
+
+struct Conf
+{
+ ulong nmach; /* processors */
+ ulong nproc; /* processes */
+ ulong monitor; /* has monitor? */
+ ulong npage; /* total physical pages of memory */
+ ulong upages; /* user page pool */
+ ulong nimage; /* number of page cache image headers */
+ ulong nswap; /* number of swap pages */
+ int nswppo; /* max # of pageouts per segment pass */
+ ulong copymode; /* 0 is copy on write, 1 is copy on reference */
+ ulong ialloc; /* max interrupt time allocation in bytes */
+ ulong pipeqsize; /* size in bytes of pipe queues */
+ int nuart; /* number of uart devices */
+ Confmem mem[64]; /* physical memory */
+};
+
+struct Segdesc
+{
+ u32int d0;
+ u32int d1;
+};
+
+/*
+ * MMU structure for PDP, PD, PT pages.
+ */
+struct MMU
+{
+ MMU *next;
+ uintptr *page;
+ int index;
+ int level;
+};
+
+/*
+ * MMU stuff in proc
+ */
+#define NCOLOR 1
+struct PMMU
+{
+ MMU* mmuhead;
+ MMU* mmutail;
+ MMU* kmaphead;
+ MMU* kmaptail;
+ ulong kmapcount;
+ ulong kmapindex;
+ ulong mmucount;
+
+ u64int dr[8];
+ void *vmx;
+};
+
+#define inittxtflush(p)
+#define settxtflush(p,c)
+
+#include "../port/portdat.h"
+
+typedef struct {
+ u32int _0_;
+ u32int rsp0[2];
+ u32int rsp1[2];
+ u32int rsp2[2];
+ u32int _28_[2];
+ u32int ist[14];
+ u16int _92_[5];
+ u16int iomap;
+} Tss;
+
+struct Mach
+{
+ int machno; /* physical id of processor */
+ uintptr splpc; /* pc of last caller to splhi */
+ Proc* proc; /* current process on this processor */
+
+ PMach;
+
+ uvlong tscticks;
+ ulong spuriousintr;
+ int lastintr;
+
+ int loopconst;
+ int delaylcycles;
+ int cpumhz;
+ uvlong cpuhz;
+
+ int cpuidax;
+ int cpuidcx;
+ int cpuiddx;
+ char cpuidid[16];
+ char* cpuidtype;
+ uchar cpuidfamily;
+ uchar cpuidmodel;
+ uchar cpuidstepping;
+
+ char havetsc;
+ char havepge;
+ char havewatchpt8;
+ char havenx;
+
+ int fpstate; /* FPU state for interrupts */
+ FPsave *fpsave;
+
+ u64int* pml4; /* pml4 base for this processor (va) */
+ Tss* tss; /* tss for this processor */
+ Segdesc*gdt; /* gdt for this processor */
+
+ u64int dr7; /* shadow copy of dr7 */
+ u64int xcr0;
+ void* vmx;
+
+ MMU* mmufree; /* freelist for MMU structures */
+ ulong mmucount; /* number of MMU structures in freelist */
+ u64int mmumap[4]; /* bitmap of pml4 entries for zapping */
+
+ NIX;
+
+ uintptr stack[1];
+};
+
+/*
+ * KMap the structure
+ */
+typedef void KMap;
+#define VA(k) ((void*)k)
+
+extern u32int MemMin;
+
+struct
+{
+ char machs[MAXMACH]; /* bitmap of active CPUs */
+ int exiting; /* shutdown */
+}active;
+
+/*
+ * routines for things outside the PC model, like power management
+ */
+struct PCArch
+{
+ char* id;
+ int (*ident)(void); /* this should be in the model */
+ void (*reset)(void); /* this should be in the model */
+
+ void (*intrinit)(void);
+ int (*intrassign)(Vctl*);
+ int (*intrirqno)(int, int);
+ int (*intrvecno)(int);
+ int (*intrspurious)(int);
+ void (*introff)(void);
+ void (*intron)(void);
+
+ void (*clockinit)(void);
+ void (*clockenable)(void);
+ uvlong (*fastclock)(uvlong*);
+ void (*timerset)(uvlong);
+};
+
+/* cpuid instruction result register bits */
+enum {
+ /* ax */
+ Xsaveopt = 1<<0,
+ Xsaves = 1<<3,
+
+ /* cx */
+ Monitor = 1<<3,
+ Xsave = 1<<26,
+ Avx = 1<<28,
+
+ /* dx */
+ Fpuonchip = 1<<0,
+ Vmex = 1<<1, /* virtual-mode extensions */
+ Pse = 1<<3, /* page size extensions */
+ Tsc = 1<<4, /* time-stamp counter */
+ Cpumsr = 1<<5, /* model-specific registers, rdmsr/wrmsr */
+ Pae = 1<<6, /* physical-addr extensions */
+ Mce = 1<<7, /* machine-check exception */
+ Cmpxchg8b = 1<<8,
+ Cpuapic = 1<<9,
+ Mtrr = 1<<12, /* memory-type range regs. */
+ Pge = 1<<13, /* page global extension */
+ Mca = 1<<14, /* machine-check architecture */
+ Pat = 1<<16, /* page attribute table */
+ Pse2 = 1<<17, /* more page size extensions */
+ Clflush = 1<<19,
+ Acpif = 1<<22, /* therm control msr */
+ Mmx = 1<<23,
+ Fxsr = 1<<24, /* have SSE FXSAVE/FXRSTOR */
+ Sse = 1<<25, /* thus sfence instr. */
+ Sse2 = 1<<26, /* thus mfence & lfence instr.s */
+ Rdrnd = 1<<30, /* RDRAND support bit */
+};
+
+enum { /* MSRs */
+ PerfEvtbase = 0xc0010000, /* Performance Event Select */
+ PerfCtrbase = 0xc0010004, /* Performance Counters */
+
+ Efer = 0xc0000080, /* Extended Feature Enable */
+ Star = 0xc0000081, /* Legacy Target IP and [CS]S */
+ Lstar = 0xc0000082, /* Long Mode Target IP */
+ Cstar = 0xc0000083, /* Compatibility Target IP */
+ Sfmask = 0xc0000084, /* SYSCALL Flags Mask */
+ FSbase = 0xc0000100, /* 64-bit FS Base Address */
+ GSbase = 0xc0000101, /* 64-bit GS Base Address */
+ KernelGSbase = 0xc0000102, /* SWAPGS instruction */
+};
+
+/*
+ * a parsed plan9.ini line
+ */
+#define NISAOPT 8
+
+struct ISAConf {
+ char *type;
+ uvlong port;
+ int irq;
+ ulong dma;
+ ulong mem;
+ ulong size;
+ ulong freq;
+
+ int nopt;
+ char *opt[NISAOPT];
+};
+
+extern PCArch *arch; /* PC architecture */
+
+Mach* machp[MAXMACH];
+
+#define MACHP(n) (machp[n])
+
+extern register Mach* m; /* R15 */
+extern register Proc* up; /* R14 */
+
+/*
+ * hardware info about a device
+ */
+typedef struct {
+ ulong port;
+ int size;
+} Devport;
+
+struct DevConf
+{
+ ulong intnum; /* interrupt number */
+ char *type; /* card type, malloced */
+ int nports; /* Number of ports */
+ Devport *ports; /* The ports themselves */
+};
+
+typedef struct BIOS32ci { /* BIOS32 Calling Interface */
+ u32int eax;
+ u32int ebx;
+ u32int ecx;
+ u32int edx;
+ u32int esi;
+ u32int edi;
+} BIOS32ci;