fixed 32 bit popf/iret emulation in vm86 mode
[qemu] / linux-user / qemu.h
1 #ifndef GEMU_H
2 #define GEMU_H
3
4 #include "thunk.h"
5
6 #include <signal.h>
7 #include "syscall_defs.h"
8
9 #ifdef TARGET_I386
10 #include "cpu-i386.h"
11 #include "syscall-i386.h"
12 #endif
13
14 /* This struct is used to hold certain information about the image.
15  * Basically, it replicates in user space what would be certain
16  * task_struct fields in the kernel
17  */
18 struct image_info {
19         unsigned long   start_code;
20         unsigned long   end_code;
21         unsigned long   end_data;
22         unsigned long   start_brk;
23         unsigned long   brk;
24         unsigned long   start_mmap;
25         unsigned long   mmap;
26         unsigned long   rss;
27         unsigned long   start_stack;
28         unsigned long   arg_start;
29         unsigned long   arg_end;
30         unsigned long   env_start;
31         unsigned long   env_end;
32         unsigned long   entry;
33         int             personality;
34 };
35
36 /* Information about the current linux thread */
37 struct vm86_saved_state {
38     uint32_t eax; /* return code */
39     uint32_t ebx;
40     uint32_t ecx;
41     uint32_t edx;
42     uint32_t esi;
43     uint32_t edi;
44     uint32_t ebp;
45     uint32_t esp;
46     uint32_t eflags;
47     uint32_t eip;
48     uint16_t cs, ss, ds, es, fs, gs;
49 };
50
51 /* NOTE: we force a big alignment so that the stack stored after is
52    aligned too */
53 typedef struct TaskState {
54     struct TaskState *next;
55     struct target_vm86plus_struct *target_v86;
56     struct vm86_saved_state vm86_saved_regs;
57     struct target_vm86plus_struct vm86plus;
58     uint32_t v86flags;
59     uint32_t v86mask;
60     int used; /* non zero if used */
61     uint8_t stack[0];
62 } __attribute__((aligned(16))) TaskState;
63
64 extern TaskState *first_task_state;
65
66 int elf_exec(const char * filename, char ** argv, char ** envp, 
67              struct target_pt_regs * regs, struct image_info *infop);
68
69 void target_set_brk(char *new_brk);
70 void syscall_init(void);
71 long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, 
72                 long arg4, long arg5, long arg6);
73 void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
74 extern CPUX86State *global_env;
75 void cpu_loop(CPUX86State *env);
76 void process_pending_signals(void *cpu_env);
77 void signal_init(void);
78 int queue_signal(int sig, target_siginfo_t *info);
79 void init_paths(const char *prefix);
80 const char *path(const char *pathname);
81
82 extern int loglevel;
83 extern FILE *logfile;
84
85 /* vm86.c */
86 void save_v86_state(CPUX86State *env);
87 void handle_vm86_trap(CPUX86State *env, int trapno);
88 void handle_vm86_fault(CPUX86State *env);
89 int do_vm86(CPUX86State *env, long subfunction, 
90             struct target_vm86plus_struct * target_v86);
91
92 /* mmap.c */
93 int target_mprotect(unsigned long start, unsigned long len, int prot);
94 long target_mmap(unsigned long start, unsigned long len, int prot, 
95                  int flags, int fd, unsigned long offset);
96 int target_munmap(unsigned long start, unsigned long len);
97 long target_mremap(unsigned long old_addr, unsigned long old_size, 
98                    unsigned long new_size, unsigned long flags,
99                    unsigned long new_addr);
100 int target_msync(unsigned long start, unsigned long len, int flags);
101
102 #endif