pkgsrc-WIP-changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

qemu-haxm: Enable HAXM on NetBSD



Module Name:	pkgsrc-wip
Committed By:	Kamil Rytarowski <n54%gmx.com@localhost>
Pushed By:	kamil
Date:		Fri Nov 23 17:03:09 2018 +0100
Changeset:	41e81083faf9f01e25f5f6daabefe45568891aa5

Modified Files:
	qemu-haxm/distinfo
Added Files:
	qemu-haxm/patches/patch-configure
	qemu-haxm/patches/patch-target_i386_Makefile.objs
	qemu-haxm/patches/patch-target_i386_hax-i386.h
	qemu-haxm/patches/patch-target_i386_hax-posix.c
	qemu-haxm/patches/patch-target_i386_hax-posix.h

Log Message:
qemu-haxm: Enable HAXM on NetBSD

To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=41e81083faf9f01e25f5f6daabefe45568891aa5

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

diffstat:
 qemu-haxm/distinfo                                |   5 +
 qemu-haxm/patches/patch-configure                 |  12 +
 qemu-haxm/patches/patch-target_i386_Makefile.objs |  16 ++
 qemu-haxm/patches/patch-target_i386_hax-i386.h    |  24 ++
 qemu-haxm/patches/patch-target_i386_hax-posix.c   | 328 ++++++++++++++++++++++
 qemu-haxm/patches/patch-target_i386_hax-posix.h   |  66 +++++
 6 files changed, 451 insertions(+)

diffs:
diff --git a/qemu-haxm/distinfo b/qemu-haxm/distinfo
index 70e435446a..7d2f0a2155 100644
--- a/qemu-haxm/distinfo
+++ b/qemu-haxm/distinfo
@@ -4,4 +4,9 @@ SHA1 (qemu-2.8.1.tar.bz2) = 224289c5e568e400920363820a0647e2aca569e7
 RMD160 (qemu-2.8.1.tar.bz2) = 93f71138d19c871195c9e0b1a7ba66275773f93a
 SHA512 (qemu-2.8.1.tar.bz2) = 0397b4029cdcb77ed053c44b3579a3f34894038e6fc6b4aa88de14515f5a78bf2f41c5e865f37111529f567c85d2f1c4deefae47dde54f76eac79410e5b2bdda
 Size (qemu-2.8.1.tar.bz2) = 28366270 bytes
+SHA1 (patch-configure) = 7eb16fed7bd1d7e7d51ca985041be4b147908922
+SHA1 (patch-target_i386_Makefile.objs) = d04bdfa99133f81da517ada33d9190bb0450465f
+SHA1 (patch-target_i386_hax-i386.h) = b6b45788984ef847cdfb2c53b2259af60c9e48b6
+SHA1 (patch-target_i386_hax-posix.c) = daed080339c1e6d578075957e7d7f46d08206ea3
+SHA1 (patch-target_i386_hax-posix.h) = efe3108c7b61e14efdb3d68c3f6b1006ec77bb2e
 SHA1 (patch-tests_Makefile.include) = a1dab206f61947079602d1bafcefc419b5d17881
diff --git a/qemu-haxm/patches/patch-configure b/qemu-haxm/patches/patch-configure
new file mode 100644
index 0000000000..14b89efe9b
--- /dev/null
+++ b/qemu-haxm/patches/patch-configure
@@ -0,0 +1,12 @@
+$NetBSD$
+
+--- configure.orig	2018-11-23 12:57:45.000000000 +0000
++++ configure
+@@ -809,6 +809,7 @@ DragonFly)
+ ;;
+ NetBSD)
+   bsd="yes"
++  hax="yes"
+   make="${MAKE-gmake}"
+   audio_drv_list="oss"
+   audio_possible_drivers="oss sdl"
diff --git a/qemu-haxm/patches/patch-target_i386_Makefile.objs b/qemu-haxm/patches/patch-target_i386_Makefile.objs
new file mode 100644
index 0000000000..a0d39da068
--- /dev/null
+++ b/qemu-haxm/patches/patch-target_i386_Makefile.objs
@@ -0,0 +1,16 @@
+$NetBSD$
+
+--- target/i386/Makefile.objs.orig	2018-11-23 12:57:45.000000000 +0000
++++ target/i386/Makefile.objs
+@@ -12,8 +12,10 @@ obj-$(call lnot,$(CONFIG_HYPERV)) += hyp
+ ifeq ($(CONFIG_WIN32),y)
+ obj-$(CONFIG_HAX) += hax-all.o hax-mem.o hax-windows.o
+ endif
++ifdef CONFIG_POSIX
++obj-$(CONFIG_HAX) += hax-all.o hax-mem.o hax-posix.o
++endif
+ ifeq ($(CONFIG_DARWIN),y)
+-obj-$(CONFIG_HAX) += hax-all.o hax-mem.o hax-darwin.o
+ obj-$(CONFIG_HVF) += hvf/
+ endif
+ obj-$(CONFIG_WHPX) += whpx-all.o
diff --git a/qemu-haxm/patches/patch-target_i386_hax-i386.h b/qemu-haxm/patches/patch-target_i386_hax-i386.h
new file mode 100644
index 0000000000..3fa8b7cff6
--- /dev/null
+++ b/qemu-haxm/patches/patch-target_i386_hax-i386.h
@@ -0,0 +1,24 @@
+$NetBSD$
+
+--- target/i386/hax-i386.h.orig	2018-11-23 12:57:45.000000000 +0000
++++ target/i386/hax-i386.h
+@@ -16,7 +16,7 @@
+ #include "cpu.h"
+ #include "sysemu/hax.h"
+ 
+-#ifdef CONFIG_DARWIN
++#ifdef CONFIG_POSIX
+ typedef int hax_fd;
+ #endif
+ 
+@@ -82,8 +82,8 @@ hax_fd hax_mod_open(void);
+ void hax_memory_init(void);
+ 
+ 
+-#ifdef CONFIG_DARWIN
+-#include "target/i386/hax-darwin.h"
++#ifdef CONFIG_POSIX
++#include "target/i386/hax-posix.h"
+ #endif
+ 
+ #ifdef CONFIG_WIN32
diff --git a/qemu-haxm/patches/patch-target_i386_hax-posix.c b/qemu-haxm/patches/patch-target_i386_hax-posix.c
new file mode 100644
index 0000000000..cb4d276a99
--- /dev/null
+++ b/qemu-haxm/patches/patch-target_i386_hax-posix.c
@@ -0,0 +1,328 @@
+$NetBSD$
+
+--- target/i386/hax-posix.c.orig	2018-11-23 13:15:38.664358354 +0000
++++ target/i386/hax-posix.c
+@@ -0,0 +1,323 @@
++/*
++ * QEMU HAXM support
++ *
++ * Copyright (c) 2011 Intel Corporation
++ *  Written by:
++ *  Jiang Yunhong<yunhong.jiang%intel.com@localhost>
++ *
++ * This work is licensed under the terms of the GNU GPL, version 2 or later.
++ * See the COPYING file in the top-level directory.
++ *
++ */
++
++/* HAX module interface - darwin version */
++#include "qemu/osdep.h"
++#include <sys/ioctl.h>
++
++#include "target/i386/hax-i386.h"
++
++hax_fd hax_mod_open(void)
++{
++    int fd = open("/dev/HAX", O_RDWR);
++    if (fd == -1) {
++        fprintf(stderr, "Failed to open the hax module\n");
++    }
++
++    fcntl(fd, F_SETFD, FD_CLOEXEC);
++
++    return fd;
++}
++
++int hax_populate_ram(uint64_t va, uint64_t size)
++{
++    int ret;
++
++    if (!hax_global.vm || !hax_global.vm->fd) {
++        fprintf(stderr, "Allocate memory before vm create?\n");
++        return -EINVAL;
++    }
++
++    if (hax_global.supports_64bit_ramblock) {
++        struct hax_ramblock_info ramblock = {
++            .start_va = va,
++            .size = size,
++            .reserved = 0
++        };
++
++        ret = ioctl(hax_global.vm->fd, HAX_VM_IOCTL_ADD_RAMBLOCK, &ramblock);
++    } else {
++        struct hax_alloc_ram_info info = {
++            .size = (uint32_t)size,
++            .pad = 0,
++            .va = va
++        };
++
++        ret = ioctl(hax_global.vm->fd, HAX_VM_IOCTL_ALLOC_RAM, &info);
++    }
++    if (ret < 0) {
++        fprintf(stderr, "Failed to register RAM block: ret=%d, va=0x%" PRIx64
++                ", size=0x%" PRIx64 ", method=%s\n", ret, va, size,
++                hax_global.supports_64bit_ramblock ? "new" : "legacy");
++        return ret;
++    }
++    return 0;
++}
++
++int hax_set_ram(uint64_t start_pa, uint32_t size, uint64_t host_va, int flags)
++{
++    struct hax_set_ram_info info;
++    int ret;
++
++    info.pa_start = start_pa;
++    info.size = size;
++    info.va = host_va;
++    info.flags = (uint8_t) flags;
++
++    ret = ioctl(hax_global.vm->fd, HAX_VM_IOCTL_SET_RAM, &info);
++    if (ret < 0) {
++        return -errno;
++    }
++    return 0;
++}
++
++int hax_capability(struct hax_state *hax, struct hax_capabilityinfo *cap)
++{
++    int ret;
++
++    ret = ioctl(hax->fd, HAX_IOCTL_CAPABILITY, cap);
++    if (ret == -1) {
++        fprintf(stderr, "Failed to get HAX capability\n");
++        return -errno;
++    }
++
++    return 0;
++}
++
++int hax_mod_version(struct hax_state *hax, struct hax_module_version *version)
++{
++    int ret;
++
++    ret = ioctl(hax->fd, HAX_IOCTL_VERSION, version);
++    if (ret == -1) {
++        fprintf(stderr, "Failed to get HAX version\n");
++        return -errno;
++    }
++
++    return 0;
++}
++
++static char *hax_vm_devfs_string(int vm_id)
++{
++    char *name;
++
++    if (vm_id > MAX_VM_ID) {
++        fprintf(stderr, "Too big VM id\n");
++        return NULL;
++    }
++
++#define HAX_VM_DEVFS "/dev/hax_vm/vmxx"
++    name = g_strdup(HAX_VM_DEVFS);
++    if (!name) {
++        return NULL;
++    }
++
++    snprintf(name, sizeof HAX_VM_DEVFS, "/dev/hax_vm/vm%02d", vm_id);
++    return name;
++}
++
++static char *hax_vcpu_devfs_string(int vm_id, int vcpu_id)
++{
++    char *name;
++
++    if (vm_id > MAX_VM_ID || vcpu_id > MAX_VCPU_ID) {
++        fprintf(stderr, "Too big vm id %x or vcpu id %x\n", vm_id, vcpu_id);
++        return NULL;
++    }
++
++#define HAX_VCPU_DEVFS "/dev/hax_vmxx/vcpuxx"
++    name = g_strdup(HAX_VCPU_DEVFS);
++    if (!name) {
++        return NULL;
++    }
++
++    snprintf(name, sizeof HAX_VCPU_DEVFS, "/dev/hax_vm%02d/vcpu%02d",
++             vm_id, vcpu_id);
++    return name;
++}
++
++int hax_host_create_vm(struct hax_state *hax, int *vmid)
++{
++    int ret;
++    int vm_id = 0;
++
++    if (hax_invalid_fd(hax->fd)) {
++        return -EINVAL;
++    }
++
++    if (hax->vm) {
++        return 0;
++    }
++
++    ret = ioctl(hax->fd, HAX_IOCTL_CREATE_VM, &vm_id);
++    *vmid = vm_id;
++    return ret;
++}
++
++hax_fd hax_host_open_vm(struct hax_state *hax, int vm_id)
++{
++    hax_fd fd;
++    char *vm_name = NULL;
++
++    vm_name = hax_vm_devfs_string(vm_id);
++    if (!vm_name) {
++        return -1;
++    }
++
++    fd = open(vm_name, O_RDWR);
++    g_free(vm_name);
++
++    fcntl(fd, F_SETFD, FD_CLOEXEC);
++
++    return fd;
++}
++
++int hax_notify_qemu_version(hax_fd vm_fd, struct hax_qemu_version *qversion)
++{
++    int ret;
++
++    if (hax_invalid_fd(vm_fd)) {
++        return -EINVAL;
++    }
++
++    ret = ioctl(vm_fd, HAX_VM_IOCTL_NOTIFY_QEMU_VERSION, qversion);
++
++    if (ret < 0) {
++        fprintf(stderr, "Failed to notify qemu API version\n");
++        return ret;
++    }
++    return 0;
++}
++
++/* Simply assume the size should be bigger than the hax_tunnel,
++ * since the hax_tunnel can be extended later with compatibility considered
++ */
++int hax_host_create_vcpu(hax_fd vm_fd, int vcpuid)
++{
++    int ret;
++
++    ret = ioctl(vm_fd, HAX_VM_IOCTL_VCPU_CREATE, &vcpuid);
++    if (ret < 0) {
++        fprintf(stderr, "Failed to create vcpu %x\n", vcpuid);
++    }
++
++    return ret;
++}
++
++hax_fd hax_host_open_vcpu(int vmid, int vcpuid)
++{
++    char *devfs_path = NULL;
++    hax_fd fd;
++
++    devfs_path = hax_vcpu_devfs_string(vmid, vcpuid);
++    if (!devfs_path) {
++        fprintf(stderr, "Failed to get the devfs\n");
++        return -EINVAL;
++    }
++
++    fd = open(devfs_path, O_RDWR);
++    g_free(devfs_path);
++    if (fd < 0) {
++        fprintf(stderr, "Failed to open the vcpu devfs\n");
++    }
++    fcntl(fd, F_SETFD, FD_CLOEXEC);
++    return fd;
++}
++
++int hax_host_setup_vcpu_channel(struct hax_vcpu_state *vcpu)
++{
++    int ret;
++    struct hax_tunnel_info info;
++
++    ret = ioctl(vcpu->fd, HAX_VCPU_IOCTL_SETUP_TUNNEL, &info);
++    if (ret) {
++        fprintf(stderr, "Failed to setup the hax tunnel\n");
++        return ret;
++    }
++
++    if (!valid_hax_tunnel_size(info.size)) {
++        fprintf(stderr, "Invalid hax tunnel size %x\n", info.size);
++        ret = -EINVAL;
++        return ret;
++    }
++
++    vcpu->tunnel = (struct hax_tunnel *) (intptr_t) (info.va);
++    vcpu->iobuf = (unsigned char *) (intptr_t) (info.io_va);
++    return 0;
++}
++
++int hax_vcpu_run(struct hax_vcpu_state *vcpu)
++{
++    return ioctl(vcpu->fd, HAX_VCPU_IOCTL_RUN, NULL);
++}
++
++int hax_sync_fpu(CPUArchState *env, struct fx_layout *fl, int set)
++{
++    int ret, fd;
++
++    fd = hax_vcpu_get_fd(env);
++    if (fd <= 0) {
++        return -1;
++    }
++
++    if (set) {
++        ret = ioctl(fd, HAX_VCPU_IOCTL_SET_FPU, fl);
++    } else {
++        ret = ioctl(fd, HAX_VCPU_IOCTL_GET_FPU, fl);
++    }
++    return ret;
++}
++
++int hax_sync_msr(CPUArchState *env, struct hax_msr_data *msrs, int set)
++{
++    int ret, fd;
++
++    fd = hax_vcpu_get_fd(env);
++    if (fd <= 0) {
++        return -1;
++    }
++    if (set) {
++        ret = ioctl(fd, HAX_VCPU_IOCTL_SET_MSRS, msrs);
++    } else {
++        ret = ioctl(fd, HAX_VCPU_IOCTL_GET_MSRS, msrs);
++    }
++    return ret;
++}
++
++int hax_sync_vcpu_state(CPUArchState *env, struct vcpu_state_t *state, int set)
++{
++    int ret, fd;
++
++    fd = hax_vcpu_get_fd(env);
++    if (fd <= 0) {
++        return -1;
++    }
++
++    if (set) {
++        ret = ioctl(fd, HAX_VCPU_SET_REGS, state);
++    } else {
++        ret = ioctl(fd, HAX_VCPU_GET_REGS, state);
++    }
++    return ret;
++}
++
++int hax_inject_interrupt(CPUArchState *env, int vector)
++{
++    int fd;
++
++    fd = hax_vcpu_get_fd(env);
++    if (fd <= 0) {
++        return -1;
++    }
++
++    return ioctl(fd, HAX_VCPU_IOCTL_INTERRUPT, &vector);
++}
diff --git a/qemu-haxm/patches/patch-target_i386_hax-posix.h b/qemu-haxm/patches/patch-target_i386_hax-posix.h
new file mode 100644
index 0000000000..fd2893855b
--- /dev/null
+++ b/qemu-haxm/patches/patch-target_i386_hax-posix.h
@@ -0,0 +1,66 @@
+$NetBSD$
+
+--- target/i386/hax-posix.h.orig	2018-11-23 13:16:20.800231560 +0000
++++ target/i386/hax-posix.h
+@@ -0,0 +1,61 @@
++/*
++ * QEMU HAXM support
++ *
++ * Copyright (c) 2011 Intel Corporation
++ *  Written by:
++ *  Jiang Yunhong<yunhong.jiang%intel.com@localhost>
++ *  Xin Xiaohui<xiaohui.xin%intel.com@localhost>
++ *  Zhang Xiantao<xiantao.zhang%intel.com@localhost>
++ *
++ * This work is licensed under the terms of the GNU GPL, version 2 or later.
++ * See the COPYING file in the top-level directory.
++ *
++ */
++
++#ifndef TARGET_I386_HAX_DARWIN_H
++#define TARGET_I386_HAX_DARWIN_H
++
++#include <sys/ioctl.h>
++
++#define HAX_INVALID_FD  (-1)
++static inline int hax_invalid_fd(hax_fd fd)
++{
++    return fd <= 0;
++}
++
++static inline void hax_mod_close(struct hax_state *hax)
++{
++    close(hax->fd);
++}
++
++static inline void hax_close_fd(hax_fd fd)
++{
++    close(fd);
++}
++
++/* HAX model level ioctl */
++#define HAX_IOCTL_VERSION _IOWR(0, 0x20, struct hax_module_version)
++#define HAX_IOCTL_CREATE_VM _IOWR(0, 0x21, uint32_t)
++#define HAX_IOCTL_DESTROY_VM _IOW(0, 0x22, uint32_t)
++#define HAX_IOCTL_CAPABILITY _IOR(0, 0x23, struct hax_capabilityinfo)
++
++#define HAX_VM_IOCTL_VCPU_CREATE _IOWR(0, 0x80, uint32_t)
++#define HAX_VM_IOCTL_ALLOC_RAM _IOWR(0, 0x81, struct hax_alloc_ram_info)
++#define HAX_VM_IOCTL_SET_RAM _IOWR(0, 0x82, struct hax_set_ram_info)
++#define HAX_VM_IOCTL_VCPU_DESTROY _IOW(0, 0x83, uint32_t)
++#define HAX_VM_IOCTL_NOTIFY_QEMU_VERSION _IOW(0, 0x84, struct hax_qemu_version)
++#define HAX_VM_IOCTL_ADD_RAMBLOCK _IOW(0, 0x85, struct hax_ramblock_info)
++
++#define HAX_VCPU_IOCTL_RUN  _IO(0, 0xc0)
++#define HAX_VCPU_IOCTL_SET_MSRS _IOWR(0, 0xc1, struct hax_msr_data)
++#define HAX_VCPU_IOCTL_GET_MSRS _IOWR(0, 0xc2, struct hax_msr_data)
++
++#define HAX_VCPU_IOCTL_SET_FPU  _IOW(0, 0xc3, struct fx_layout)
++#define HAX_VCPU_IOCTL_GET_FPU  _IOR(0, 0xc4, struct fx_layout)
++
++#define HAX_VCPU_IOCTL_SETUP_TUNNEL _IOWR(0, 0xc5, struct hax_tunnel_info)
++#define HAX_VCPU_IOCTL_INTERRUPT _IOWR(0, 0xc6, uint32_t)
++#define HAX_VCPU_SET_REGS       _IOWR(0, 0xc7, struct vcpu_state_t)
++#define HAX_VCPU_GET_REGS       _IOWR(0, 0xc8, struct vcpu_state_t)
++
++#endif /* TARGET_I386_HAX_DARWIN_H */


Home | Main Index | Thread Index | Old Index