|
|
1.1 root 1: #ifndef QEMU_H
2: #define QEMU_H
3:
4: #include "thunk.h"
5:
6: #include <signal.h>
7: #include <string.h>
8: #include "syscall_defs.h"
9:
10: #include "cpu.h"
11: #include "syscall.h"
12: #include "gdbstub.h"
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: #ifdef TARGET_I386
37: /* Information about the current linux thread */
38: struct vm86_saved_state {
39: uint32_t eax; /* return code */
40: uint32_t ebx;
41: uint32_t ecx;
42: uint32_t edx;
43: uint32_t esi;
44: uint32_t edi;
45: uint32_t ebp;
46: uint32_t esp;
47: uint32_t eflags;
48: uint32_t eip;
49: uint16_t cs, ss, ds, es, fs, gs;
50: };
51: #endif
52:
53: #ifdef TARGET_ARM
54: /* FPU emulator */
55: #include "nwfpe/fpa11.h"
56: #endif
57:
58: /* NOTE: we force a big alignment so that the stack stored after is
59: aligned too */
60: typedef struct TaskState {
61: struct TaskState *next;
62: #ifdef TARGET_ARM
63: /* FPA state */
64: FPA11 fpa;
65: /* Extra fields for semihosted binaries. */
66: uint32_t stack_base;
67: uint32_t heap_base;
68: uint32_t heap_limit;
69: int swi_errno;
70: #endif
71: #ifdef TARGET_I386
1.1.1.2 ! root 72: target_ulong target_v86;
1.1 root 73: struct vm86_saved_state vm86_saved_regs;
74: struct target_vm86plus_struct vm86plus;
75: uint32_t v86flags;
76: uint32_t v86mask;
77: #endif
78: int used; /* non zero if used */
79: uint8_t stack[0];
80: } __attribute__((aligned(16))) TaskState;
81:
82: extern TaskState *first_task_state;
83:
84: int elf_exec(const char * filename, char ** argv, char ** envp,
85: struct target_pt_regs * regs, struct image_info *infop);
86:
1.1.1.2 ! root 87: void target_set_brk(target_ulong new_brk);
! 88: long do_brk(target_ulong new_brk);
1.1 root 89: void syscall_init(void);
90: long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
91: long arg4, long arg5, long arg6);
92: void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
93: extern CPUState *global_env;
94: void cpu_loop(CPUState *env);
95: void init_paths(const char *prefix);
96: const char *path(const char *pathname);
97:
98: extern int loglevel;
99: extern FILE *logfile;
100:
101: /* signal.c */
102: void process_pending_signals(void *cpu_env);
103: void signal_init(void);
104: int queue_signal(int sig, target_siginfo_t *info);
105: void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
106: void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
107: long do_sigreturn(CPUState *env);
108: long do_rt_sigreturn(CPUState *env);
109:
110: #ifdef TARGET_I386
111: /* vm86.c */
112: void save_v86_state(CPUX86State *env);
113: void handle_vm86_trap(CPUX86State *env, int trapno);
114: void handle_vm86_fault(CPUX86State *env);
1.1.1.2 ! root 115: int do_vm86(CPUX86State *env, long subfunction, target_ulong v86_addr);
1.1 root 116: #endif
117:
118: /* mmap.c */
1.1.1.2 ! root 119: int target_mprotect(target_ulong start, target_ulong len, int prot);
! 120: long target_mmap(target_ulong start, target_ulong len, int prot,
! 121: int flags, int fd, target_ulong offset);
! 122: int target_munmap(target_ulong start, target_ulong len);
! 123: long target_mremap(target_ulong old_addr, target_ulong old_size,
! 124: target_ulong new_size, unsigned long flags,
! 125: target_ulong new_addr);
! 126: int target_msync(target_ulong start, target_ulong len, int flags);
1.1 root 127:
128: /* user access */
129:
130: #define VERIFY_READ 0
131: #define VERIFY_WRITE 1
132:
133: #define access_ok(type,addr,size) (1)
134:
1.1.1.2 ! root 135: /* NOTE get_user and put_user use host addresses. */
1.1 root 136: #define __put_user(x,ptr)\
137: ({\
138: int size = sizeof(*ptr);\
139: switch(size) {\
140: case 1:\
1.1.1.2 ! root 141: *(uint8_t *)(ptr) = (typeof(*ptr))(x);\
1.1 root 142: break;\
143: case 2:\
1.1.1.2 ! root 144: *(uint16_t *)(ptr) = tswap16((typeof(*ptr))(x));\
1.1 root 145: break;\
146: case 4:\
1.1.1.2 ! root 147: *(uint32_t *)(ptr) = tswap32((typeof(*ptr))(x));\
1.1 root 148: break;\
149: case 8:\
1.1.1.2 ! root 150: *(uint64_t *)(ptr) = tswap64((typeof(*ptr))(x));\
1.1 root 151: break;\
152: default:\
153: abort();\
154: }\
155: 0;\
156: })
157:
158: #define __get_user(x, ptr) \
159: ({\
160: int size = sizeof(*ptr);\
161: switch(size) {\
162: case 1:\
1.1.1.2 ! root 163: x = (typeof(*ptr))*(uint8_t *)(ptr);\
1.1 root 164: break;\
165: case 2:\
1.1.1.2 ! root 166: x = (typeof(*ptr))tswap16(*(uint16_t *)(ptr));\
1.1 root 167: break;\
168: case 4:\
1.1.1.2 ! root 169: x = (typeof(*ptr))tswap32(*(uint32_t *)(ptr));\
1.1 root 170: break;\
171: case 8:\
1.1.1.2 ! root 172: x = (typeof(*ptr))tswap64(*(uint64_t *)(ptr));\
1.1 root 173: break;\
174: default:\
175: abort();\
176: }\
177: 0;\
178: })
179:
180: #define put_user(x,ptr)\
181: ({\
182: int __ret;\
183: if (access_ok(VERIFY_WRITE, ptr, sizeof(*ptr)))\
184: __ret = __put_user(x, ptr);\
185: else\
186: __ret = -EFAULT;\
187: __ret;\
188: })
189:
190: #define get_user(x,ptr)\
191: ({\
192: int __ret;\
193: if (access_ok(VERIFY_READ, ptr, sizeof(*ptr)))\
194: __ret = __get_user(x, ptr);\
195: else\
196: __ret = -EFAULT;\
197: __ret;\
198: })
199:
1.1.1.2 ! root 200: /* Functions for accessing guest memory. The tget and tput functions
! 201: read/write single values, byteswapping as neccessary. The lock_user
! 202: gets a pointer to a contiguous area of guest memory, but does not perform
! 203: and byteswapping. lock_user may return either a pointer to the guest
! 204: memory, or a temporary buffer. */
! 205:
! 206: /* Lock an area of guest memory into the host. If copy is true then the
! 207: host area will have the same contents as the guest. */
! 208: static inline void *lock_user(target_ulong guest_addr, long len, int copy)
! 209: {
! 210: #ifdef DEBUG_REMAP
! 211: void *addr;
! 212: addr = malloc(len);
! 213: if (copy)
! 214: memcpy(addr, g2h(guest_addr), len);
1.1 root 215: else
1.1.1.2 ! root 216: memset(addr, 0, len);
! 217: return addr;
! 218: #else
! 219: return g2h(guest_addr);
! 220: #endif
1.1 root 221: }
222:
1.1.1.2 ! root 223: /* Unlock an area of guest memory. The first LEN bytes must be flushed back
! 224: to guest memory. */
! 225: static inline void unlock_user(void *host_addr, target_ulong guest_addr,
! 226: long len)
! 227: {
! 228: #ifdef DEBUG_REMAP
! 229: if (host_addr == g2h(guest_addr))
! 230: return;
! 231: if (len > 0)
! 232: memcpy(g2h(guest_addr), host_addr, len);
! 233: free(host_addr);
! 234: #endif
1.1 root 235: }
236:
1.1.1.2 ! root 237: /* Return the length of a string in target memory. */
! 238: static inline int target_strlen(target_ulong ptr)
1.1 root 239: {
1.1.1.2 ! root 240: return strlen(g2h(ptr));
1.1 root 241: }
242:
1.1.1.2 ! root 243: /* Like lock_user but for null terminated strings. */
! 244: static inline void *lock_user_string(target_ulong guest_addr)
! 245: {
! 246: long len;
! 247: len = target_strlen(guest_addr) + 1;
! 248: return lock_user(guest_addr, len, 1);
! 249: }
! 250:
! 251: /* Helper macros for locking/ulocking a target struct. */
! 252: #define lock_user_struct(host_ptr, guest_addr, copy) \
! 253: host_ptr = lock_user(guest_addr, sizeof(*host_ptr), copy)
! 254: #define unlock_user_struct(host_ptr, guest_addr, copy) \
! 255: unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
! 256:
! 257: #define tget8(addr) ldub(addr)
! 258: #define tput8(addr, val) stb(addr, val)
! 259: #define tget16(addr) lduw(addr)
! 260: #define tput16(addr, val) stw(addr, val)
! 261: #define tget32(addr) ldl(addr)
! 262: #define tput32(addr, val) stl(addr, val)
! 263: #define tget64(addr) ldq(addr)
! 264: #define tput64(addr, val) stq(addr, val)
! 265: #if TARGET_LONG_BITS == 64
! 266: #define tgetl(addr) ldq(addr)
! 267: #define tputl(addr, val) stq(addr, val)
! 268: #else
! 269: #define tgetl(addr) ldl(addr)
! 270: #define tputl(addr, val) stl(addr, val)
! 271: #endif
! 272:
1.1 root 273: #endif /* QEMU_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.