154 lines
2.3 KiB
C
154 lines
2.3 KiB
C
typedef struct PCIDev PCIDev;
|
|
typedef struct PCICap PCICap;
|
|
typedef struct PCIBar PCIBar;
|
|
typedef struct Region Region;
|
|
|
|
extern int irqactive;
|
|
|
|
enum {
|
|
VMRUNNING,
|
|
VMHALT,
|
|
VMDEAD,
|
|
};
|
|
extern int state;
|
|
|
|
enum {
|
|
BY2PG = 4096
|
|
};
|
|
|
|
#define RPC "pc"
|
|
#define RSP "sp"
|
|
#define RAX "ax"
|
|
#define RBX "bx"
|
|
#define RCX "cx"
|
|
#define RDX "dx"
|
|
#define RBP "bp"
|
|
#define RSI "si"
|
|
#define RDI "di"
|
|
#define R8 "r8"
|
|
#define R9 "r9"
|
|
#define R10 "r10"
|
|
#define R11 "r11"
|
|
#define R12 "r12"
|
|
#define R13 "r13"
|
|
#define R14 "r14"
|
|
#define R15 "r15"
|
|
#define RFLAGS "flags"
|
|
|
|
enum {
|
|
MMIORD = 0,
|
|
MMIOWRP = 1,
|
|
MMIOWR = 2,
|
|
};
|
|
|
|
struct Region {
|
|
uintptr start, end;
|
|
enum {
|
|
REGALLOC = 1, /* allocate memory for region */
|
|
REGR = 2, /* can read */
|
|
REGW = 4, /* can write */
|
|
REGX = 8, /* can execute */
|
|
|
|
REGRWX = REGR|REGW|REGX,
|
|
REGRX = REGR|REGX,
|
|
|
|
/* E820 types, 0 == omitted from memory map */
|
|
REGFREE = 1<<8, /* report to OS as free */
|
|
REGRES = 2<<8, /* report to OS as reserved */
|
|
} type;
|
|
char *segname;
|
|
uvlong segoff;
|
|
void *v, *ve;
|
|
Region *next;
|
|
int (*mmio)(uintptr, void *, int, int);
|
|
};
|
|
|
|
extern Region *mmap;
|
|
|
|
#define BDF(b,d,f) ((b)<<16&0xff0000|(d)<<11&0xf800|(f)<<8&0x700)
|
|
|
|
struct PCIBar {
|
|
PCIDev *d;
|
|
u8int type;
|
|
u32int addr, length;
|
|
PCIBar *busnext, *busprev;
|
|
u32int (*io)(int, u16int, u32int, int, void *);
|
|
void *aux;
|
|
};
|
|
|
|
enum {
|
|
/* type */
|
|
BARIO = 1,
|
|
BARMEM32 = 0,
|
|
BARMEM64 = 4,
|
|
BARPREF = 8,
|
|
};
|
|
|
|
struct PCIDev {
|
|
u32int bdf, viddid, clrev, subid;
|
|
u16int ctrl;
|
|
u8int irqno, irqactive;
|
|
PCIBar bar[6];
|
|
PCIDev *next;
|
|
PCICap *cap;
|
|
u8int capalloc;
|
|
};
|
|
|
|
struct PCICap {
|
|
PCIDev *dev;
|
|
u8int length;
|
|
u8int addr;
|
|
u32int (*read)(PCICap *, u8int);
|
|
void (*write)(PCICap *, u8int, u32int, u32int);
|
|
PCICap *next;
|
|
};
|
|
|
|
enum {
|
|
/* irqline argument */
|
|
IRQLTOGGLE = -1,
|
|
IRQLLOHI = -2,
|
|
|
|
/* postexc */
|
|
NOERRC = -1,
|
|
};
|
|
|
|
typedef struct VgaMode VgaMode;
|
|
struct VgaMode {
|
|
u16int no;
|
|
int w, h, hbytes, sz;
|
|
u32int chan;
|
|
VgaMode *next;
|
|
};
|
|
|
|
extern uchar cmos[0x30];
|
|
|
|
extern void (*kconfig)(void);
|
|
|
|
/* arguments for x86access */
|
|
enum {
|
|
SEGCS,
|
|
SEGDS,
|
|
SEGES,
|
|
SEGFS,
|
|
SEGGS,
|
|
SEGSS,
|
|
SEGMAX,
|
|
};
|
|
|
|
enum {
|
|
ACCR,
|
|
ACCW,
|
|
ACCX,
|
|
ACCSAFE = 0x100, /* don't post exceptions on fault */
|
|
};
|
|
|
|
/* used to speed up consecutive x86access calls */
|
|
typedef struct TLB TLB;
|
|
struct TLB {
|
|
int asz, seg, acc;
|
|
uintptr start, end;
|
|
uintptr pabase;
|
|
Region *reg;
|
|
uchar *base;
|
|
};
|