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