socsvn commit: r238855 - soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload

syuu at FreeBSD.org syuu at FreeBSD.org
Mon Jul 2 21:29:21 UTC 2012


Author: syuu
Date: Mon Jul  2 21:29:18 2012
New Revision: 238855
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238855

Log:
  Install real mode interrupt handler, support loading bootsector from disk image.

Modified:
  soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload/bhyvebiosload.c

Modified: soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload/bhyvebiosload.c
==============================================================================
--- soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload/bhyvebiosload.c	Mon Jul  2 21:28:42 2012	(r238854)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload/bhyvebiosload.c	Mon Jul  2 21:29:18 2012	(r238855)
@@ -274,6 +274,11 @@
 	if (argc != 1)
 		usage();
 
+	if (!disk_image) {
+		printf("disk image is required.\n");
+		exit(1);
+	}
+
 	vmname = argv[0];
 
 	error = vm_create(vmname);
@@ -309,9 +314,15 @@
 	term.c_iflag &= ~ICRNL;
 	tcsetattr(0, TCSAFLUSH, &term);
 
-	if (disk_image) {
-		disk_fd = open(disk_image, O_RDONLY);
+	disk_fd = open(disk_image, O_RDONLY);
+	buf = malloc(512);
+	if (read(disk_fd, buf, 512) != 512) {
+		perror("read ");
+		return (1);
 	}
+	cb_copyin(NULL, buf, 0x7c00, 512);
+	free(buf);
+	close(disk_fd);
 
 	if (cb_open(NULL, "/pseudobios.bin", &h)) {
 		perror("cb_open ");
@@ -319,15 +330,24 @@
 	}
 	cf = h;
 	buf = malloc(6);
-	if (cb_read(NULL, cf, buf, 3, &res) != 0 || res != 0) {
+	if (cb_read(NULL, cf, buf, 6, &res) != 0 || res != 0) {
 		fprintf(stderr, "cb_read\n");
 		return (1);
 	}
-#if 0
-	cb_copyin(NULL, buf, 0xFFFFFFF0, 3);
-#endif
-	cb_copyin(NULL, buf, 0x0, 3);
+
+	int addr = 0x400;
+	for (int i = 0x0; i < 0x400; i += 0x4) {
+		uint16_t *p = (uint16_t *)&membase[i];
+		cb_copyin(NULL, buf, addr, 6);
+		*p = addr;
+		p = (uint16_t *)&membase[i + 0x2];
+		*p = 0x0;
+		addr += 0x10;
+	}
+
+	free(buf);
 	cb_close(NULL, cf);
 	cb_exec(NULL, 0);
+
 	return (0);
 }


More information about the svn-soc-all mailing list