socsvn commit: r240565 - in soc2012/syuu/bhyve-bios:
lib/libbiosemul usr.sbin/bhyve usr.sbin/bhyvebiosload
syuu at FreeBSD.org
syuu at FreeBSD.org
Mon Aug 20 13:15:22 UTC 2012
Author: syuu
Date: Mon Aug 20 13:15:20 2012
New Revision: 240565
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=240565
Log:
Replaced my own bios emulation code by libbiosemul, which includes interrupt vector with trampoline code, loading boot sector, bios call emulation.
Added handling secondary PIC IO(0xa0, 0xa1), keyboard controller IO(0x60, 0x64).
Modified:
soc2012/syuu/bhyve-bios/lib/libbiosemul/Makefile
soc2012/syuu/bhyve-bios/lib/libbiosemul/bios.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h
soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/debug.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/doscmd.h
soc2012/syuu/bhyve-bios/lib/libbiosemul/int.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/int10.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/int13.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/int14.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/mouse.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/port.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/register.h
soc2012/syuu/bhyve-bios/lib/libbiosemul/signal.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/trap.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/tty.c
soc2012/syuu/bhyve-bios/lib/libbiosemul/video.c
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_call.c
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_call.h
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int10.c
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int13.c
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int16.c
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int18.c
soc2012/syuu/bhyve-bios/usr.sbin/bhyve/fbsdrun.c
soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload/bhyvebiosload.c
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/Makefile
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/Makefile Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/Makefile Mon Aug 20 13:15:20 2012 (r240565)
@@ -5,16 +5,18 @@
LIB= biosemul
WARNS?= 2
SRCS= biosemul.c \
- bios.c callback.c \
+ bios.c callback.c cpu.c \
debug.c i386-pinsn.c \
- int13.c
+ int.c int10.c int13.c int16.c \
+ mouse.c port.c trap.c \
+ tty.c video.c ${FONTHDRS}
INCS= biosemul.h
CFLAGS+= -I. -DDISASSEMBLER
FONTFILES= cp437-8x8.pcf.gz cp437-8x14.pcf.gz cp437-8x16.pcf.gz
FONTHDRS= font8x8.h font8x14.h font8x16.h
CLEANFILES= ${FONTFILES} ${FONTHDRS}
-CFLAGS+= -DNO_X -g
+CFLAGS+= -DNO_X
cp437-8x8.pcf.gz: cp437-8x8.pcf.gz.uu
uudecode ${.CURDIR}/cp437-8x8.pcf.gz.uu
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/bios.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/bios.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/bios.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -82,7 +82,6 @@
int nparallel = 0;
u_int32_t rom_config;
-#if 0
/*
** BIOS equipment list
*/
@@ -138,11 +137,13 @@
debug(D_TRAPS | 0x15, "BIOS: Keyboard intercept\n");
/* Don't translate scan code. */
break;
-#if 0
case 0x88:
- get_raw_extmemory_info(REGS);
- break;
+#if 0
+ get_raw_extmemory_info(REGS);
#endif
+ /* XXX: implement max size */
+ R_AX = 0x0;
+ break;
case 0xc0: /* Get configuration */
debug(D_TRAPS | 0x15, "BIOS: Get configuration\n");
PUTVEC(R_ES, R_BX, rom_config);
@@ -161,22 +162,17 @@
break;
}
}
-#endif
void
bios_init(void)
{
-#if 0
int i, j, k;
-#endif
u_char *jtab;
-#if 0
struct timeval tv;
time_t tv_sec;
struct timezone tz;
struct tm tm;
u_int32_t vec;
-#endif
strcpy((char *)BIOS_copyright,
"Copyright (C) 1993 Krystal Technologies/BSDI");
@@ -219,7 +215,6 @@
*(u_char *)BIOS_hardware_id = 0xfc; /* Identify as a PC/AT */
-#if 0
/*
* Interrupt revectors F000:0000 - F000:03ff
*/
@@ -229,13 +224,15 @@
continue;
if ((i >= 0x00 && i < 0x2f) ||
(i >= 0x30 && i < 0xfe)) {
- ivec[i] = 0xF0300000L | (k * 1);
- jtab = (u_char *)VECPTR(ivec[i]);
- *jtab++ = 0xf4; /* HLT */
+ ivec[i] = 0xF0300000L | (k * 4);
+ jtab = (u_char *)(lomem_addr + VECPTR(ivec[i]));
+ *jtab++ = 0x0f;
+ *jtab++ = 0x01;
+ *jtab++ = 0xc1; /* VMCALL */
++k;
} else {
ivec[i] = 0xF0000000L | (j * 6);
- jtab = (u_char *)VECPTR(ivec[i]);
+ jtab = (u_char *)(lomem_addr + VECPTR(ivec[i]));
*jtab++ = 0xcd; /* INT i */
*jtab++ = i;
*jtab++ = 0xca; /* RETF 2 */
@@ -244,13 +241,12 @@
++j;
}
}
-#endif
/*
* Misc variables from F000:0400 - F000:0fff
*/
rom_config = 0xF0000400;
- jtab = (u_char *)VECPTR(rom_config);
+ jtab = (u_char *)(lomem_addr + VECPTR(rom_config));
*jtab++ = 20; /* length of entry */
*jtab++ = 0;
*jtab++ = *(u_char *)BIOS_hardware_id;
@@ -267,18 +263,17 @@
#if 0
InDOS = jtab++;
*InDOS = 0;
+#else
+ jtab++;
+#endif
mouse_area = jtab;
-#endif
jtab += 0x10;
*(u_short *)&BIOSDATA[0x10] =
(1 << 0) | /* Diskette avail for boot */
(1 << 1) | /* Math co-processor */
-#if 0
(nmice << 2) | /* No pointing device */
-#endif
- (0 << 2) |
(2 << 4) | /* Initial video (80 x 25 C) */
((nfloppies - 1) << 6) | /* Number of floppies - 1 */
(nserial << 9) | /* Number of serial devices */
@@ -298,7 +293,6 @@
BIOSDATA[0x91] = 0x40;
}
-#if 0
gettimeofday(&tv, &tz);
tv_sec = tv.tv_sec;
tm = *localtime(&tv_sec);
@@ -313,12 +307,14 @@
ivec[0x12] = vec;
register_callback(vec, int12, "int 12");
+#if 0
if(fossil)
vec = insert_fossil_softint_trampoline();
else
vec = insert_softint_trampoline();
ivec[0x14] = vec;
register_callback(vec, int14, "int 14");
+#endif
vec = insert_softint_trampoline();
ivec[0x15] = vec;
@@ -327,7 +323,7 @@
vec = insert_softint_trampoline();
ivec[0x16] = vec;
register_callback(vec, int16, "int 16");
-
+#if 0
vec = insert_softint_trampoline();
ivec[0x17] = vec;
register_callback(vec, int17, "int 17");
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -71,8 +71,8 @@
int raw_kbd = 0;
int timer_disable = 0;
struct timeval boot_time;
-u_int32_t *ivec = (u_int32_t *)0;
-char *lomem_addr = NULL;
+u_int32_t *ivec;
+char *lomem_addr;
#ifndef USE_VM86
#define PRB_V86_FORMAT 0x4242
@@ -85,10 +85,12 @@
};
#endif
-#if 0
/* local prototypes */
+#if 0
static void setup_boot(regcontext_t *REGS);
+#endif
static int try_boot(int);
+#if 0
static void setup_command(int argc, char *argv[], regcontext_t *REGS);
static FILE *find_doscmdrc(void);
static int do_args(int argc, char *argv[]);
@@ -109,29 +111,33 @@
static struct vm86_init_args kargs;
#endif
+static int set_modified_regs(struct vmctx *ctx, int vcpu, regcontext_t *orig, regcontext_t *modified);
+static int get_all_regs(struct vmctx *ctx, int vcpu, regcontext_t *regs);
+
#define HDISK_CYL 2610
#define HDISK_HEAD 255
#define HDISK_TRACK 63
#define HDISK_FILE "/home/syuu/test.img"
+regcontext_t *saved_regcontext;
+
/* lobotomise */
-void biosemul_init(char *lomem)
+void biosemul_init(struct vmctx *ctx, int vcpu, char *lomem)
{
lomem_addr = lomem;
ivec = (u_int32_t *)lomem_addr;
- debugf = stderr;
- debug_set(0xfffffff);
+ init_ints();
+
+ debugf = stderr;
-#if 0
/* Call init functions */
if (raw_kbd)
console_init();
init_io_port_handlers();
-#endif
bios_init();
init_hdisk(2, HDISK_CYL, HDISK_HEAD, HDISK_TRACK, HDISK_FILE, NULL);
-#if 0
+ try_boot(booting = 2); /* try C: */
cpu_init();
kbd_init();
kbd_bios_init();
@@ -140,10 +146,13 @@
mouse_init();
video_bios_init();
disk_bios_init();
+#if 0
cmos_init();
timer_init();
+#endif
/* iomap_init(); */
+#if 0
gettimeofday(&boot_time, 0);
#endif
}
@@ -157,6 +166,10 @@
static void
setup_boot(regcontext_t *REGS)
{
+ int fd; /* don't close this! */
+
+ fd = try_boot(booting = 2); /* try C: */
+
/* initialise registers for entry to bootblock */
R_EFLAGS = 0x20202;
R_CS = 0x0000;
@@ -176,6 +189,7 @@
R_GS = 0x0000;
#endif
}
+#endif
/*
** try_boot
@@ -194,7 +208,7 @@
}
/* read bootblock */
- if (read(fd, (char *)0x7c00, 512) != 512) {
+ if (read(fd, (char *)(lomem_addr + 0x7c00), 512) != 512) {
debug(D_DISK, "Short read on boot block from %c:\n", drntol(bootdrv));
return -1;
}
@@ -202,6 +216,7 @@
return fd;
}
+#if 0
/*
** setup_command
**
@@ -768,7 +783,7 @@
}
#endif
-int
+static int
get_all_regs(struct vmctx *ctx, int vcpu, regcontext_t *regs)
{
int error = 0;
@@ -806,108 +821,108 @@
if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RAX, ®s->r.eax.r_rx)) != 0)
goto done;
- if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RIP, ®s->r.eip.r_rx)) != 0)
+ if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSP, ®s->r.esp.r_rx)) != 0)
goto done;
- if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CS, ®s->r.cs.r_rx)) != 0)
+ if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_SS, ®s->r.ss.r_rx)) != 0)
goto done;
- if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, ®s->r.efl.r_rx)) != 0)
+ if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RIP, ®s->r.eip.r_rx)) != 0)
goto done;
- if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSP, ®s->r.esp.r_rx)) != 0)
+ if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CS, ®s->r.cs.r_rx)) != 0)
goto done;
- if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_SS, ®s->r.ss.r_rx)) != 0)
+ if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, ®s->r.efl.r_rx)) != 0)
goto done;
done:
return (error);
}
-int
+static int
set_modified_regs(struct vmctx *ctx, int vcpu, regcontext_t *orig, regcontext_t *modified)
{
int error = 0;
if ((orig->r.gs.r_rx != modified->r.gs.r_rx) &&
- printf("%s gs:%lx\n", __func__, modified->r.gs.r_rx) &&
+ fprintf(stderr, "%s gs:%lx\n", __func__, modified->r.gs.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_GS, modified->r.gs.r_rx)) != 0)
goto done;
if ((orig->r.fs.r_rx != modified->r.fs.r_rx) &&
- printf("%s fs:%lx\n", __func__, modified->r.fs.r_rx) &&
+ fprintf(stderr, "%s fs:%lx\n", __func__, modified->r.fs.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_FS, modified->r.fs.r_rx)) != 0)
goto done;
if ((orig->r.es.r_rx != modified->r.es.r_rx) &&
- printf("%s es:%lx\n", __func__, modified->r.es.r_rx) &&
+ fprintf(stderr, "%s es:%lx\n", __func__, modified->r.es.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_ES, modified->r.es.r_rx)) != 0)
goto done;
if ((orig->r.ds.r_rx != modified->r.ds.r_rx) &&
- printf("%s ds:%lx\n", __func__, modified->r.ds.r_rx) &&
+ fprintf(stderr, "%s ds:%lx\n", __func__, modified->r.ds.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DS, modified->r.es.r_rx)) != 0)
goto done;
if ((orig->r.edi.r_rx != modified->r.edi.r_rx) &&
- printf("%s edi:%lx\n", __func__, modified->r.edi.r_rx) &&
+ fprintf(stderr, "%s edi:%lx\n", __func__, modified->r.edi.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RDI, modified->r.edi.r_rx)) != 0)
goto done;
if ((orig->r.esi.r_rx != modified->r.esi.r_rx) &&
- printf("%s esi:%lx\n", __func__, modified->r.esi.r_rx) &&
+ fprintf(stderr, "%s esi:%lx\n", __func__, modified->r.esi.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSI, modified->r.esi.r_rx)) != 0)
goto done;
if ((orig->r.ebp.r_rx != modified->r.ebp.r_rx) &&
- printf("%s ebp:%lx\n", __func__, modified->r.ebp.r_rx) &&
+ fprintf(stderr, "%s ebp:%lx\n", __func__, modified->r.ebp.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RBP, modified->r.ebp.r_rx)) != 0)
goto done;
if ((orig->r.ebx.r_rx != modified->r.ebx.r_rx) &&
- printf("%s ebx:%lx\n", __func__, modified->r.ebx.r_rx) &&
+ fprintf(stderr, "%s ebx:%lx\n", __func__, modified->r.ebx.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RBX, modified->r.ebx.r_rx)) != 0)
goto done;
if ((orig->r.edx.r_rx != modified->r.edx.r_rx) &&
- printf("%s edx:%lx\n", __func__, modified->r.edx.r_rx) &&
+ fprintf(stderr, "%s edx:%lx\n", __func__, modified->r.edx.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RDX, modified->r.edx.r_rx)) != 0)
goto done;
if ((orig->r.ecx.r_rx != modified->r.ecx.r_rx) &&
- printf("%s ecx:%lx\n", __func__, modified->r.ecx.r_rx) &&
+ fprintf(stderr, "%s ecx:%lx\n", __func__, modified->r.ecx.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RCX, modified->r.ecx.r_rx)) != 0)
goto done;
if ((orig->r.eax.r_rx != modified->r.eax.r_rx) &&
- printf("%s eax:%lx\n", __func__, modified->r.eax.r_rx) &&
+ fprintf(stderr, "%s eax:%lx\n", __func__, modified->r.eax.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, modified->r.eax.r_rx)) != 0)
goto done;
+ if ((orig->r.esp.r_rx != modified->r.esp.r_rx) &&
+ fprintf(stderr, "%s esp:%lx\n", __func__, modified->r.esp.r_rx) &&
+ (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSP, modified->r.esp.r_rx)) != 0)
+ goto done;
+
+ if ((orig->r.ss.r_rx != modified->r.ss.r_rx) &&
+ fprintf(stderr, "%s ss:%lx\n", __func__, modified->r.ss.r_rx) &&
+ (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_SS, modified->r.ss.r_rx)) != 0)
+ goto done;
+
if ((orig->r.eip.r_rx != modified->r.eip.r_rx) &&
- printf("%s eip:%lx\n", __func__, modified->r.eip.r_rx) &&
+ fprintf(stderr, "%s eip:%lx\n", __func__, modified->r.eip.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RIP, modified->r.eip.r_rx)) != 0)
goto done;
if ((orig->r.cs.r_rx != modified->r.cs.r_rx) &&
- printf("%s cs:%lx\n", __func__, modified->r.cs.r_rx) &&
+ fprintf(stderr, "%s cs:%lx\n", __func__, modified->r.cs.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CS, modified->r.cs.r_rx)) != 0)
goto done;
if ((orig->r.efl.r_rx != modified->r.efl.r_rx) &&
- printf("%s eflags:%lx\n", __func__, modified->r.efl.r_rx) &&
+ fprintf(stderr, "%s eflags:%lx\n", __func__, modified->r.efl.r_rx) &&
(error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, modified->r.efl.r_rx)) != 0)
goto done;
-
- if ((orig->r.esp.r_rx != modified->r.esp.r_rx) &&
- printf("%s esp:%lx\n", __func__, modified->r.esp.r_rx) &&
- (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSP, modified->r.esp.r_rx)) != 0)
- goto done;
-
- if ((orig->r.ss.r_rx != modified->r.ss.r_rx) &&
- printf("%s ss:%lx\n", __func__, modified->r.ss.r_rx) &&
- (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_SS, modified->r.ss.r_rx)) != 0)
- goto done;
done:
return (error);
@@ -920,48 +935,84 @@
{
int ret = 0;
regcontext_t orig, modified;
+ regcontext_t *REGS = &modified;
get_all_regs(ctx, vcpu, &orig);
+ {
+ u_int16_t *sp, eip, cs, efl;
+
+ sp = (uint16_t *)(lomem_addr + orig.r.esp.r_rx);
+ eip = *sp;
+ cs = *(--sp);
+ efl = *(--sp);
+ fprintf(stderr, "%s eip:%x cs:%x efl:%x\n",
+ __func__, eip, cs, efl);
+ }
modified = orig;
- printf("%s orig RAX=%lx EAX=%x AX=%x AL=%x AH=%x\n",
+ fprintf(stderr, "%s orig RAX=%lx EAX=%x AX=%x AL=%x AH=%x\n",
__func__,
orig.r.eax.r_rx,
orig.r.eax.r_dw.r_ex,
orig.r.eax.r_w.r_x,
orig.r.eax.r_b.r_l,
orig.r.eax.r_b.r_h);
- printf("%s orig RBX=%lx EBX=%x BX=%x BL=%x BH=%x\n",
+ fprintf(stderr, "%s orig RBX=%lx EBX=%x BX=%x BL=%x BH=%x\n",
__func__,
orig.r.ebx.r_rx,
orig.r.ebx.r_dw.r_ex,
orig.r.ebx.r_w.r_x,
orig.r.ebx.r_b.r_l,
orig.r.ebx.r_b.r_h);
- printf("%s modified RAX=%lx EAX=%x AX=%x AL=%x AH=%x\n",
+ fprintf(stderr, "%s modified RAX=%lx EAX=%x AX=%x AL=%x AH=%x\n",
__func__,
modified.r.eax.r_rx,
modified.r.eax.r_dw.r_ex,
modified.r.eax.r_w.r_x,
modified.r.eax.r_b.r_l,
modified.r.eax.r_b.r_h);
- printf("%s modified RBX=%lx EBX=%x BX=%x BL=%x BH=%x\n",
+ fprintf(stderr, "%s modified RBX=%lx EBX=%x BX=%x BL=%x BH=%x\n",
__func__,
modified.r.ebx.r_rx,
modified.r.ebx.r_dw.r_ex,
modified.r.ebx.r_w.r_x,
modified.r.ebx.r_b.r_l,
modified.r.ebx.r_b.r_h);
+ callback_t func = find_callback(MAKEVEC(R_CS, R_IP));
+ fprintf(stderr, "%s R_CS:%x R_IP:%x MAKEVEC(R_CS, R_IP):%x func:%p\n",
+ __func__, R_CS, R_IP, MAKEVEC(R_CS, R_IP), func);
+ if (func)
+ func(&modified);
- switch (intno) {
- case 0x13:
- printf("call int13\n");
- int13(&modified);
- break;
- default:
- ret = -1;
- }
set_modified_regs(ctx, vcpu, &orig, &modified);
return (ret);
}
+bool biosemul_inout_registered(int in, int port)
+{
+ return io_port_defined(in, port);
+}
+
+int biosemul_inout(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
+ uint32_t *eax, int strict)
+{
+ regcontext_t orig, modified;
+
+ get_all_regs(ctx, vcpu, &orig);
+ modified = orig;
+ saved_regcontext = &modified;
+
+ fprintf(stderr, "%s in:%d port:%x bytes:%d eax:%x strict:%d\n",
+ __func__, in, port, bytes, *eax, strict);
+
+ if (in)
+ inb(&modified, port);
+ else
+ outb(&modified, port);
+
+ set_modified_regs(ctx, vcpu, &orig, &modified);
+
+ return 0;
+}
+
+
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h Mon Aug 20 13:15:20 2012 (r240565)
@@ -2,10 +2,14 @@
#ifndef _BIOSEMUL_H_
#define _BIOSEMUL_H_
+#include <stdbool.h>
#include <machine/vmm.h>
#include <vmmapi.h>
-void biosemul_init(char *lomem);
+void biosemul_init(struct vmctx *ctx, int vcpu, char *lomem);
int biosemul_call(struct vmctx *ctx, int vcpu, int intno);
+bool biosemul_inout_registered(int in, int port);
+int biosemul_inout(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
+ uint32_t *eax, int strict);
#endif
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -70,7 +70,7 @@
* stack which re-enables interrupts.
*/
u_char softint_trampoline[] = {
- 0xf4, /* HLT */
+ 0x0f, 0x01, 0xc1, /* VMCALL */
0xfb, /* STI */
0xca, /* RETF 2 */
2,
@@ -85,7 +85,7 @@
* driver is present and what level of functionality it provides.
*/
u_char fossil_softint_trampoline[] = {
- 0xf4, /* HLT */
+ 0x0f, 0x01, 0xc1, /* VMCALL */
0xfb, /* STI */
0xca, /* RETF 2 */
2,
@@ -96,7 +96,7 @@
0x1b, /* Max. Supported FOSSIL AH */
};
u_char hardint_trampoline[] = {
- 0xf4, /* HLT */
+ 0x0f, 0x01, 0xc1, /* VMCALL */
0xcf, /* IRET */
};
u_char null_trampoline[] = {
@@ -110,7 +110,7 @@
u_int32_t where;
where = trampoline_rover;
- q = (u_char *)VECPTR(where);
+ q = (u_char *)(lomem_addr + VECPTR(where));
memcpy(q, p, len);
trampoline_rover += len;
return (where);
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -121,7 +121,7 @@
emu_instr(regcontext_t *REGS)
{
int prefix = 1;
- u_int8_t *cs = (u_int8_t *)(uintptr_t)(R_CS << 4);
+ u_int8_t *cs = (u_int8_t *)(lomem_addr + (uintptr_t)(R_CS << 4));
int ip = R_IP;
int dir, i, instrlen;
u_int8_t *r8;
@@ -400,7 +400,7 @@
if (addr >= 0xa0000 && addr < 0xb0000)
return vga_read(addr);
else
- return *(u_int8_t *)(uintptr_t)addr;
+ return *(u_int8_t *)(uintptr_t)(lomem_addr + addr);
}
/* Write an 8-bit value to the location specified by 'addr'. If 'addr' lies
@@ -411,7 +411,7 @@
if (addr >= 0xa0000 && addr < 0xb0000)
vga_write(addr, val);
else
- *(u_int8_t *)(uintptr_t)addr = val;
+ *(u_int8_t *)(uintptr_t)(lomem_addr + addr) = val;
return;
}
@@ -425,7 +425,7 @@
vga_write(addr, (u_int8_t)(val & 0xff));
vga_write(addr + 1, (u_int8_t)((val & 0xff00) >> 8));
} else
- *(u_int16_t *)(uintptr_t)addr = val;
+ *(u_int16_t *)(uintptr_t)(lomem_addr + addr) = val;
return;
}
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/debug.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/debug.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/debug.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -162,13 +162,13 @@
debug (D_ALWAYS, "cs=%04x ss=%04x ds=%04x es=%04x\n", R_CS, R_SS, R_DS, R_ES);
debug (D_ALWAYS, "ip=%x eflags=%"PRIx32"\n", R_IP, R_EFLAGS);
- addr = (u_char *)MAKEPTR(R_CS, R_IP);
+ addr = (u_char *)(lomem_addr + MAKEPTR(R_CS, R_IP));
for (i = 0; i < 16; i++)
debug (D_ALWAYS, "%02x ", addr[i]);
debug (D_ALWAYS, "\n");
- addr = (char *)MAKEPTR(R_CS, R_IP);
+ addr = (char *)(lomem_addr + MAKEPTR(R_CS, R_IP));
i386dis(R_CS, R_IP, addr, buf, 0);
debug (D_ALWAYS, "%s\n", buf);
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/doscmd.h
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/doscmd.h Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/doscmd.h Mon Aug 20 13:15:20 2012 (r240565)
@@ -50,6 +50,7 @@
#include <string.h>
#include <ucontext.h>
#include <errno.h>
+#include <stdbool.h>
#include <sys/signalvar.h>
#include <machine/sigframe.h>
@@ -96,7 +97,6 @@
extern int nparallel;
void bios_init(void);
-#if 0
extern volatile int poll_cnt;
void wakeup_poll(void);
void reset_poll(void);
@@ -105,6 +105,8 @@
/* cmos.c */
extern time_t delta_clock;
+void cmos_init(void);
+
/* cpu.c */
void cpu_init(void);
int emu_instr(regcontext_t *);
@@ -112,7 +114,6 @@
void int01(regcontext_t *);
void int03(regcontext_t *);
void int0d(regcontext_t *);
-#endif
/* debug.c */
extern int vflag;
@@ -200,7 +201,6 @@
extern int i386dis(unsigned short, unsigned short,
unsigned char *, char *, int);
-#if 0
/* int.c */
void init_ints(void);
int isinhardint(int);
@@ -213,7 +213,6 @@
/* int10.c */
extern void int10(regcontext_t *);
-#endif
/* int13.c */
extern int init_hdisk(int drive, int cyl, int head, int tracksize,
@@ -222,13 +221,12 @@
extern int disk_fd(int drive);
extern void make_readonly(int drive);
extern int search_floppy(int i);
-#if 0
extern void disk_bios_init(void);
-#endif
#if 0
/* int14.c */
extern int fossil;
+#endif
/* int16.c */
void int16(regcontext_t *);
@@ -243,6 +241,7 @@
/* int1a.c */
void int1a(regcontext_t *);
+#if 0
/* mem.c */
extern char *dosmem;
@@ -251,6 +250,7 @@
extern int mem_adjust(long addr, int size, int *availp);
extern void mem_free_owner(int owner);
extern void mem_change_owner(long addr, int owner);
+#endif
/* mouse.c */
void int33(regcontext_t *);
@@ -272,20 +272,26 @@
void outsb(regcontext_t *, int);
void outsx(regcontext_t *, int);
void outx(regcontext_t *, int);
+bool io_port_defined(int, int);
+#if 0
/* setver.c */
extern void setver(char *, short);
extern short getver(char *);
/* signal.c */
extern struct sigframe *saved_sigframe;
+#endif
extern regcontext_t *saved_regcontext;
+#if 0
extern int saved_valid;
extern void setsignal(int s, void (*h)(struct sigframe *));
+#endif
/* timer.c */
extern void timer_init(void);
+#if 0
/* trace.c */
extern int resettrace(regcontext_t *);
extern void tracetrap(regcontext_t *);
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/int.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/int.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/int.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -35,7 +35,7 @@
void *arg;
};
-static unsigned char IM;
+static unsigned char IM, IM2;
static int Irql;
static struct IRQ Irqs[8];
@@ -54,7 +54,6 @@
return Irqs[irql].within;
}
-#if 0
static void
set_vip(void)
{
@@ -74,12 +73,10 @@
R_EFLAGS &= ~PSL_VIP;
}
-#endif
void
resume_interrupt(void)
{
-#if 0
regcontext_t *REGS = saved_regcontext;
int irql;
@@ -99,7 +96,6 @@
}
}
set_vip();
-#endif
}
void
@@ -124,7 +120,6 @@
void
hardint(int irql)
{
-#if 0
regcontext_t *REGS = saved_regcontext;
u_int32_t vec = ivec[8 + irql];
@@ -132,14 +127,18 @@
** if we're dead, or there's no vector, or the saved registers
** are invalid
*/
+#if 0
if (dead || !saved_valid || vec == 0)
+#else
+ if (dead || vec == 0)
+#endif
return;
/*
** if the vector points into the BIOS, or the handler at the
** other end is just an IRET, don't bother
*/
- if ((vec >> 16) == 0xf000 || *(u_char *)VECPTR(vec) == 0xcf)
+ if ((vec >> 16) == 0xf000 || *(u_char *)(lomem_addr + VECPTR(vec)) == 0xcf)
return;
if (!int_allowed(irql)) {
@@ -166,18 +165,15 @@
PUSH(R_IP, REGS);
R_EFLAGS &= ~PSL_VIF; /* XXX disable interrupts */
PUTVEC(R_CS, R_IP, vec);
-#endif
}
void
unpend(int irql)
{
-#if 0
if (!Irqs[irql].pending)
return;
Irqs[irql].pending = 0;
set_vip();
-#endif
}
static unsigned char
@@ -194,15 +190,22 @@
}
static unsigned char
-imr_in(int port __unused)
+imr_in(int port)
{
- return IM;
+ if (port == 0x21)
+ return IM;
+ else if (port == 0xa1)
+ return IM2;
+ return 0;
}
static void
-imr_out(int port __unused, unsigned char val)
+imr_out(int port, unsigned char val)
{
- IM = val;
+ if (port == 0x21)
+ IM = val;
+ else if (port == 0xa1)
+ IM2 = val;
resume_interrupt();
}
@@ -220,14 +223,18 @@
** if we're dead, or there's no vector or the saved registers are
** invalid
*/
+#if 0
if (dead || !saved_valid || vec == 0)
+#else
+ if (dead || vec == 0)
+#endif
return;
/*
** if the vector points into the BIOS, or the handler at the other
** end is just an IRET, don't bother.
*/
- if ((vec >> 16) == 0xf000 || *(u_char *)VECPTR(vec) == 0xcf)
+ if ((vec >> 16) == 0xf000 || *(u_char *)(lomem_addr + VECPTR(vec)) == 0xcf)
return;
debug(D_TRAPS | intnum, "INT %02x [%04"PRIx32":%04"PRIx32"]\n",
@@ -251,11 +258,16 @@
Irqs[i].within = 0;
}
- IM = 0x00;
+ IM = IM2 = 0x00;
Irql = 8;
define_input_port_handler(0x20, irqc_in);
define_output_port_handler(0x20, irqc_out);
define_input_port_handler(0x21, imr_in);
define_output_port_handler(0x21, imr_out);
+
+ define_input_port_handler(0xa0, irqc_in);
+ define_output_port_handler(0xa0, irqc_out);
+ define_input_port_handler(0xa1, imr_in);
+ define_output_port_handler(0xa1, imr_out);
}
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/int10.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/int10.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/int10.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -49,6 +49,7 @@
int i, j;
int saved_row, saved_col;
+ debug(D_DISK, "%s:%d AH:%x AL:%x FLAGS:%x\n", __func__, __LINE__, R_AH, R_AL, R_FLAGS);
/*
* Any call to the video BIOS is enough to reset the poll
* count on the keyboard.
@@ -157,7 +158,10 @@
debug(D_VIDEO, "Read graphics pixel at %d, %d\n", R_CX, R_DX);
break;
case 0x0e: /* write character */
+#if 0
tty_write(R_AL, -1);
+#endif
+ tty_write(R_AL, TTYF_REDIRECT);
break;
case 0x0f: /* get current video mode */
R_AH = DpyCols; /* number of columns */
@@ -176,7 +180,7 @@
VGA_ATC[ATC_OverscanColor] = R_BH;
break;
case 0x02: /* Set all palette registers */
- addr = (char *)MAKEPTR(R_ES, R_DX);
+ addr = (char *)(lomem_addr + MAKEPTR(R_ES, R_DX));
for (i = 0; i < 16; i++)
palette[i] = *addr++;
VGA_ATC[ATC_OverscanColor] = *addr;
@@ -192,7 +196,7 @@
R_BH = VGA_ATC[ATC_OverscanColor];
break;
case 0x09: /* Read all palette registers */
- addr = (char *)MAKEPTR(R_ES, R_DX);
+ addr = (char *)(lomem_addr + MAKEPTR(R_ES, R_DX));
for (i = 0; i < 16; i++)
*addr++ = palette[i];
*addr = VGA_ATC[ATC_OverscanColor];
@@ -204,7 +208,7 @@
update_pixels();
break;
case 0x12: /* Set block of DAC registers */
- addr = (char *)MAKEPTR(R_ES, R_DX);
+ addr = (char *)(lomem_addr + MAKEPTR(R_ES, R_DX));
for (i = R_BX; i < R_BX + R_CX; i++) {
dac_rgb[i].red = *addr++;
dac_rgb[i].green = *addr++;
@@ -231,7 +235,7 @@
R_CL = dac_rgb[R_BX].blue;
break;
case 0x17: /* Read block of DAC registers */
- addr = (char *)MAKEPTR(R_ES, R_DX);
+ addr = (char *)(lomem_addr + MAKEPTR(R_ES, R_DX));
for (i = R_BX; i < R_BX + R_CX; i++) {
*addr++ = dac_rgb[i].red;
*addr++ = dac_rgb[i].green;
@@ -374,7 +378,7 @@
case 0x13: /* write character string */
if (!(xmode || quietmode))
goto unsupported;
- addr = (char *)MAKEPTR(R_ES, R_BP);
+ addr = (char *)(lomem_addr + MAKEPTR(R_ES, R_BP));
switch (R_AL & 0x03) {
case 0:
tty_report(&saved_row, &saved_col);
@@ -415,7 +419,7 @@
break;
case 0x1b: /* Video Functionality/State information */
if (R_BX == 0) {
- addr = (char *)MAKEPTR(R_ES, R_DI);
+ addr = (char *)(lomem_addr + MAKEPTR(R_ES, R_DI));
memcpy(addr, vga_status, 64);
R_AL = 0x1b;
}
Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/int13.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/int13.c Mon Aug 20 12:53:29 2012 (r240564)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/int13.c Mon Aug 20 13:15:20 2012 (r240565)
@@ -589,13 +589,11 @@
int side;
int drive;
-#if 0
reset_poll();
-#endif
R_FLAGS &= ~PSL_C;
- printf("%s:%d AH:%x AL:%x FLAGS:%x\n", __func__, __LINE__, R_AH, R_AL, R_FLAGS);
+ debug(D_DISK, "%s:%d AH:%x AL:%x FLAGS:%x\n", __func__, __LINE__, R_AH, R_AL, R_FLAGS);
drive = R_DL;
@@ -619,11 +617,11 @@
break;
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-soc-all
mailing list