Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Jul 2012 03:21:21 +0000
From:      syuu@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r239263 - soc2012/syuu/bhyve-bios/usr.sbin/bhyve
Message-ID:  <20120711032121.3EC891065670@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: syuu
Date: Wed Jul 11 03:21:20 2012
New Revision: 239263
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239263

Log:
  add bios_int16

Added:
  soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int16.c
Modified:
  soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile
  soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int13.c
  soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int18.c
  soc2012/syuu/bhyve-bios/usr.sbin/bhyve/pci_virtio_block.c

Modified: soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile
==============================================================================
--- soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile	Wed Jul 11 02:57:32 2012	(r239262)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile	Wed Jul 11 03:21:20 2012	(r239263)
@@ -8,7 +8,7 @@
 SRCS+=  instruction_emul.c mevent.c
 SRCS+=	pci_emul.c pci_hostbridge.c pci_passthru.c pci_virtio_block.c
 SRCS+=	pci_virtio_net.c pci_uart.c pit_8254.c post.c rtc.c uart.c xmsr.c
-SRCS+=  bios_call.c bios_int10.c bios_int13.c bios_int18.c
+SRCS+=  bios_call.c bios_int10.c bios_int13.c bios_int16.c bios_int18.c
 
 NO_MAN=
 

Modified: soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int13.c
==============================================================================
--- soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int13.c	Wed Jul 11 02:57:32 2012	(r239262)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int13.c	Wed Jul 11 03:21:20 2012	(r239263)
@@ -36,22 +36,23 @@
 #include <termios.h>
 #include <unistd.h>
 #include <stdbool.h>
+#include <fcntl.h>
 
 #include <machine/vmm.h>
 #include <vmmapi.h>
 
 #include "bios_call.h"
+#include "fbsdrun.h"
 
-#define MAKEPTR(s, o)		(((s) << 4) + (o))
-
-extern int block_drive_c_fd;
+/* XXX */
+#define SECTOR_SIZE 512
 
 static int
 int13_handler(struct vmctx *ctx, int vcpu, int intno)
 {
-	uint64_t rax, rbx, rcx, rdx, es_base, rflags;
-	uint32_t es_limit, es_access;
-	uint16_t bx;
+	uint64_t rax, rbx, rcx, rdx, rsi, rflags, es_base, es_select, ds_base, ds_select;
+	uint32_t es_limit, es_access, ds_limit, ds_access;
+	uint16_t bx, ds16, es16, si;
 	uint8_t al, ah, cl, ch, dl, dh;
 	int error;
 
@@ -67,29 +68,162 @@
 	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RDX, &rdx)) != 0)
 		goto done;
 
+	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSI, &rsi)) != 0)
+		goto done;
+
 	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, &rflags)) != 0)
 		goto done;
 
+	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_ES, &es_select)) != 0)
+		goto done;
+
+	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DS, &ds_select)) != 0)
+		goto done;
+
 	if ((error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_ES, &es_base,
 		&es_limit, &es_access)) != 0)
 		goto done;
 
+	if ((error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_DS, &ds_base,
+		&ds_limit, &ds_access)) != 0)
+		goto done;
+
 	al = (uint8_t)rax;
 	ah = (uint8_t)(rax >> 8);
 	bx = (uint16_t)rbx;
 	cl = (uint8_t)rcx;
 	ch = (uint8_t)(rcx >> 8);
+	dl = (uint8_t)rdx;
+	dh = (uint8_t)(rdx >> 8);
+	es16 = (uint16_t)es_base;
+	ds16 = (uint16_t)ds_base;
+	si = (uint16_t)rsi;
 
-	printf("%s rax=%lx ah=%x al=%x rbx=%lx bx=%x rcx=%lx ch=%x cl=%x rdx=%lx dh=%x dl=%x es_base=%lx es_limit=%x es_access=%x\n",
-		__func__, rax, ah, al, rbx, bx, rcx, ch, cl, rdx, dh, dl, es_base, es_limit, es_access);
-
+	printf("int:13h ah:%xh", ah);
 	switch (ah) {
+	case 0x00:
+		rflags &= ~0x1;
+		error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
+		printf(" rflags=%lx\n", rflags);
+		break;
 	case 0x02:
+		{
+			unsigned int pos;
+			ssize_t siz;
+			int fd;
+
+			/* XXX: pass fd from somewhere else */
+			fd = open("diskdev", O_RDWR);
+			if (fd < 0) {
+				perror("open ");
+				goto fail02;
+			}
+
+			/* cylinder */
+ 			pos = ch * 2 * 18 * SECTOR_SIZE;
+			/* head */
+			pos += dh * 18 * SECTOR_SIZE;
+			/* sector */
+			pos += (cl - 1) * SECTOR_SIZE;
+
+			printf(" cylinder=%x head=%x sector=%x addr=%x:%x count=%x\n",
+				ch, dh, cl, es16, bx, al);
+			siz = pread(fd, 
+				paddr_guest2host((es16 << 4) + bx),
+				al * SECTOR_SIZE, pos);
+			if (siz < 0) {
+				perror("read ");
+				error = -1;
+				close(fd);
+				goto fail02;
+			}
+			rflags &= ~0x1;
+			error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
+			close(fd);
+			break;
+fail02:
+			rflags |= 0x1;
+			vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
+			break;
+		}
+	case 0x08:
+		printf(" dl=%x rflags=%lx\n", dl, rflags);
+		if (dl == 0x80) {
+			if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, 0)) != 0)
+				break;
+			if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RBX, 0x02)) != 0)
+				break;
+			if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RCX, 0xFFFF)) != 0)
+				break;
+			if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RDX, 0x0101)) != 0)
+				break;
+
+			rflags &= ~0x1;
+		}else{
+			rflags |= 0x1;
+		}
+		error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
 		break;
 	case 0x41:
+		printf(" bx=%x cx=%x rflags=%lx\n", bx, (uint32_t)rcx, rflags);
+		if (bx == 0x55aa) {
+			if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RBX, 0xaa55)) != 0)
+				break;
+			if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RCX, cl | 0x01)) != 0)
+				break;
+			rflags &= ~0x1;
+			error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
+			break;
+		}
 		rflags |= 0x1;
 		error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
 		break;
+	case 0x42:
+		{
+			ssize_t siz;
+			int fd;
+			char *dap;
+			uint16_t sector, segment, offset;
+			uint64_t count;
+
+			/* XXX: pass fd from somewhere else */
+			fd = open("diskdev", O_RDWR);
+			if (fd < 0) {
+				perror("open ");
+				goto fail42;
+			}
+
+			dap = (char *)paddr_guest2host((ds16 << 4) + si);
+			sector = *(uint16_t *)(dap + 0x02);
+			offset = *(uint16_t *)(dap + 0x04);
+			segment = *(uint16_t *)(dap + 0x06);
+			count = *(uint64_t *)(dap + 0x08);
+
+			printf(" dap=%x:%x sector=%x dest=%x:%x count=%lx\n",
+				ds16, si, sector, segment, offset, count);
+			
+			siz = pread(fd, 
+				paddr_guest2host((segment << 4) + offset),
+				count * SECTOR_SIZE, sector * SECTOR_SIZE);
+			if (siz < 0) {
+				perror("read ");
+				error = siz;
+				close(fd);
+				goto fail42;
+			}
+			if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, al)) != 0)
+				goto fail42;
+
+			rflags &= ~0x1;
+			error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
+			close(fd);
+			break;
+fail42:
+			rflags |= 0x1;
+			vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
+			break;
+		}
+
 	default:
         	fprintf(stderr, "Not implemented BIOS call int=%x ah=%x\n",
 			intno, ah);

Added: soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int16.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int16.c	Wed Jul 11 03:21:20 2012	(r239263)
@@ -0,0 +1,103 @@
+/*-
+ * Copyright (c) 2011 NetApp, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#include <machine/vmm.h>
+#include <vmmapi.h>
+
+#include "consport.h"
+#include "bios_call.h"
+
+static int
+int16_handler(struct vmctx *ctx, int vcpu, int intno)
+{
+	uint64_t rax, rflags;
+	uint8_t al, ah;
+	int error;
+
+	if (!console_opened) {
+		ttyopen();
+		console_opened = 1;
+	}
+
+	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RAX, &rax)) != 0)
+		goto done;
+
+	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, &rflags)) != 0)
+		goto done;
+
+
+	al = (uint8_t)rax;
+	ah = (uint8_t)(rax >> 8);
+
+	switch (ah) {
+	case 0x00:
+		{
+			int c;
+			while((c = ttyread()) == -1)
+				;
+			
+			error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, c & 0xff);
+			break;
+		}
+	case 0x01:
+		{
+			int c = ttyread();
+			if (c == -1) {
+				rflags |= 0x40;	
+			} else {
+				rflags &= ~0x40;
+				if ((error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, c & 0xff)) != 0) 
+					goto done;
+			}
+			
+			error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
+			
+			break;
+		}
+
+	default:
+        	fprintf(stderr, "Not implemented BIOS call int=%x ah=%x\n",
+			intno, ah);
+	}
+
+done:
+	return (error);
+
+}
+BIOS_CALL(int16, 0x16, int16_handler);

Modified: soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int18.c
==============================================================================
--- soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int18.c	Wed Jul 11 02:57:32 2012	(r239262)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyve/bios_int18.c	Wed Jul 11 03:21:20 2012	(r239263)
@@ -29,11 +29,13 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <stdio.h>
 #include "bios_call.h"
 
 static int
 int18_handler(struct vmctx *ctx, int vcpu, int intno)
 {
+	printf("int18\n");
 	return (0);
 }
 BIOS_CALL(int18, 0x18, int18_handler);

Modified: soc2012/syuu/bhyve-bios/usr.sbin/bhyve/pci_virtio_block.c
==============================================================================
--- soc2012/syuu/bhyve-bios/usr.sbin/bhyve/pci_virtio_block.c	Wed Jul 11 02:57:32 2012	(r239262)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyve/pci_virtio_block.c	Wed Jul 11 03:21:20 2012	(r239263)
@@ -136,8 +136,6 @@
 	struct vtblk_config vbsc_cfg;	
 };
 
-int block_drive_c_fd = -1;
-
 /*
  * Return the number of available descriptors in the vring taking care
  * of the 16-bit index wraparound.
@@ -362,10 +360,6 @@
 		return (1);
 	}
 
-	if (block_drive_c_fd == -1) {
-		block_drive_c_fd = fd;
-	}
-	
 	sc = malloc(sizeof(struct pci_vtblk_softc));
 	memset(sc, 0, sizeof(struct pci_vtblk_softc));
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120711032121.3EC891065670>