|
|
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 ! 72: struct target_vm86plus_struct *target_v86; ! 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: ! 87: void target_set_brk(char *new_brk); ! 88: long do_brk(char *new_brk); ! 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); ! 115: int do_vm86(CPUX86State *env, long subfunction, ! 116: struct target_vm86plus_struct * target_v86); ! 117: #endif ! 118: ! 119: /* mmap.c */ ! 120: int target_mprotect(unsigned long start, unsigned long len, int prot); ! 121: long target_mmap(unsigned long start, unsigned long len, int prot, ! 122: int flags, int fd, unsigned long offset); ! 123: int target_munmap(unsigned long start, unsigned long len); ! 124: long target_mremap(unsigned long old_addr, unsigned long old_size, ! 125: unsigned long new_size, unsigned long flags, ! 126: unsigned long new_addr); ! 127: int target_msync(unsigned long start, unsigned long len, int flags); ! 128: ! 129: /* user access */ ! 130: ! 131: #define VERIFY_READ 0 ! 132: #define VERIFY_WRITE 1 ! 133: ! 134: #define access_ok(type,addr,size) (1) ! 135: ! 136: #define __put_user(x,ptr)\ ! 137: ({\ ! 138: int size = sizeof(*ptr);\ ! 139: switch(size) {\ ! 140: case 1:\ ! 141: stb(ptr, (typeof(*ptr))(x));\ ! 142: break;\ ! 143: case 2:\ ! 144: stw(ptr, (typeof(*ptr))(x));\ ! 145: break;\ ! 146: case 4:\ ! 147: stl(ptr, (typeof(*ptr))(x));\ ! 148: break;\ ! 149: case 8:\ ! 150: stq(ptr, (typeof(*ptr))(x));\ ! 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:\ ! 163: x = (typeof(*ptr))ldub((void *)ptr);\ ! 164: break;\ ! 165: case 2:\ ! 166: x = (typeof(*ptr))lduw((void *)ptr);\ ! 167: break;\ ! 168: case 4:\ ! 169: x = (typeof(*ptr))ldl((void *)ptr);\ ! 170: break;\ ! 171: case 8:\ ! 172: x = (typeof(*ptr))ldq((void *)ptr);\ ! 173: break;\ ! 174: default:\ ! 175: abort();\ ! 176: }\ ! 177: 0;\ ! 178: }) ! 179: ! 180: static inline unsigned long __copy_to_user(void *dst, const void *src, ! 181: unsigned long size) ! 182: { ! 183: memcpy(dst, src, size); ! 184: return 0; ! 185: } ! 186: ! 187: static inline unsigned long __copy_from_user(void *dst, const void *src, ! 188: unsigned long size) ! 189: { ! 190: memcpy(dst, src, size); ! 191: return 0; ! 192: } ! 193: ! 194: static inline unsigned long __clear_user(void *dst, unsigned long size) ! 195: { ! 196: memset(dst, 0, size); ! 197: return 0; ! 198: } ! 199: ! 200: #define put_user(x,ptr)\ ! 201: ({\ ! 202: int __ret;\ ! 203: if (access_ok(VERIFY_WRITE, ptr, sizeof(*ptr)))\ ! 204: __ret = __put_user(x, ptr);\ ! 205: else\ ! 206: __ret = -EFAULT;\ ! 207: __ret;\ ! 208: }) ! 209: ! 210: #define get_user(x,ptr)\ ! 211: ({\ ! 212: int __ret;\ ! 213: if (access_ok(VERIFY_READ, ptr, sizeof(*ptr)))\ ! 214: __ret = __get_user(x, ptr);\ ! 215: else\ ! 216: __ret = -EFAULT;\ ! 217: __ret;\ ! 218: }) ! 219: ! 220: static inline unsigned long copy_to_user(void *dst, const void *src, ! 221: unsigned long size) ! 222: { ! 223: if (access_ok(VERIFY_WRITE, dst, size)) ! 224: return __copy_to_user(dst, src, size); ! 225: else ! 226: return size; ! 227: } ! 228: ! 229: static inline unsigned long copy_from_user(void *dst, const void *src, ! 230: unsigned long size) ! 231: { ! 232: if (access_ok(VERIFY_READ, src, size)) ! 233: return __copy_from_user(dst, src, size); ! 234: else ! 235: return size; ! 236: } ! 237: ! 238: static inline unsigned long clear_user(void *dst, unsigned long size) ! 239: { ! 240: if (access_ok(VERIFY_WRITE, dst, size)) ! 241: return __clear_user(dst, size); ! 242: else ! 243: return size; ! 244: } ! 245: ! 246: #endif /* QEMU_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.