diff options
author | ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-01-18 20:06:33 +0000 |
---|---|---|
committer | ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-01-18 20:06:33 +0000 |
commit | 831b78254cfa752d5e6542542a663468e650bcb3 (patch) | |
tree | afb0c05de53519b72564dad4e305454ce6bd65f3 /darwin-user/qemu.h | |
parent | 54421cb17bc744bad15f2b1adb4adefdaea83c10 (diff) |
Darwin userspace emulation, by Pierre d'Herbemont.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2332 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'darwin-user/qemu.h')
-rw-r--r-- | darwin-user/qemu.h | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/darwin-user/qemu.h b/darwin-user/qemu.h new file mode 100644 index 0000000000..4d7713b500 --- /dev/null +++ b/darwin-user/qemu.h @@ -0,0 +1,179 @@ +#ifndef GEMU_H +#define GEMU_H + +#include "thunk.h" + +#include <signal.h> +#include <string.h> + +#include "cpu.h" + +#include "gdbstub.h" + +typedef siginfo_t target_siginfo_t; +#define target_sigaction sigaction +#ifdef TARGET_I386 +struct target_pt_regs { + long ebx; + long ecx; + long edx; + long esi; + long edi; + long ebp; + long eax; + int xds; + int xes; + long orig_eax; + long eip; + int xcs; + long eflags; + long esp; + int xss; +}; +struct target_sigcontext { + int sc_onstack; + int sc_mask; + int sc_eax; + int sc_ebx; + int sc_ecx; + int sc_edx; + int sc_edi; + int sc_esi; + int sc_ebp; + int sc_esp; + int sc_ss; + int sc_eflags; + int sc_eip; + int sc_cs; + int sc_ds; + int sc_es; + int sc_fs; + int sc_gs; +}; + +#define __USER_CS (0x17) +#define __USER_DS (0x1F) + +#elif defined(TARGET_PPC) +struct target_pt_regs { + unsigned long gpr[32]; + unsigned long nip; + unsigned long msr; + unsigned long orig_gpr3; /* Used for restarting system calls */ + unsigned long ctr; + unsigned long link; + unsigned long xer; + unsigned long ccr; + unsigned long mq; /* 601 only (not used at present) */ + /* Used on APUS to hold IPL value. */ + unsigned long trap; /* Reason for being here */ + unsigned long dar; /* Fault registers */ + unsigned long dsisr; + unsigned long result; /* Result of a system call */ +}; + +struct target_sigcontext { + int sc_onstack; /* sigstack state to restore */ + int sc_mask; /* signal mask to restore */ + int sc_ir; /* pc */ + int sc_psw; /* processor status word */ + int sc_sp; /* stack pointer if sc_regs == NULL */ + void *sc_regs; /* (kernel private) saved state */ +}; + +#endif + +typedef struct TaskState { + struct TaskState *next; + int used; /* non zero if used */ + uint8_t stack[0]; +} __attribute__((aligned(16))) TaskState; + +void syscall_init(void); +long do_mach_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3, + uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7, uint32_t arg8); +long do_thread_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3, + uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7, uint32_t arg8); +long do_unix_syscall(void *cpu_env, int num); +int do_sigaction(int sig, const struct sigaction *act, + struct sigaction *oact); +int do_sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss); + +void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2))); +void qerror(const char *fmt, ...); + +void write_dt(void *ptr, unsigned long addr, unsigned long limit, int flags); + +extern CPUState *global_env; +void cpu_loop(CPUState *env); +void init_paths(const char *prefix); +const char *path(const char *pathname); + +extern int loglevel; +extern FILE *logfile; + +/* commpage.c */ +void commpage_init(); +void do_commpage(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3, + uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7, uint32_t arg8); + +/* signal.c */ +void process_pending_signals(void *cpu_env); +void signal_init(void); +int queue_signal(int sig, target_siginfo_t *info); +void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info); +void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo); +long do_sigreturn(CPUState *env, int num); + +/* machload.c */ +int mach_exec(const char * filename, char ** argv, char ** envp, + struct target_pt_regs * regs); + +/* mmap.c */ +int target_mprotect(unsigned long start, unsigned long len, int prot); +long target_mmap(unsigned long start, unsigned long len, int prot, + int flags, int fd, unsigned long offset); +int target_munmap(unsigned long start, unsigned long len); +long target_mremap(unsigned long old_addr, unsigned long old_size, + unsigned long new_size, unsigned long flags, + unsigned long new_addr); +int target_msync(unsigned long start, unsigned long len, int flags); + +/* user access */ + +/* XXX: todo protect every memory access */ +#define lock_user(x,y,z) (void*)(x) +#define unlock_user(x,y,z) + +/* Mac OS X ABI arguments processing */ +#ifdef TARGET_I386 +static inline uint32_t get_int_arg(int *i, CPUX86State *cpu_env) +{ + uint32_t *args = (uint32_t*)(cpu_env->regs[R_ESP] + 4 + *i); + *i+=4; + return tswap32(*args); +} +static inline uint64_t get_int64_arg(int *i, CPUX86State *cpu_env) +{ + uint64_t *args = (uint64_t*)(cpu_env->regs[R_ESP] + 4 + *i); + *i+=8; + return tswap64(*args); +} +#elif defined(TARGET_PPC) +static inline uint32_t get_int_arg(int *i, CPUPPCState *cpu_env) +{ + /* XXX: won't work when args goes on stack after gpr10 */ + uint32_t args = (uint32_t)(cpu_env->gpr[3+(*i & 0xff)/4]); + *i+=4; + return tswap32(args); +} +static inline uint64_t get_int64_arg(int *i, CPUPPCState *cpu_env) +{ + /* XXX: won't work when args goes on stack after gpr10 */ + uint64_t args = (uint64_t)(cpu_env->fpr[1+(*i >> 8)/8]); + *i+=(8 << 8) + 8; + return tswap64(args); +} +#endif + +#endif |