1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24: #ifndef KQEMU_H
25: #define KQEMU_H
26:
27: #define KQEMU_VERSION 0x010300
28:
29: struct kqemu_segment_cache {
30: uint32_t selector;
31: unsigned long base;
32: uint32_t limit;
33: uint32_t flags;
34: };
35:
36: struct kqemu_cpu_state {
37: #ifdef __x86_64__
38: unsigned long regs[16];
39: #else
40: unsigned long regs[8];
41: #endif
42: unsigned long eip;
43: unsigned long eflags;
44:
45: uint32_t dummy0, dummy1, dumm2, dummy3, dummy4;
46:
47: struct kqemu_segment_cache segs[6];
48: struct kqemu_segment_cache ldt;
49: struct kqemu_segment_cache tr;
50: struct kqemu_segment_cache gdt;
51: struct kqemu_segment_cache idt;
52:
53: unsigned long cr0;
54: unsigned long dummy5;
55: unsigned long cr2;
56: unsigned long cr3;
57: unsigned long cr4;
58: uint32_t a20_mask;
59:
60:
61: uint32_t sysenter_cs;
62: uint32_t sysenter_esp;
63: uint32_t sysenter_eip;
64: uint64_t efer __attribute__((aligned(8)));
65: uint64_t star;
66: #ifdef __x86_64__
67: unsigned long lstar;
68: unsigned long cstar;
69: unsigned long fmask;
70: unsigned long kernelgsbase;
71: #endif
72: uint64_t tsc_offset;
73:
74: unsigned long dr0;
75: unsigned long dr1;
76: unsigned long dr2;
77: unsigned long dr3;
78: unsigned long dr6;
79: unsigned long dr7;
80:
81: uint8_t cpl;
82: uint8_t user_only;
83:
84: uint32_t error_code;
85: unsigned long next_eip;
86: unsigned int nb_pages_to_flush;
87:
88: #define KQEMU_MAX_PAGES_TO_FLUSH 512
89: #define KQEMU_FLUSH_ALL (KQEMU_MAX_PAGES_TO_FLUSH + 1)
90:
91: long retval;
92:
93:
94: unsigned int nb_ram_pages_to_update;
95: #define KQEMU_MAX_RAM_PAGES_TO_UPDATE 512
96: #define KQEMU_RAM_PAGES_UPDATE_ALL (KQEMU_MAX_RAM_PAGES_TO_UPDATE + 1)
97:
98: #define KQEMU_MAX_MODIFIED_RAM_PAGES 512
99: unsigned int nb_modified_ram_pages;
100: };
101:
102: struct kqemu_init {
103: uint8_t *ram_base;
104: unsigned long ram_size;
105: uint8_t *ram_dirty;
106: uint32_t **phys_to_ram_map;
107: unsigned long *pages_to_flush;
108: unsigned long *ram_pages_to_update;
109: unsigned long *modified_ram_pages;
110: };
111:
112: #define KQEMU_RET_ABORT (-1)
113: #define KQEMU_RET_EXCEPTION 0x0000
114: #define KQEMU_RET_INT 0x0100
115: #define KQEMU_RET_SOFTMMU 0x0200
116:
117: #define KQEMU_RET_INTR 0x0201
118: #define KQEMU_RET_SYSCALL 0x0300
119:
120: #ifdef _WIN32
121: #define KQEMU_EXEC CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
122: #define KQEMU_INIT CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
123: #define KQEMU_GET_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, 3, METHOD_BUFFERED, FILE_READ_ACCESS)
124: #define KQEMU_MODIFY_RAM_PAGES CTL_CODE(FILE_DEVICE_UNKNOWN, 4, METHOD_BUFFERED, FILE_WRITE_ACCESS)
125: #else
126: #define KQEMU_EXEC _IOWR('q', 1, struct kqemu_cpu_state)
127: #define KQEMU_INIT _IOW('q', 2, struct kqemu_init)
128: #define KQEMU_GET_VERSION _IOR('q', 3, int)
129: #define KQEMU_MODIFY_RAM_PAGES _IOW('q', 4, int)
130: #endif
131:
132: #endif