pkgsrc-wip/svgalib/patches/patch-ba
2003-07-31 15:13:39 +00:00

476 lines
15 KiB
Text

$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 <stdio.h>
#include <string.h>
-#include <asm/vm86.h>
#ifdef USE_LIBC_VM86
-#include <sys/vm86.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <machine/psl.h>
+#include <machine/segments.h>
+#include <machine/sysarch.h>
+#include <machine/vm86.h>
#endif
#include <sys/types.h>
@@ -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);