From owner-svn-soc-all@freebsd.org Wed Jul 8 12:49:50 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A0B01996F2F for ; Wed, 8 Jul 2015 12:49:50 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 83B1B1511 for ; Wed, 8 Jul 2015 12:49:50 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.9/8.14.9) with ESMTP id t68Cno3N008239 for ; Wed, 8 Jul 2015 12:49:50 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.9/8.14.9/Submit) id t68CnnFV008215 for svn-soc-all@FreeBSD.org; Wed, 8 Jul 2015 12:49:49 GMT (envelope-from mihai@FreeBSD.org) Date: Wed, 8 Jul 2015 12:49:49 GMT Message-Id: <201507081249.t68CnnFV008215@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288089 - in soc2015/mihai/bhyve-on-arm-head/usr.sbin: . bhyveloadarm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Jul 2015 12:49:50 -0000 Author: mihai Date: Wed Jul 8 12:49:48 2015 New Revision: 288089 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288089 Log: soc2015: mihai: bhyve: usr.sbin: bhyveloadarm: loading a guest at a given GPA and set PC at that address Added: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveloadarm/ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveloadarm/Makefile soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveloadarm/bhyveloadarm.c Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/Makefile.arm Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/Makefile.arm ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/usr.sbin/Makefile.arm Wed Jul 8 12:45:24 2015 (r288088) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/Makefile.arm Wed Jul 8 12:49:48 2015 (r288089) @@ -4,4 +4,5 @@ SUBDIR+= kgmon .if ${MK_BHYVE} != "no" SUBDIR+= bhyvearm +SUBDIR+= bhyveloadarm .endif Added: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveloadarm/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveloadarm/Makefile Wed Jul 8 12:49:48 2015 (r288089) @@ -0,0 +1,15 @@ +# $FreeBSD: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveload/Makefile 283905 2015-04-09 21:38:40Z bapt $ + +PROG= bhyveloadarm +SRCS= bhyveloadarm.c + +.PATH: ${.CURDIR}/../../sys/arm/vmm + +NO_MAN= + +DPADD+= ${LIBVMMAPIARM} +LDADD+= -lvmmapiarm + +WARNS?= 3 + +.include Added: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveloadarm/bhyveloadarm.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyveloadarm/bhyveloadarm.c Wed Jul 8 12:49:48 2015 (r288089) @@ -0,0 +1,167 @@ +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define MB (1024 * 1024UL) +#define GB (1024 * 1024 * 1024UL) +#define BSP 0 + +static char *vmname, *progname; +static struct vmctx *ctx; + + +/* + * Guest virtual machinee + */ +static int +guest_copyin(const void *from, uint64_t to, size_t size) +{ + char *ptr; + + ptr = vm_map_gpa(ctx, to, size); + if (ptr == NULL) + return (EFAULT); + + memcpy(ptr, from, size); + return (0); +} + +static int +guest_copyout(uint64_t from, void *to, size_t size) +{ + char *ptr; + + ptr = vm_map_gpa(ctx, from, size); + if (ptr == NULL) + return (EFAULT); + + memcpy(to, ptr, size); + return (0); +} + +static void +guest_setreg(enum vm_reg_name vmreg, uint64_t v) +{ + int error; + + error = vm_set_register(ctx, BSP, vmreg, v); + if (error) { + perror("vm_set_register"); + } +} + +static void +usage(void) +{ + + fprintf(stderr, + "usage: %s [-k ] -l , -b \n" + " %*s [-m mem-size] \n", + progname, + (int)strlen(progname), ""); + exit(1); +} + +int +main(int argc, char** argv) +{ + uint64_t mem_size; + int opt, error; + int kernel_image_fd; + uint64_t kernel_load_address, memory_base_address; + struct stat st; + void *addr; + + progname = basename(argv[0]); + + mem_size = 256 * MB; + + while ((opt = getopt(argc, argv, "k:l:b:m:")) != -1) { + switch (opt) { + case 'k': + kernel_image_fd = open(optarg, O_RDONLY); + if (kernel_image_fd == -1) { + errx(EX_USAGE, "Could not open '%s'", optarg); + } + break; + case 'l': + kernel_load_address = strtoul(optarg, NULL, 0); + break; + case 'b': + memory_base_address = strtoul(optarg, NULL, 0); + break; + case 'm': + mem_size = strtoul(optarg, NULL, 0) * MB; + break; + case '?': + usage(); + } + } + + argc -= optind; + argv += optind; + + if (argc != 1) + usage(); + + vmname = argv[0]; + + error = vm_create(vmname); + if (error) { + perror("vm_create"); + exit(1); + } + + ctx = vm_open(vmname); + if (ctx == NULL) { + perror("vm_open"); + exit(1); + } + + error = vm_setup_memory(ctx, memory_base_address, mem_size, VM_MMAP_ALL); + if (error) { + perror("vm_setup_memory"); + exit(1); + } + + error = fstat(kernel_image_fd, &st); + if (error) { + perror("fstat"); + exit(1); + } + + addr = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, kernel_image_fd, 0); + if (!addr) { + perror("mmap kernel_image_fd"); + exit(1); + } + + guest_copyin(addr, kernel_load_address, st.st_size); + munmap(addr, st.st_size); + + guest_setreg(VM_REG_GUEST_PC, kernel_load_address); + return 0; +}