$NetBSD: patch-ba,v 1.1 2003/07/31 15:13:39 bencollver Exp $ --- src/lrmi.c.orig Mon Aug 7 00:17:23 2000 +++ src/lrmi.c @@ -12,10 +12,14 @@ This software has NO WARRANTY. Use it a #include #include -#include #ifdef USE_LIBC_VM86 -#include +#include +#include +#include +#include +#include +#include #endif #include @@ -30,7 +34,7 @@ This software has NO WARRANTY. Use it a #define REAL_MEM_SIZE 0x10000 #define REAL_MEM_BLOCKS 0x100 -int __svgalib_lrmi_cpu_type=CPU_386; +int __svgalib_lrmi_cpu_type=VCPU_386; struct mem_block { @@ -171,7 +175,7 @@ LRMI_free_real(void *m) } -#define DEFAULT_VM86_FLAGS (IF_MASK | IOPL_MASK) +#define DEFAULT_VM86_FLAGS (PSL_I|PSL_IOPL) #define DEFAULT_STACK_SIZE 0x1000 #define RETURN_TO_32_INT 255 @@ -210,9 +214,9 @@ get_int_off(int i) static inline void pushw(unsigned short i) { - struct vm86_regs *r = &context.vm.regs; - r->esp -= 2; - *(unsigned short *)(((unsigned int)r->ss << 4) + r->esp) = i; + struct vm86_regs *r = &context.vm.substr.regs; + r->vmsc.sc_esp -= 2; + *(unsigned short *)(((unsigned int)r->vmsc.sc_ss << 4) + r->vmsc.sc_esp) = i; } @@ -282,13 +286,13 @@ LRMI_init(void) memset(&context.vm, 0, sizeof(context.vm)); - context.vm.cpu_type = __svgalib_lrmi_cpu_type; + context.vm.substr.ss_cpu_type = __svgalib_lrmi_cpu_type; /* Enable kernel emulation of all ints except RETURN_TO_32_INT */ - memset(&context.vm.int_revectored, 0, sizeof(context.vm.int_revectored)); - set_bit(RETURN_TO_32_INT, &context.vm.int_revectored); + memset(&context.vm.int_byuser, 0, sizeof(context.vm.int_byuser)); + set_bit(RETURN_TO_32_INT, &context.vm.int_byuser); context.ready = 1; @@ -299,36 +303,36 @@ LRMI_init(void) static void set_regs(struct LRMI_regs *r) { - context.vm.regs.edi = r->edi; - context.vm.regs.esi = r->esi; - context.vm.regs.ebp = r->ebp; - context.vm.regs.ebx = r->ebx; - context.vm.regs.edx = r->edx; - context.vm.regs.ecx = r->ecx; - context.vm.regs.eax = r->eax; - context.vm.regs.eflags = DEFAULT_VM86_FLAGS; - context.vm.regs.es = r->es; - context.vm.regs.ds = r->ds; - context.vm.regs.fs = r->fs; - context.vm.regs.gs = r->gs; + context.vm.substr.regs.vmsc.sc_edi = r->edi; + context.vm.substr.regs.vmsc.sc_esi = r->esi; + context.vm.substr.regs.vmsc.sc_ebp = r->ebp; + context.vm.substr.regs.vmsc.sc_ebx = r->ebx; + context.vm.substr.regs.vmsc.sc_edx = r->edx; + context.vm.substr.regs.vmsc.sc_ecx = r->ecx; + context.vm.substr.regs.vmsc.sc_eax = r->eax; + context.vm.substr.regs.vmsc.sc_eflags = DEFAULT_VM86_FLAGS; + context.vm.substr.regs.vmsc.sc_es = r->es; + context.vm.substr.regs.vmsc.sc_ds = r->ds; + context.vm.substr.regs.vmsc.sc_fs = r->fs; + context.vm.substr.regs.vmsc.sc_gs = r->gs; } static void get_regs(struct LRMI_regs *r) { - r->edi = context.vm.regs.edi; - r->esi = context.vm.regs.esi; - r->ebp = context.vm.regs.ebp; - r->ebx = context.vm.regs.ebx; - r->edx = context.vm.regs.edx; - r->ecx = context.vm.regs.ecx; - r->eax = context.vm.regs.eax; - r->flags = context.vm.regs.eflags; - r->es = context.vm.regs.es; - r->ds = context.vm.regs.ds; - r->fs = context.vm.regs.fs; - r->gs = context.vm.regs.gs; + r->edi = context.vm.substr.regs.vmsc.sc_edi; + r->esi = context.vm.substr.regs.vmsc.sc_esi; + r->ebp = context.vm.substr.regs.vmsc.sc_ebp; + r->ebx = context.vm.substr.regs.vmsc.sc_ebx; + r->edx = context.vm.substr.regs.vmsc.sc_edx; + r->ecx = context.vm.substr.regs.vmsc.sc_ecx; + r->eax = context.vm.substr.regs.vmsc.sc_eax; + r->flags = context.vm.substr.regs.vmsc.sc_eflags; + r->es = context.vm.substr.regs.vmsc.sc_es; + r->ds = context.vm.substr.regs.vmsc.sc_ds; + r->fs = context.vm.substr.regs.vmsc.sc_fs; + r->gs = context.vm.substr.regs.vmsc.sc_gs; } #define DIRECTION_FLAG (1 << 10) @@ -338,11 +342,11 @@ em_ins(int size) { unsigned int edx, edi; - edx = context.vm.regs.edx & 0xffff; - edi = context.vm.regs.edi & 0xffff; - edi += (unsigned int)context.vm.regs.ds << 4; + edx = context.vm.substr.regs.vmsc.sc_edx & 0xffff; + edi = context.vm.substr.regs.vmsc.sc_edi & 0xffff; + edi += (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - if (context.vm.regs.eflags & DIRECTION_FLAG) + if (context.vm.substr.regs.vmsc.sc_eflags & DIRECTION_FLAG) { if (size == 4) asm volatile ("std; insl; cld" @@ -367,10 +371,10 @@ em_ins(int size) : "=D" (edi) : "d" (edx), "0" (edi)); } - edi -= (unsigned int)context.vm.regs.ds << 4; + edi -= (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - context.vm.regs.edi &= 0xffff0000; - context.vm.regs.edi |= edi & 0xffff; + context.vm.substr.regs.vmsc.sc_edi &= 0xffff0000; + context.vm.substr.regs.vmsc.sc_edi |= edi & 0xffff; } static void @@ -378,12 +382,12 @@ em_rep_ins(int size) { unsigned int ecx, edx, edi; - ecx = context.vm.regs.ecx & 0xffff; - edx = context.vm.regs.edx & 0xffff; - edi = context.vm.regs.edi & 0xffff; - edi += (unsigned int)context.vm.regs.ds << 4; + ecx = context.vm.substr.regs.vmsc.sc_ecx & 0xffff; + edx = context.vm.substr.regs.vmsc.sc_edx & 0xffff; + edi = context.vm.substr.regs.vmsc.sc_edi & 0xffff; + edi += (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - if (context.vm.regs.eflags & DIRECTION_FLAG) + if (context.vm.substr.regs.vmsc.sc_eflags & DIRECTION_FLAG) { if (size == 4) asm volatile ("std; rep; insl; cld" @@ -414,13 +418,13 @@ em_rep_ins(int size) : "d" (edx), "0" (edi), "1" (ecx)); } - edi -= (unsigned int)context.vm.regs.ds << 4; + edi -= (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - context.vm.regs.edi &= 0xffff0000; - context.vm.regs.edi |= edi & 0xffff; + context.vm.substr.regs.vmsc.sc_edi &= 0xffff0000; + context.vm.substr.regs.vmsc.sc_edi |= edi & 0xffff; - context.vm.regs.ecx &= 0xffff0000; - context.vm.regs.ecx |= ecx & 0xffff; + context.vm.substr.regs.vmsc.sc_ecx &= 0xffff0000; + context.vm.substr.regs.vmsc.sc_ecx |= ecx & 0xffff; } static void @@ -428,11 +432,11 @@ em_outs(int size) { unsigned int edx, esi; - edx = context.vm.regs.edx & 0xffff; - esi = context.vm.regs.esi & 0xffff; - esi += (unsigned int)context.vm.regs.ds << 4; + edx = context.vm.substr.regs.vmsc.sc_edx & 0xffff; + esi = context.vm.substr.regs.vmsc.sc_esi & 0xffff; + esi += (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - if (context.vm.regs.eflags & DIRECTION_FLAG) + if (context.vm.substr.regs.vmsc.sc_eflags & DIRECTION_FLAG) { if (size == 4) asm volatile ("std; outsl; cld" @@ -457,10 +461,10 @@ em_outs(int size) : "=S" (esi) : "d" (edx), "0" (esi)); } - esi -= (unsigned int)context.vm.regs.ds << 4; + esi -= (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - context.vm.regs.esi &= 0xffff0000; - context.vm.regs.esi |= esi & 0xffff; + context.vm.substr.regs.vmsc.sc_esi &= 0xffff0000; + context.vm.substr.regs.vmsc.sc_esi |= esi & 0xffff; } static void @@ -468,12 +472,12 @@ em_rep_outs(int size) { unsigned int ecx, edx, esi; - ecx = context.vm.regs.ecx & 0xffff; - edx = context.vm.regs.edx & 0xffff; - esi = context.vm.regs.esi & 0xffff; - esi += (unsigned int)context.vm.regs.ds << 4; + ecx = context.vm.substr.regs.vmsc.sc_ecx & 0xffff; + edx = context.vm.substr.regs.vmsc.sc_edx & 0xffff; + esi = context.vm.substr.regs.vmsc.sc_esi & 0xffff; + esi += (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - if (context.vm.regs.eflags & DIRECTION_FLAG) + if (context.vm.substr.regs.vmsc.sc_eflags & DIRECTION_FLAG) { if (size == 4) asm volatile ("std; rep; outsl; cld" @@ -504,61 +508,61 @@ em_rep_outs(int size) : "d" (edx), "0" (esi), "1" (ecx)); } - esi -= (unsigned int)context.vm.regs.ds << 4; + esi -= (unsigned int)context.vm.substr.regs.vmsc.sc_ds << 4; - context.vm.regs.esi &= 0xffff0000; - context.vm.regs.esi |= esi & 0xffff; + context.vm.substr.regs.vmsc.sc_esi &= 0xffff0000; + context.vm.substr.regs.vmsc.sc_esi |= esi & 0xffff; - context.vm.regs.ecx &= 0xffff0000; - context.vm.regs.ecx |= ecx & 0xffff; + context.vm.substr.regs.vmsc.sc_ecx &= 0xffff0000; + context.vm.substr.regs.vmsc.sc_ecx |= ecx & 0xffff; } static void em_inb(void) { asm volatile ("inb (%w1), %b0" - : "=a" (context.vm.regs.eax) - : "d" (context.vm.regs.edx), "0" (context.vm.regs.eax)); + : "=a" (context.vm.substr.regs.vmsc.sc_eax) + : "d" (context.vm.substr.regs.vmsc.sc_edx), "0" (context.vm.substr.regs.vmsc.sc_eax)); } static void em_inw(void) { asm volatile ("inw (%w1), %w0" - : "=a" (context.vm.regs.eax) - : "d" (context.vm.regs.edx), "0" (context.vm.regs.eax)); + : "=a" (context.vm.substr.regs.vmsc.sc_eax) + : "d" (context.vm.substr.regs.vmsc.sc_edx), "0" (context.vm.substr.regs.vmsc.sc_eax)); } static void em_inl(void) { asm volatile ("inl (%w1), %0" - : "=a" (context.vm.regs.eax) - : "d" (context.vm.regs.edx)); + : "=a" (context.vm.substr.regs.vmsc.sc_eax) + : "d" (context.vm.substr.regs.vmsc.sc_edx)); } static void em_outb(void) { asm volatile ("outb %b0, (%w1)" - : : "a" (context.vm.regs.eax), - "d" (context.vm.regs.edx)); + : : "a" (context.vm.substr.regs.vmsc.sc_eax), + "d" (context.vm.substr.regs.vmsc.sc_edx)); } static void em_outw(void) { asm volatile ("outw %w0, (%w1)" - : : "a" (context.vm.regs.eax), - "d" (context.vm.regs.edx)); + : : "a" (context.vm.substr.regs.vmsc.sc_eax), + "d" (context.vm.substr.regs.vmsc.sc_edx)); } static void em_outl(void) { asm volatile ("outl %0, (%w1)" - : : "a" (context.vm.regs.eax), - "d" (context.vm.regs.edx)); + : : "a" (context.vm.substr.regs.vmsc.sc_eax), + "d" (context.vm.substr.regs.vmsc.sc_edx)); } static int @@ -572,8 +576,8 @@ emulate(void) } prefix = { 0, 0 }; int i = 0; - insn = (unsigned char *)((unsigned int)context.vm.regs.cs << 4); - insn += context.vm.regs.eip; + insn = (unsigned char *)((unsigned int)context.vm.substr.regs.vmsc.sc_cs << 4); + insn += context.vm.substr.regs.vmsc.sc_eip; while (1) { @@ -687,7 +691,7 @@ emulate(void) return 0; } - context.vm.regs.eip += i; + context.vm.substr.regs.vmsc.sc_eip += i; return 1; } @@ -723,7 +727,7 @@ lrmi_vm86(struct vm86_struct *vm) return r; } #else -#define lrmi_vm86 vm86 +#define lrmi_vm86 i386_vm86 #endif @@ -735,26 +739,26 @@ debug_info(int vret) fputs("vm86() failed\n", stderr); fprintf(stderr, "return = 0x%x\n", vret); - fprintf(stderr, "eax = 0x%08lx\n", context.vm.regs.eax); - fprintf(stderr, "ebx = 0x%08lx\n", context.vm.regs.ebx); - fprintf(stderr, "ecx = 0x%08lx\n", context.vm.regs.ecx); - fprintf(stderr, "edx = 0x%08lx\n", context.vm.regs.edx); - fprintf(stderr, "esi = 0x%08lx\n", context.vm.regs.esi); - fprintf(stderr, "edi = 0x%08lx\n", context.vm.regs.edi); - fprintf(stderr, "ebp = 0x%08lx\n", context.vm.regs.ebp); - fprintf(stderr, "eip = 0x%08lx\n", context.vm.regs.eip); - fprintf(stderr, "cs = 0x%04x\n", context.vm.regs.cs); - fprintf(stderr, "esp = 0x%08lx\n", context.vm.regs.esp); - fprintf(stderr, "ss = 0x%04x\n", context.vm.regs.ss); - fprintf(stderr, "ds = 0x%04x\n", context.vm.regs.ds); - fprintf(stderr, "es = 0x%04x\n", context.vm.regs.es); - fprintf(stderr, "fs = 0x%04x\n", context.vm.regs.fs); - fprintf(stderr, "gs = 0x%04x\n", context.vm.regs.gs); - fprintf(stderr, "eflags = 0x%08lx\n", context.vm.regs.eflags); + fprintf(stderr, "eax = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_eax); + fprintf(stderr, "ebx = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_ebx); + fprintf(stderr, "ecx = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_ecx); + fprintf(stderr, "edx = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_edx); + fprintf(stderr, "esi = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_esi); + fprintf(stderr, "edi = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_edi); + fprintf(stderr, "ebp = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_ebp); + fprintf(stderr, "eip = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_eip); + fprintf(stderr, "cs = 0x%04x\n", context.vm.substr.regs.vmsc.sc_cs); + fprintf(stderr, "esp = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_esp); + fprintf(stderr, "ss = 0x%04x\n", context.vm.substr.regs.vmsc.sc_ss); + fprintf(stderr, "ds = 0x%04x\n", context.vm.substr.regs.vmsc.sc_ds); + fprintf(stderr, "es = 0x%04x\n", context.vm.substr.regs.vmsc.sc_es); + fprintf(stderr, "fs = 0x%04x\n", context.vm.substr.regs.vmsc.sc_fs); + fprintf(stderr, "gs = 0x%04x\n", context.vm.substr.regs.vmsc.sc_gs); + fprintf(stderr, "eflags = 0x%08lx\n", context.vm.substr.regs.vmsc.sc_eflags); fputs("cs:ip = [ ", stderr); - p = (unsigned char *)((context.vm.regs.cs << 4) + (context.vm.regs.eip & 0xffff)); + p = (unsigned char *)((context.vm.substr.regs.vmsc.sc_cs << 4) + (context.vm.substr.regs.vmsc.sc_eip & 0xffff)); for (i = 0; i < 16; ++i) fprintf(stderr, "%02x ", (unsigned int)p[i]); @@ -779,13 +783,13 @@ run_vm86(void) if (v == RETURN_TO_32_INT) return 1; - pushw(context.vm.regs.eflags); - pushw(context.vm.regs.cs); - pushw(context.vm.regs.eip); - - context.vm.regs.cs = get_int_seg(v); - context.vm.regs.eip = get_int_off(v); - context.vm.regs.eflags &= ~(VIF_MASK | TF_MASK); + pushw(context.vm.substr.regs.vmsc.sc_eflags); + pushw(context.vm.substr.regs.vmsc.sc_cs); + pushw(context.vm.substr.regs.vmsc.sc_eip); + + context.vm.substr.regs.vmsc.sc_cs = get_int_seg(v); + context.vm.substr.regs.vmsc.sc_eip = get_int_off(v); + context.vm.substr.regs.vmsc.sc_eflags &= ~(PSL_VIF | PSL_T); continue; } @@ -808,22 +812,20 @@ LRMI_call(struct LRMI_regs *r) { unsigned int vret; - memset(&context.vm.regs, 0, sizeof(context.vm.regs)); - set_regs(r); - context.vm.regs.cs = r->cs; - context.vm.regs.eip = r->ip; + context.vm.substr.regs.vmsc.sc_cs = r->cs; + context.vm.substr.regs.vmsc.sc_eip = r->ip; if (r->ss == 0 && r->sp == 0) { - context.vm.regs.ss = context.stack_seg; - context.vm.regs.esp = context.stack_off; + context.vm.substr.regs.vmsc.sc_ss = context.stack_seg; + context.vm.substr.regs.vmsc.sc_esp = context.stack_off; } else { - context.vm.regs.ss = r->ss; - context.vm.regs.esp = r->sp; + context.vm.substr.regs.vmsc.sc_ss = r->ss; + context.vm.substr.regs.vmsc.sc_esp = r->sp; } pushw(context.ret_seg); @@ -856,22 +858,20 @@ LRMI_int(int i, struct LRMI_regs *r) return 0; } - memset(&context.vm.regs, 0, sizeof(context.vm.regs)); - set_regs(r); - context.vm.regs.cs = seg; - context.vm.regs.eip = off; + context.vm.substr.regs.vmsc.sc_cs = seg; + context.vm.substr.regs.vmsc.sc_eip = off; if (r->ss == 0 && r->sp == 0) { - context.vm.regs.ss = context.stack_seg; - context.vm.regs.esp = context.stack_off; + context.vm.substr.regs.vmsc.sc_ss = context.stack_seg; + context.vm.substr.regs.vmsc.sc_esp = context.stack_off; } else { - context.vm.regs.ss = r->ss; - context.vm.regs.esp = r->sp; + context.vm.substr.regs.vmsc.sc_ss = r->ss; + context.vm.substr.regs.vmsc.sc_esp = r->sp; } pushw(DEFAULT_VM86_FLAGS);