0.7.1-alt1
[qemu] / kqemu / kqemu.h
1 #ifndef KQEMU_H
2 #define KQEMU_H
3
4 #define KQEMU_VERSION 0x010100
5
6 struct kqemu_segment_cache {
7     uint32_t selector;
8     unsigned long base;
9     uint32_t limit;
10     uint32_t flags;
11 };
12
13 struct kqemu_cpu_state {
14 #ifdef __x86_64__
15     unsigned long regs[16];
16 #else
17     unsigned long regs[8];
18 #endif
19     unsigned long eip;
20     unsigned long eflags;
21
22     uint32_t dummy0, dummy1, dumm2, dummy3, dummy4;
23
24     struct kqemu_segment_cache segs[6]; /* selector values */
25     struct kqemu_segment_cache ldt;
26     struct kqemu_segment_cache tr;
27     struct kqemu_segment_cache gdt; /* only base and limit are used */
28     struct kqemu_segment_cache idt; /* only base and limit are used */
29
30     unsigned long cr0;
31     unsigned long dummy5;
32     unsigned long cr2;
33     unsigned long cr3;
34     unsigned long cr4;
35     uint32_t a20_mask;
36
37     uint64_t efer __attribute__((aligned(8)));
38
39     unsigned long dr0;
40     unsigned long dr1;
41     unsigned long dr2;
42     unsigned long dr3;
43     unsigned long dr6;
44     unsigned long dr7;
45
46     int cpl; /* currently only 3 */
47
48     uint32_t error_code; /* error_code when exiting with an exception */
49     unsigned long next_eip; /* next eip value when exiting with an interrupt */
50     unsigned int nb_pages_to_flush; /* number of pages to flush,
51                                        KQEMU_FLUSH_ALL means full flush */
52 #define KQEMU_MAX_PAGES_TO_FLUSH 512
53 #define KQEMU_FLUSH_ALL (KQEMU_MAX_PAGES_TO_FLUSH + 1)
54
55     long retval;
56 };
57
58 struct kqemu_init {
59     uint8_t *ram_base; /* must be page aligned */
60     unsigned long ram_size; /* must be multiple of 4 KB */
61     uint8_t *ram_dirty; /* must be page aligned */
62     uint32_t **phys_to_ram_map; /* must be page aligned */
63     unsigned long *pages_to_flush; /* must be page aligned */
64 };
65
66 #define KQEMU_RET_ABORT    (-1)
67 #define KQEMU_RET_EXCEPTION 0x0000 /* 8 low order bit are the exception */
68 #define KQEMU_RET_INT       0x0100 /* 8 low order bit are the interrupt */
69 #define KQEMU_RET_SOFTMMU   0x0200 /* emulation needed (I/O or
70                                       unsupported INSN) */
71 #define KQEMU_RET_INTR      0x0201 /* interrupted by a signal */
72 #define KQEMU_RET_SYSCALL   0x0300 /* syscall insn */
73
74 #ifdef _WIN32
75 #define KQEMU_EXEC           CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
76 #define KQEMU_INIT           CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
77 #define KQEMU_GET_VERSION    CTL_CODE(FILE_DEVICE_UNKNOWN, 3, METHOD_BUFFERED, FILE_READ_ACCESS)
78 #else
79 #define KQEMU_EXEC           _IOWR('q', 1, struct kqemu_cpu_state)
80 #define KQEMU_INIT           _IOW('q', 2, struct kqemu_init)
81 #define KQEMU_GET_VERSION    _IOR('q', 3, int)
82 #endif
83
84 #ifdef __KERNEL__
85 struct kqemu_state;
86
87 #define CDECL __attribute__((regparm(0)))
88
89 struct kqemu_state * CDECL kqemu_init(struct kqemu_init *d, int max_locked_pages);
90 struct kqemu_cpu_state * CDECL kqemu_get_cpu_state(struct kqemu_state *s);
91 long CDECL kqemu_exec(struct kqemu_state *s);
92 void CDECL kqemu_delete(struct kqemu_state *s);
93
94 /* callbacks */
95 struct kqemu_page; /* opaque data for host page */
96 struct kqemu_user_page; /* opaque data for host user page */
97
98 struct kqemu_user_page *CDECL kqemu_lock_user_page(unsigned long *ppage_index,
99                                                    unsigned long user_addr);
100 void CDECL kqemu_unlock_user_page(struct kqemu_user_page *page);
101
102 struct kqemu_page *CDECL kqemu_alloc_zeroed_page(unsigned long *ppage_index);
103 void CDECL kqemu_free_page(struct kqemu_page *page);
104 void * CDECL kqemu_page_kaddr(struct kqemu_page *page);
105
106 void * CDECL kqemu_vmalloc(unsigned int size);
107 void CDECL kqemu_vfree(void *ptr);
108 unsigned long CDECL kqemu_vmalloc_to_phys(const void *vaddr);
109
110 void * CDECL kqemu_io_map(unsigned long page_index, unsigned int size);
111 void CDECL kqemu_io_unmap(void *ptr, unsigned int size);
112
113 int CDECL kqemu_schedule(void);
114
115 void CDECL kqemu_log(const char *fmt, ...);
116
117 #endif
118
119 #endif /* KQEMU_H */