diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-03-03 14:32:43 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-03-03 14:32:43 +0000 |
commit | 0ecfa9930c7615503ba629a61f7b94a0c3305af5 (patch) | |
tree | e9b87ad13ee9b77cb7c5b5082ad61d877232db7e /linux-user | |
parent | ba1c6e37fc5efc0f3d1e50d0760f9f4a1061187b (diff) |
prints hello world
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@17 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'linux-user')
-rw-r--r-- | linux-user/main.c | 231 |
1 files changed, 36 insertions, 195 deletions
diff --git a/linux-user/main.c b/linux-user/main.c index 552ce006c7..68858daf4c 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -21,10 +21,11 @@ #include <stdio.h> #include <stdarg.h> #include <errno.h> +#include <unistd.h> #include "gemu.h" -#include "i386/hsw_interp.h" +#include "cpu-i386.h" unsigned long x86_stack_size; unsigned long stktop; @@ -38,160 +39,8 @@ void gemu_log(const char *fmt, ...) va_end(ap); } -/* virtual x86 CPU stuff */ - -extern int invoke_code16(Interp_ENV *, int, int); -extern int invoke_code32(Interp_ENV *, int); -extern char *e_print_cpuemu_regs(ENVPARAMS, int is32); -extern char *e_emu_disasm(ENVPARAMS, unsigned char *org, int is32); -extern void init_npu(void); - -Interp_ENV env_global; -Interp_ENV *envp_global; - -QWORD EMUtime = 0; - -int CEmuStat = 0; - -long instr_count; - -/* who will initialize this? */ -unsigned long io_bitmap[IO_BITMAP_SIZE+1]; - -/* debug flag, 0=disable 1..9=level */ -int d_emu = 0; - -unsigned long CRs[5] = -{ - 0x00000013, /* valid bits: 0xe005003f */ - 0x00000000, /* invalid */ - 0x00000000, - 0x00000000, - 0x00000000 -}; - -/* - * DR0-3 = linear address of breakpoint 0-3 - * DR4=5 = reserved - * DR6 b0-b3 = BP active - * b13 = BD - * b14 = BS - * b15 = BT - * DR7 b0-b1 = G:L bp#0 - * b2-b3 = G:L bp#1 - * b4-b5 = G:L bp#2 - * b6-b7 = G:L bp#3 - * b8-b9 = GE:LE - * b13 = GD - * b16-19= LLRW bp#0 LL=00(1),01(2),11(4) - * b20-23= LLRW bp#1 RW=00(x),01(w),11(rw) - * b24-27= LLRW bp#2 - * b28-31= LLRW bp#3 - */ -unsigned long DRs[8] = -{ - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0xffff1ff0, - 0x00000400, - 0xffff1ff0, - 0x00000400 -}; - -unsigned long TRs[2] = -{ - 0x00000000, - 0x00000000 -}; - -void FatalAppExit(UINT wAction, LPCSTR lpText) -{ - fprintf(stderr, "Fatal error '%s' in CPU\n", lpText); - exit(1); -} - -int e_debug_check(unsigned char *PC) -{ - register unsigned long d7 = DRs[7]; - - if (d7&0x03) { - if (d7&0x30000) return 0; /* only execute(00) bkp */ - if ((long)PC==DRs[0]) { - e_printf("DBRK: DR0 hit at %p\n",PC); - DRs[6] |= 1; - return 1; - } - } - if (d7&0x0c) { - if (d7&0x300000) return 0; - if ((long)PC==DRs[1]) { - e_printf("DBRK: DR1 hit at %p\n",PC); - DRs[6] |= 2; - return 1; - } - } - if (d7&0x30) { - if (d7&0x3000000) return 0; - if ((long)PC==DRs[2]) { - e_printf("DBRK: DR2 hit at %p\n",PC); - DRs[6] |= 4; - return 1; - } - } - if (d7&0xc0) { - if (d7&0x30000000) return 0; - if ((long)PC==DRs[3]) { - e_printf("DBRK: DR3 hit at %p\n",PC); - DRs[6] |= 8; - return 1; - } - } - return 0; -} - -/* Debug stuff */ -void logstr(unsigned long mask, const char *fmt,...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); -} - -/* unconditional message into debug log and stderr */ -#undef error -void error(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - exit(1); -} - -int PortIO(DWORD port, DWORD value, UINT size, BOOL is_write) -{ - fprintf(stderr, "IO: %s port=0x%lx value=0x%lx size=%d", - is_write ? "write" : "read", port, value, size); - return value; -} - -void LogProcName(WORD wSel, WORD wOff, WORD wAction) -{ - -} - -void INT_handler(int num, void *env) -{ - fprintf(stderr, "EM86: int %d\n", num); -} - /***********************************************************/ -/* new CPU core */ +/* CPUX86 core interface */ void cpu_x86_outb(int addr, int val) { @@ -245,7 +94,7 @@ int main(int argc, char **argv) const char *filename; struct target_pt_regs regs1, *regs = ®s1; struct image_info info1, *info = &info1; - Interp_ENV *env; + CPUX86State *env; if (argc <= 1) usage(); @@ -277,26 +126,25 @@ int main(int argc, char **argv) target_set_brk((char *)info->brk); syscall_init(); - env = &env_global; - envp_global = env; - memset(env, 0, sizeof(Interp_ENV)); - - env->rax.e = regs->eax; - env->rbx.e = regs->ebx; - env->rcx.e = regs->ecx; - env->rdx.e = regs->edx; - env->rsi.esi = regs->esi; - env->rdi.edi = regs->edi; - env->rbp.ebp = regs->ebp; - env->rsp.esp = regs->esp; - env->cs.cs = __USER_CS; - env->ds.ds = __USER_DS; - env->es.es = __USER_DS; - env->ss.ss = __USER_DS; - env->fs.fs = __USER_DS; - env->gs.gs = __USER_DS; - env->trans_addr = regs->eip; + env = cpu_x86_init(); + + env->regs[R_EAX] = regs->eax; + env->regs[R_EBX] = regs->ebx; + env->regs[R_ECX] = regs->ecx; + env->regs[R_EDX] = regs->edx; + env->regs[R_ESI] = regs->esi; + env->regs[R_EDI] = regs->edi; + env->regs[R_EBP] = regs->ebp; + env->regs[R_ESP] = regs->esp; + env->segs[R_CS] = __USER_CS; + env->segs[R_DS] = __USER_DS; + env->segs[R_ES] = __USER_DS; + env->segs[R_SS] = __USER_DS; + env->segs[R_FS] = __USER_DS; + env->segs[R_GS] = __USER_DS; + env->pc = regs->eip; +#if 0 LDT[__USER_CS >> 3].w86Flags = DF_PRESENT | DF_PAGES | DF_32; LDT[__USER_CS >> 3].dwSelLimit = 0xfffff; LDT[__USER_CS >> 3].lpSelBase = NULL; @@ -304,41 +152,34 @@ int main(int argc, char **argv) LDT[__USER_DS >> 3].w86Flags = DF_PRESENT | DF_PAGES | DF_32; LDT[__USER_DS >> 3].dwSelLimit = 0xfffff; LDT[__USER_DS >> 3].lpSelBase = NULL; - init_npu(); - build_decode_tables(); +#endif for(;;) { int err; uint8_t *pc; - - err = invoke_code32(env, -1); - env->trans_addr = env->return_addr; - pc = env->seg_regs[0] + env->trans_addr; + + err = cpu_x86_exec(env); switch(err) { case EXCP0D_GPF: + pc = (uint8_t *)env->pc; if (pc[0] == 0xcd && pc[1] == 0x80) { /* syscall */ - env->trans_addr += 2; - env->rax.e = do_syscall(env->rax.e, - env->rbx.e, - env->rcx.e, - env->rdx.e, - env->rsi.esi, - env->rdi.edi, - env->rbp.ebp); + env->pc += 2; + env->regs[R_EAX] = do_syscall(env->regs[R_EAX], + env->regs[R_EBX], + env->regs[R_ECX], + env->regs[R_EDX], + env->regs[R_ESI], + env->regs[R_EDI], + env->regs[R_EBP]); } else { goto trap_error; } break; default: trap_error: - fprintf(stderr, "GEMU: Unknown error %d, aborting\n", err); -#ifndef NO_TRACE_MSGS - d_emu = 9; - fprintf(stderr, "%s\n%s\n", - e_print_cpuemu_regs(env, 1), - e_emu_disasm(env,pc,1)); -#endif + fprintf(stderr, "0x%08lx: Unknown exception %d, aborting\n", + (long)env->pc, err); abort(); } } |