Date: Tue, 03 Jul 2012 01:58:02 +0000 From: syuu@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r238875 - soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload Message-ID: <20120703015802.1A5501065670@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: syuu Date: Tue Jul 3 01:58:01 2012 New Revision: 238875 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238875 Log: Put pseudo bios handler on the code 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 Tue Jul 3 00:06:14 2012 (r238874) +++ soc2012/syuu/bhyve-bios/usr.sbin/bhyvebiosload/bhyvebiosload.c Tue Jul 3 01:58:01 2012 (r238875) @@ -77,13 +77,10 @@ #include <vmmapi.h> -#include "userboot.h" - #define MB (1024 * 1024UL) #define GB (1024 * 1024 * 1024UL) #define BSP 0 -static char *host_base = "/"; static struct termios term, oldterm; static int disk_fd = -1; @@ -91,134 +88,6 @@ static uint64_t lowmem, highmem; static struct vmctx *ctx; -static void cb_exit(void *arg, int v); - -/* - * Host filesystem i/o callbacks - */ - -struct cb_file { - int cf_isdir; - size_t cf_size; - struct stat cf_stat; - union { - int fd; - DIR *dir; - } cf_u; -}; - -static int -cb_open(void *arg, const char *filename, void **hp) -{ - struct stat st; - struct cb_file *cf; - char path[PATH_MAX]; - - if (!host_base) - return (ENOENT); - - strlcpy(path, host_base, PATH_MAX); - if (path[strlen(path) - 1] == '/') - path[strlen(path) - 1] = 0; - strlcat(path, filename, PATH_MAX); - cf = malloc(sizeof(struct cb_file)); - if (stat(path, &cf->cf_stat) < 0) { - free(cf); - return (errno); - } - - cf->cf_size = st.st_size; - if (S_ISDIR(cf->cf_stat.st_mode)) { - cf->cf_isdir = 1; - cf->cf_u.dir = opendir(path); - if (!cf->cf_u.dir) - goto out; - *hp = cf; - return (0); - } - if (S_ISREG(cf->cf_stat.st_mode)) { - cf->cf_isdir = 0; - cf->cf_u.fd = open(path, O_RDONLY); - if (cf->cf_u.fd < 0) - goto out; - *hp = cf; - return (0); - } - -out: - free(cf); - return (EINVAL); -} - -static int -cb_close(void *arg, void *h) -{ - struct cb_file *cf = h; - - if (cf->cf_isdir) - closedir(cf->cf_u.dir); - else - close(cf->cf_u.fd); - free(cf); - - return (0); -} - -static int -cb_read(void *arg, void *h, void *buf, size_t size, size_t *resid) -{ - struct cb_file *cf = h; - ssize_t sz; - - if (cf->cf_isdir) - return (EINVAL); - sz = read(cf->cf_u.fd, buf, size); - if (sz < 0) - return (EINVAL); - *resid = size - sz; - return (0); -} - -/* - * Guest virtual machine i/o callbacks - */ -static int -cb_copyin(void *arg, const void *from, uint64_t to, size_t size) -{ - - to &= 0x7fffffff; - if (to > lowmem) - return (EFAULT); - if (to + size > lowmem) - size = lowmem - to; - - memcpy(&membase[to], from, size); - - return (0); -} - -static void -cb_exec(void *arg, uint64_t rip) -{ - int error; - - error = vm_setup_bios_registers(ctx, BSP); - if (error) { - perror("vm_setup_freebsd_registers"); - cb_exit(NULL, USERBOOT_EXIT_QUIT); - } - - cb_exit(NULL, 0); -} - -static void -cb_exit(void *arg, int v) -{ - - tcsetattr(0, TCSAFLUSH, &oldterm); - exit(v); -} - static void usage(void) { @@ -232,12 +101,9 @@ int main(int argc, char** argv) { - void *h; int opt, error; char *disk_image; - struct cb_file *cf; - char *buf; - size_t res; + int i, addr; progname = argv[0]; @@ -245,16 +111,12 @@ highmem = 0; disk_image = NULL; - while ((opt = getopt(argc, argv, "d:h:m:M:")) != -1) { + while ((opt = getopt(argc, argv, "d:m:M:")) != -1) { switch (opt) { case 'd': disk_image = optarg; break; - case 'h': - host_base = optarg; - break; - case 'm': lowmem = strtoul(optarg, NULL, 0) * MB; break; @@ -315,39 +177,31 @@ tcsetattr(0, TCSAFLUSH, &term); disk_fd = open(disk_image, O_RDONLY); - buf = malloc(512); - if (read(disk_fd, buf, 512) != 512) { + if (read(disk_fd, &membase[0x7c00], 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 "); - return (1); - } - cf = h; - buf = malloc(6); - if (cb_read(NULL, cf, buf, 6, &res) != 0 || res != 0) { - fprintf(stderr, "cb_read\n"); - return (1); - } - - int addr = 0x400; - for (int i = 0x0; i < 0x400; i += 0x4) { + addr = 0x400; + for (i = 0x0; i < 0x400; i += 0x4) { uint16_t *p = (uint16_t *)&membase[i]; - cb_copyin(NULL, buf, addr, 6); + membase[addr + 0] = 0x0f; /* vmcall(3byte) */ + membase[addr + 1] = 0x01; + membase[addr + 2] = 0xc1; + membase[addr + 3] = 0xcf; /* iret */ *p = addr; p = (uint16_t *)&membase[i + 0x2]; *p = 0x0; - addr += 0x10; + addr += 4; + } + error = vm_setup_bios_registers(ctx, BSP); + if (error) { + perror("vm_setup_freebsd_registers"); + return (-1); } - free(buf); - cb_close(NULL, cf); - cb_exec(NULL, 0); + tcsetattr(0, TCSAFLUSH, &oldterm); return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120703015802.1A5501065670>