|
|
1.1 root 1: #ifndef QEMU_H
2: #define QEMU_H
3:
4: #include <signal.h>
5: #include <string.h>
6:
7: #include "cpu.h"
8:
9: #undef DEBUG_REMAP
10: #ifdef DEBUG_REMAP
11: #include <stdlib.h>
12: #endif /* DEBUG_REMAP */
13:
14: #include "qemu-types.h"
15:
16: enum BSDType {
17: target_freebsd,
18: target_netbsd,
19: target_openbsd,
20: };
21:
22: #include "syscall_defs.h"
23: #include "syscall.h"
24: #include "target_signal.h"
25: #include "gdbstub.h"
26:
27: #if defined(USE_NPTL)
28: #define THREAD __thread
29: #else
30: #define THREAD
31: #endif
32:
33: /* This struct is used to hold certain information about the image.
34: * Basically, it replicates in user space what would be certain
35: * task_struct fields in the kernel
36: */
37: struct image_info {
38: abi_ulong load_addr;
39: abi_ulong start_code;
40: abi_ulong end_code;
41: abi_ulong start_data;
42: abi_ulong end_data;
43: abi_ulong start_brk;
44: abi_ulong brk;
45: abi_ulong start_mmap;
46: abi_ulong mmap;
47: abi_ulong rss;
48: abi_ulong start_stack;
49: abi_ulong entry;
50: abi_ulong code_offset;
51: abi_ulong data_offset;
52: char **host_argv;
53: int personality;
54: };
55:
56: #define MAX_SIGQUEUE_SIZE 1024
57:
58: struct sigqueue {
59: struct sigqueue *next;
60: //target_siginfo_t info;
61: };
62:
63: struct emulated_sigtable {
64: int pending; /* true if signal is pending */
65: struct sigqueue *first;
66: struct sigqueue info; /* in order to always have memory for the
67: first signal, we put it here */
68: };
69:
70: /* NOTE: we force a big alignment so that the stack stored after is
71: aligned too */
72: typedef struct TaskState {
73: struct TaskState *next;
74: int used; /* non zero if used */
75: struct image_info *info;
76:
77: struct emulated_sigtable sigtab[TARGET_NSIG];
78: struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
79: struct sigqueue *first_free; /* first free siginfo queue entry */
80: int signal_pending; /* non zero if a signal may be pending */
81:
82: uint8_t stack[0];
83: } __attribute__((aligned(16))) TaskState;
84:
85: void init_task_state(TaskState *ts);
86: extern const char *qemu_uname_release;
87:
88: /* ??? See if we can avoid exposing so much of the loader internals. */
89: /*
90: * MAX_ARG_PAGES defines the number of pages allocated for arguments
91: * and envelope for the new program. 32 should suffice, this gives
92: * a maximum env+arg of 128kB w/4KB pages!
93: */
94: #define MAX_ARG_PAGES 32
95:
96: /*
97: * This structure is used to hold the arguments that are
98: * used when loading binaries.
99: */
100: struct linux_binprm {
101: char buf[128];
102: void *page[MAX_ARG_PAGES];
103: abi_ulong p;
104: int fd;
105: int e_uid, e_gid;
106: int argc, envc;
107: char **argv;
108: char **envp;
109: char * filename; /* Name of binary */
110: };
111:
112: void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
113: abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
114: abi_ulong stringp, int push_ptr);
115: int loader_exec(const char * filename, char ** argv, char ** envp,
116: struct target_pt_regs * regs, struct image_info *infop);
117:
118: int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
119: struct image_info * info);
120: int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
121: struct image_info * info);
122:
123: abi_long memcpy_to_target(abi_ulong dest, const void *src,
124: unsigned long len);
125: void target_set_brk(abi_ulong new_brk);
126: abi_long do_brk(abi_ulong new_brk);
127: void syscall_init(void);
128: abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
129: abi_long arg2, abi_long arg3, abi_long arg4,
130: abi_long arg5, abi_long arg6);
131: abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
132: abi_long arg2, abi_long arg3, abi_long arg4,
133: abi_long arg5, abi_long arg6);
134: abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
135: abi_long arg2, abi_long arg3, abi_long arg4,
136: abi_long arg5, abi_long arg6);
137: void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
138: extern THREAD CPUState *thread_env;
139: void cpu_loop(CPUState *env, enum BSDType bsd_type);
140: void init_paths(const char *prefix);
141: const char *path(const char *pathname);
142: char *target_strerror(int err);
143: int get_osversion(void);
144: void fork_start(void);
145: void fork_end(int child);
146:
147: #include "qemu-log.h"
148:
149: /* strace.c */
150: void
151: print_freebsd_syscall(int num,
152: abi_long arg1, abi_long arg2, abi_long arg3,
153: abi_long arg4, abi_long arg5, abi_long arg6);
154: void print_freebsd_syscall_ret(int num, abi_long ret);
155: void
156: print_netbsd_syscall(int num,
157: abi_long arg1, abi_long arg2, abi_long arg3,
158: abi_long arg4, abi_long arg5, abi_long arg6);
159: void print_netbsd_syscall_ret(int num, abi_long ret);
160: void
161: print_openbsd_syscall(int num,
162: abi_long arg1, abi_long arg2, abi_long arg3,
163: abi_long arg4, abi_long arg5, abi_long arg6);
164: void print_openbsd_syscall_ret(int num, abi_long ret);
165: extern int do_strace;
166:
167: /* signal.c */
168: void process_pending_signals(CPUState *cpu_env);
169: void signal_init(void);
170: //int queue_signal(CPUState *env, int sig, target_siginfo_t *info);
171: //void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
172: //void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
173: long do_sigreturn(CPUState *env);
174: long do_rt_sigreturn(CPUState *env);
175: abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
176:
177: /* mmap.c */
178: int target_mprotect(abi_ulong start, abi_ulong len, int prot);
179: abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
180: int flags, int fd, abi_ulong offset);
181: int target_munmap(abi_ulong start, abi_ulong len);
182: abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
183: abi_ulong new_size, unsigned long flags,
184: abi_ulong new_addr);
185: int target_msync(abi_ulong start, abi_ulong len, int flags);
186: extern unsigned long last_brk;
187: void mmap_lock(void);
188: void mmap_unlock(void);
1.1.1.2 ! root 189: void cpu_list_lock(void);
! 190: void cpu_list_unlock(void);
1.1 root 191: #if defined(USE_NPTL)
192: void mmap_fork_start(void);
193: void mmap_fork_end(int child);
194: #endif
195:
1.1.1.2 ! root 196: /* main.c */
! 197: extern unsigned long x86_stack_size;
! 198:
1.1 root 199: /* user access */
200:
201: #define VERIFY_READ 0
202: #define VERIFY_WRITE 1 /* implies read access */
203:
204: static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
205: {
206: return page_check_range((target_ulong)addr, size,
207: (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0;
208: }
209:
210: /* NOTE __get_user and __put_user use host pointers and don't check access. */
211: /* These are usually used to access struct data members once the
212: * struct has been locked - usually with lock_user_struct().
213: */
214: #define __put_user(x, hptr)\
215: ({\
216: int size = sizeof(*hptr);\
217: switch(size) {\
218: case 1:\
219: *(uint8_t *)(hptr) = (uint8_t)(typeof(*hptr))(x);\
220: break;\
221: case 2:\
222: *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\
223: break;\
224: case 4:\
225: *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\
226: break;\
227: case 8:\
228: *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\
229: break;\
230: default:\
231: abort();\
232: }\
233: 0;\
234: })
235:
236: #define __get_user(x, hptr) \
237: ({\
238: int size = sizeof(*hptr);\
239: switch(size) {\
240: case 1:\
241: x = (typeof(*hptr))*(uint8_t *)(hptr);\
242: break;\
243: case 2:\
244: x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\
245: break;\
246: case 4:\
247: x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\
248: break;\
249: case 8:\
250: x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\
251: break;\
252: default:\
253: /* avoid warning */\
254: x = 0;\
255: abort();\
256: }\
257: 0;\
258: })
259:
260: /* put_user()/get_user() take a guest address and check access */
261: /* These are usually used to access an atomic data type, such as an int,
262: * that has been passed by address. These internally perform locking
263: * and unlocking on the data type.
264: */
265: #define put_user(x, gaddr, target_type) \
266: ({ \
267: abi_ulong __gaddr = (gaddr); \
268: target_type *__hptr; \
269: abi_long __ret; \
270: if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \
271: __ret = __put_user((x), __hptr); \
272: unlock_user(__hptr, __gaddr, sizeof(target_type)); \
273: } else \
274: __ret = -TARGET_EFAULT; \
275: __ret; \
276: })
277:
278: #define get_user(x, gaddr, target_type) \
279: ({ \
280: abi_ulong __gaddr = (gaddr); \
281: target_type *__hptr; \
282: abi_long __ret; \
283: if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
284: __ret = __get_user((x), __hptr); \
285: unlock_user(__hptr, __gaddr, 0); \
286: } else { \
287: /* avoid warning */ \
288: (x) = 0; \
289: __ret = -TARGET_EFAULT; \
290: } \
291: __ret; \
292: })
293:
294: #define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong)
295: #define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long)
296: #define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t)
297: #define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t)
298: #define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t)
299: #define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t)
300: #define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t)
301: #define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t)
302: #define put_user_u8(x, gaddr) put_user((x), (gaddr), uint8_t)
303: #define put_user_s8(x, gaddr) put_user((x), (gaddr), int8_t)
304:
305: #define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong)
306: #define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long)
307: #define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t)
308: #define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t)
309: #define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t)
310: #define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t)
311: #define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t)
312: #define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t)
313: #define get_user_u8(x, gaddr) get_user((x), (gaddr), uint8_t)
314: #define get_user_s8(x, gaddr) get_user((x), (gaddr), int8_t)
315:
316: /* copy_from_user() and copy_to_user() are usually used to copy data
317: * buffers between the target and host. These internally perform
318: * locking/unlocking of the memory.
319: */
320: abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len);
321: abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len);
322:
323: /* Functions for accessing guest memory. The tget and tput functions
324: read/write single values, byteswapping as neccessary. The lock_user
325: gets a pointer to a contiguous area of guest memory, but does not perform
326: and byteswapping. lock_user may return either a pointer to the guest
327: memory, or a temporary buffer. */
328:
329: /* Lock an area of guest memory into the host. If copy is true then the
330: host area will have the same contents as the guest. */
331: static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy)
332: {
333: if (!access_ok(type, guest_addr, len))
334: return NULL;
335: #ifdef DEBUG_REMAP
336: {
337: void *addr;
338: addr = malloc(len);
339: if (copy)
340: memcpy(addr, g2h(guest_addr), len);
341: else
342: memset(addr, 0, len);
343: return addr;
344: }
345: #else
346: return g2h(guest_addr);
347: #endif
348: }
349:
350: /* Unlock an area of guest memory. The first LEN bytes must be
351: flushed back to guest memory. host_ptr = NULL is explicitly
352: allowed and does nothing. */
353: static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
354: long len)
355: {
356:
357: #ifdef DEBUG_REMAP
358: if (!host_ptr)
359: return;
360: if (host_ptr == g2h(guest_addr))
361: return;
362: if (len > 0)
363: memcpy(g2h(guest_addr), host_ptr, len);
364: free(host_ptr);
365: #endif
366: }
367:
368: /* Return the length of a string in target memory or -TARGET_EFAULT if
369: access error. */
370: abi_long target_strlen(abi_ulong gaddr);
371:
372: /* Like lock_user but for null terminated strings. */
373: static inline void *lock_user_string(abi_ulong guest_addr)
374: {
375: abi_long len;
376: len = target_strlen(guest_addr);
377: if (len < 0)
378: return NULL;
379: return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1);
380: }
381:
382: /* Helper macros for locking/ulocking a target struct. */
383: #define lock_user_struct(type, host_ptr, guest_addr, copy) \
384: (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
385: #define unlock_user_struct(host_ptr, guest_addr, copy) \
386: unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
387:
388: #if defined(USE_NPTL)
389: #include <pthread.h>
390: #endif
391:
392: #endif /* QEMU_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.