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