|
|
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); ! 189: #if defined(USE_NPTL) ! 190: void mmap_fork_start(void); ! 191: void mmap_fork_end(int child); ! 192: #endif ! 193: ! 194: /* user access */ ! 195: ! 196: #define VERIFY_READ 0 ! 197: #define VERIFY_WRITE 1 /* implies read access */ ! 198: ! 199: static inline int access_ok(int type, abi_ulong addr, abi_ulong size) ! 200: { ! 201: return page_check_range((target_ulong)addr, size, ! 202: (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0; ! 203: } ! 204: ! 205: /* NOTE __get_user and __put_user use host pointers and don't check access. */ ! 206: /* These are usually used to access struct data members once the ! 207: * struct has been locked - usually with lock_user_struct(). ! 208: */ ! 209: #define __put_user(x, hptr)\ ! 210: ({\ ! 211: int size = sizeof(*hptr);\ ! 212: switch(size) {\ ! 213: case 1:\ ! 214: *(uint8_t *)(hptr) = (uint8_t)(typeof(*hptr))(x);\ ! 215: break;\ ! 216: case 2:\ ! 217: *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\ ! 218: break;\ ! 219: case 4:\ ! 220: *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\ ! 221: break;\ ! 222: case 8:\ ! 223: *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\ ! 224: break;\ ! 225: default:\ ! 226: abort();\ ! 227: }\ ! 228: 0;\ ! 229: }) ! 230: ! 231: #define __get_user(x, hptr) \ ! 232: ({\ ! 233: int size = sizeof(*hptr);\ ! 234: switch(size) {\ ! 235: case 1:\ ! 236: x = (typeof(*hptr))*(uint8_t *)(hptr);\ ! 237: break;\ ! 238: case 2:\ ! 239: x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\ ! 240: break;\ ! 241: case 4:\ ! 242: x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\ ! 243: break;\ ! 244: case 8:\ ! 245: x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\ ! 246: break;\ ! 247: default:\ ! 248: /* avoid warning */\ ! 249: x = 0;\ ! 250: abort();\ ! 251: }\ ! 252: 0;\ ! 253: }) ! 254: ! 255: /* put_user()/get_user() take a guest address and check access */ ! 256: /* These are usually used to access an atomic data type, such as an int, ! 257: * that has been passed by address. These internally perform locking ! 258: * and unlocking on the data type. ! 259: */ ! 260: #define put_user(x, gaddr, target_type) \ ! 261: ({ \ ! 262: abi_ulong __gaddr = (gaddr); \ ! 263: target_type *__hptr; \ ! 264: abi_long __ret; \ ! 265: if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \ ! 266: __ret = __put_user((x), __hptr); \ ! 267: unlock_user(__hptr, __gaddr, sizeof(target_type)); \ ! 268: } else \ ! 269: __ret = -TARGET_EFAULT; \ ! 270: __ret; \ ! 271: }) ! 272: ! 273: #define get_user(x, gaddr, target_type) \ ! 274: ({ \ ! 275: abi_ulong __gaddr = (gaddr); \ ! 276: target_type *__hptr; \ ! 277: abi_long __ret; \ ! 278: if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \ ! 279: __ret = __get_user((x), __hptr); \ ! 280: unlock_user(__hptr, __gaddr, 0); \ ! 281: } else { \ ! 282: /* avoid warning */ \ ! 283: (x) = 0; \ ! 284: __ret = -TARGET_EFAULT; \ ! 285: } \ ! 286: __ret; \ ! 287: }) ! 288: ! 289: #define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong) ! 290: #define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long) ! 291: #define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t) ! 292: #define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t) ! 293: #define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t) ! 294: #define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t) ! 295: #define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t) ! 296: #define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t) ! 297: #define put_user_u8(x, gaddr) put_user((x), (gaddr), uint8_t) ! 298: #define put_user_s8(x, gaddr) put_user((x), (gaddr), int8_t) ! 299: ! 300: #define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong) ! 301: #define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long) ! 302: #define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t) ! 303: #define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t) ! 304: #define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t) ! 305: #define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t) ! 306: #define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t) ! 307: #define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t) ! 308: #define get_user_u8(x, gaddr) get_user((x), (gaddr), uint8_t) ! 309: #define get_user_s8(x, gaddr) get_user((x), (gaddr), int8_t) ! 310: ! 311: /* copy_from_user() and copy_to_user() are usually used to copy data ! 312: * buffers between the target and host. These internally perform ! 313: * locking/unlocking of the memory. ! 314: */ ! 315: abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len); ! 316: abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len); ! 317: ! 318: /* Functions for accessing guest memory. The tget and tput functions ! 319: read/write single values, byteswapping as neccessary. The lock_user ! 320: gets a pointer to a contiguous area of guest memory, but does not perform ! 321: and byteswapping. lock_user may return either a pointer to the guest ! 322: memory, or a temporary buffer. */ ! 323: ! 324: /* Lock an area of guest memory into the host. If copy is true then the ! 325: host area will have the same contents as the guest. */ ! 326: static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy) ! 327: { ! 328: if (!access_ok(type, guest_addr, len)) ! 329: return NULL; ! 330: #ifdef DEBUG_REMAP ! 331: { ! 332: void *addr; ! 333: addr = malloc(len); ! 334: if (copy) ! 335: memcpy(addr, g2h(guest_addr), len); ! 336: else ! 337: memset(addr, 0, len); ! 338: return addr; ! 339: } ! 340: #else ! 341: return g2h(guest_addr); ! 342: #endif ! 343: } ! 344: ! 345: /* Unlock an area of guest memory. The first LEN bytes must be ! 346: flushed back to guest memory. host_ptr = NULL is explicitly ! 347: allowed and does nothing. */ ! 348: static inline void unlock_user(void *host_ptr, abi_ulong guest_addr, ! 349: long len) ! 350: { ! 351: ! 352: #ifdef DEBUG_REMAP ! 353: if (!host_ptr) ! 354: return; ! 355: if (host_ptr == g2h(guest_addr)) ! 356: return; ! 357: if (len > 0) ! 358: memcpy(g2h(guest_addr), host_ptr, len); ! 359: free(host_ptr); ! 360: #endif ! 361: } ! 362: ! 363: /* Return the length of a string in target memory or -TARGET_EFAULT if ! 364: access error. */ ! 365: abi_long target_strlen(abi_ulong gaddr); ! 366: ! 367: /* Like lock_user but for null terminated strings. */ ! 368: static inline void *lock_user_string(abi_ulong guest_addr) ! 369: { ! 370: abi_long len; ! 371: len = target_strlen(guest_addr); ! 372: if (len < 0) ! 373: return NULL; ! 374: return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1); ! 375: } ! 376: ! 377: /* Helper macros for locking/ulocking a target struct. */ ! 378: #define lock_user_struct(type, host_ptr, guest_addr, copy) \ ! 379: (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy)) ! 380: #define unlock_user_struct(host_ptr, guest_addr, copy) \ ! 381: unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0) ! 382: ! 383: #if defined(USE_NPTL) ! 384: #include <pthread.h> ! 385: #endif ! 386: ! 387: #endif /* QEMU_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.