summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkamil <kamil@pkgsrc.org>2019-02-13 05:20:15 +0000
committerkamil <kamil@pkgsrc.org>2019-02-13 05:20:15 +0000
commit4b5434b7530e53be06191122aa68231026264f8d (patch)
tree1ac88403d8d0cbcdefb5b67a1fd4c0d96a2e56dd
parent529a54e7b02f980db5467d8496f333611da6e13f (diff)
downloadpkgsrc-4b5434b7530e53be06191122aa68231026264f8d.tar.gz
emulators/haxm: import haxm-0.c072ad9b68e1d558a9fb791511468d10a1a9b319
HAXM is a cross-platform hardware-assisted virtualization engine (hypervisor), widely used as an accelerator for Android Emulator and QEMU. It has always supported running on Windows and macOS, and has been ported to other host operating systems as well, such as Linux and NetBSD. HAXM runs as a kernel-mode driver on the host operating system, and provides a KVM-like interface to user space, thereby enabling applications like QEMU to utilize the hardware virtualization capabilities built into modern Intel CPUs, namely Intel Virtualization Technology.
-rw-r--r--emulators/haxm/DESCR9
-rw-r--r--emulators/haxm/Makefile58
-rw-r--r--emulators/haxm/PLIST5
-rw-r--r--emulators/haxm/distinfo11
-rw-r--r--emulators/haxm/files/haxm-mknod25
-rw-r--r--emulators/haxm/files/haxm-modload.in3
-rw-r--r--emulators/haxm/files/haxm-modunload3
-rw-r--r--emulators/haxm/patches/patch-core_ia32.c20
-rw-r--r--emulators/haxm/patches/patch-core_ia32__ops.asm19
-rw-r--r--emulators/haxm/patches/patch-core_include_ia32.h25
-rw-r--r--emulators/haxm/patches/patch-core_include_vcpu.h16
-rw-r--r--emulators/haxm/patches/patch-core_vcpu.c34
12 files changed, 228 insertions, 0 deletions
diff --git a/emulators/haxm/DESCR b/emulators/haxm/DESCR
new file mode 100644
index 00000000000..adbfbcd88e4
--- /dev/null
+++ b/emulators/haxm/DESCR
@@ -0,0 +1,9 @@
+HAXM is a cross-platform hardware-assisted virtualization engine (hypervisor),
+widely used as an accelerator for Android Emulator and QEMU. It has always
+supported running on Windows and macOS, and has been ported to other host
+operating systems as well, such as Linux and NetBSD.
+
+HAXM runs as a kernel-mode driver on the host operating system, and provides a
+KVM-like interface to user space, thereby enabling applications like QEMU to
+utilize the hardware virtualization capabilities built into modern Intel CPUs,
+namely Intel Virtualization Technology.
diff --git a/emulators/haxm/Makefile b/emulators/haxm/Makefile
new file mode 100644
index 00000000000..0ef39c552f5
--- /dev/null
+++ b/emulators/haxm/Makefile
@@ -0,0 +1,58 @@
+# $NetBSD: Makefile,v 1.1 2019/02/13 05:20:15 kamil Exp $
+
+GITHUB_PROJECT= haxm
+GITHUB_TAG= c072ad9b68e1d558a9fb791511468d10a1a9b319
+DISTNAME= haxm-0.${GITHUB_TAG}
+CATEGORIES= emulators
+MASTER_SITES= ${MASTER_SITE_GITHUB:=intel/}
+
+MAINTAINER= kamil@NetBSD.org
+HOMEPAGE= https://github.com/intel/haxm/
+COMMENT= Intel Hardware Accelerated Execution Manager
+LICENSE= modified-bsd
+
+WRKSRC= ${WRKDIR}/haxm-${GITHUB_TAG}
+
+ONLY_FOR_PLATFORM= NetBSD-*-x86_64
+OSVERSION_SPECIFIC= YES
+
+BUILD_DIRS= platforms/netbsd
+
+BUILDLINK_PASSTHRU_DIRS+= ${BSDSRCDIR}/sys
+
+BUILD_DEFS+= BSDSRCDIR
+
+.include "../../mk/compiler.mk"
+
+.if !empty(PKGSRC_COMPILER:Mclang)
+CFLAGS+= -Wno-error=address-of-packed-member
+.endif
+
+KMOD= haxm.kmod
+KMODULEDIR= stand/${MACHINE}/${OS_VERSION}/modules
+
+INSTALLATION_DIRS+= sbin # auxiliary scripts
+INSTALLATION_DIRS+= ${KMODULEDIR}
+
+PLIST_SUBST+= MACHINE=${MACHINE}
+
+pre-configure:
+.for file in haxm-mknod haxm-modunload
+ ${CP} ${FILESDIR}/${file} ${WRKSRC}
+.endfor
+ ${SED} \
+ -e 's|@PREFIX@|${PREFIX}|g' \
+ -e 's|@MACHINE@|${MACHINE}|g' \
+ -e 's|@OS_VERSION@|${OS_VERSION}|g' \
+ ${FILESDIR}/haxm-modload.in > ${WRKSRC}/haxm-modload
+
+do-install:
+ ${RUN} cd ${WRKSRC}/platforms/netbsd && \
+ ${INSTALL_PROGRAM} ${KMOD} ${DESTDIR}${PREFIX}/${KMODULEDIR}
+.for file in haxm-modload haxm-modunload haxm-mknod
+ ${RUN} cd ${WRKSRC} && \
+ ${INSTALL_SCRIPT} ${file} ${DESTDIR}${PREFIX}/sbin
+.endfor
+
+
+.include "../../mk/bsd.pkg.mk"
diff --git a/emulators/haxm/PLIST b/emulators/haxm/PLIST
new file mode 100644
index 00000000000..1c5ebf664d9
--- /dev/null
+++ b/emulators/haxm/PLIST
@@ -0,0 +1,5 @@
+@comment $NetBSD: PLIST,v 1.1 2019/02/13 05:20:15 kamil Exp $
+sbin/haxm-mknod
+sbin/haxm-modload
+sbin/haxm-modunload
+stand/${MACHINE}/${OS_VERSION}/modules/haxm.kmod
diff --git a/emulators/haxm/distinfo b/emulators/haxm/distinfo
new file mode 100644
index 00000000000..524f2e7b60d
--- /dev/null
+++ b/emulators/haxm/distinfo
@@ -0,0 +1,11 @@
+$NetBSD: distinfo,v 1.1 2019/02/13 05:20:15 kamil Exp $
+
+SHA1 (haxm-0.c072ad9b68e1d558a9fb791511468d10a1a9b319-c072ad9b68e1d558a9fb791511468d10a1a9b319.tar.gz) = da6fe9b8c98292e8c4ca5f62ad6aa9a4a65c6bb1
+RMD160 (haxm-0.c072ad9b68e1d558a9fb791511468d10a1a9b319-c072ad9b68e1d558a9fb791511468d10a1a9b319.tar.gz) = 6c1248be0b9ee775c9879627bf60d20eb3a94368
+SHA512 (haxm-0.c072ad9b68e1d558a9fb791511468d10a1a9b319-c072ad9b68e1d558a9fb791511468d10a1a9b319.tar.gz) = df8e8b634fea18faa05ae57648dee6500a5b0d93fa081172835e1991ab3ae2b6ad0ad1a99d91d695f0a6656e79744445ff6f6f42947b311bb8245640dd8cff23
+Size (haxm-0.c072ad9b68e1d558a9fb791511468d10a1a9b319-c072ad9b68e1d558a9fb791511468d10a1a9b319.tar.gz) = 233043 bytes
+SHA1 (patch-core_ia32.c) = 6252b1b49d5198a9c16aa206cbfc1981c43c9b70
+SHA1 (patch-core_ia32__ops.asm) = ca208e579a39a15f5c62322dcad595b4b0ac4a34
+SHA1 (patch-core_include_ia32.h) = 3195558c44d1d196a7ac89aaa9b1931790395acc
+SHA1 (patch-core_include_vcpu.h) = 9b9e020d4e15f9e310ef5d22fa41b2289813394f
+SHA1 (patch-core_vcpu.c) = 068a20bf96c797cfd5f4629ce0e5cbb0104995a8
diff --git a/emulators/haxm/files/haxm-mknod b/emulators/haxm/files/haxm-mknod
new file mode 100644
index 00000000000..1a92fb9067a
--- /dev/null
+++ b/emulators/haxm/files/haxm-mknod
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+if [ -e /dev/HAX ]; then
+ echo "ERR: HAXM devices have been already created"
+ exit 1
+fi
+
+echo "*** Creating HAX devices ***"
+mknod /dev/HAX c 220 0
+mkdir /dev/hax_vm
+for i in `seq 0 7`; do mkdir /dev/hax_vm0$i; done
+for i in `seq 0 7`; do mknod /dev/hax_vm/vm0$i c 222 $i; done
+
+echo "*** Creating VCPU Nodes ***"
+i=0
+while [ $i -lt 128 ]; do
+ vm=$(echo "$i/16"|bc)
+ vcpu=$(echo "$i%16"|bc)
+ echo "i=$i vm=$vm vcpu=$vcpu"
+ cmd=$(printf "mknod /dev/hax_vm%02d/vcpu%02d c 221 %d" $vm $vcpu $i)
+ $cmd
+ let "i+=1"
+done
+
+echo "*** Done ****"
diff --git a/emulators/haxm/files/haxm-modload.in b/emulators/haxm/files/haxm-modload.in
new file mode 100644
index 00000000000..617c9ded992
--- /dev/null
+++ b/emulators/haxm/files/haxm-modload.in
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+modload @PREFIX@/stand/@MACHINE@/@OS_VERSION@/modules/haxm.kmod
diff --git a/emulators/haxm/files/haxm-modunload b/emulators/haxm/files/haxm-modunload
new file mode 100644
index 00000000000..9e2e279e337
--- /dev/null
+++ b/emulators/haxm/files/haxm-modunload
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+modunload haxm
diff --git a/emulators/haxm/patches/patch-core_ia32.c b/emulators/haxm/patches/patch-core_ia32.c
new file mode 100644
index 00000000000..33e0e0f8848
--- /dev/null
+++ b/emulators/haxm/patches/patch-core_ia32.c
@@ -0,0 +1,20 @@
+$NetBSD: patch-core_ia32.c,v 1.1 2019/02/13 05:20:15 kamil Exp $
+
+Cherry-pick from upstream review:
+ - Fix FPU DNA exception on NetBSD
+ https://github.com/intel/haxm/pull/168
+
+--- core/ia32.c.orig 2019-02-12 09:24:47.000000000 +0000
++++ core/ia32.c
+@@ -81,6 +81,11 @@ uint64_t ia32_rdtsc(void)
+ #endif
+ }
+
++void hax_clts(void)
++{
++ asm_clts();
++}
++
+ void hax_fxinit(void)
+ {
+ asm_fxinit();
diff --git a/emulators/haxm/patches/patch-core_ia32__ops.asm b/emulators/haxm/patches/patch-core_ia32__ops.asm
new file mode 100644
index 00000000000..01ed0385e1e
--- /dev/null
+++ b/emulators/haxm/patches/patch-core_ia32__ops.asm
@@ -0,0 +1,19 @@
+$NetBSD: patch-core_ia32__ops.asm,v 1.1 2019/02/13 05:20:15 kamil Exp $
+
+Cherry-pick from upstream review:
+ - Fix FPU DNA exception on NetBSD
+ https://github.com/intel/haxm/pull/168
+
+--- core/ia32_ops.asm.orig 2019-02-12 09:24:47.000000000 +0000
++++ core/ia32_ops.asm
+@@ -213,6 +213,10 @@ function asm_enable_irq, 0
+ sti
+ ret
+
++function asm_clts, 0
++ clts
++ ret
++
+ function asm_fxinit, 0
+ finit
+ ret
diff --git a/emulators/haxm/patches/patch-core_include_ia32.h b/emulators/haxm/patches/patch-core_include_ia32.h
new file mode 100644
index 00000000000..c5b782a94ad
--- /dev/null
+++ b/emulators/haxm/patches/patch-core_include_ia32.h
@@ -0,0 +1,25 @@
+$NetBSD: patch-core_include_ia32.h,v 1.1 2019/02/13 05:20:15 kamil Exp $
+
+Cherry-pick from upstream review:
+ - Fix FPU DNA exception on NetBSD
+ https://github.com/intel/haxm/pull/168
+
+--- core/include/ia32.h.orig 2019-02-12 09:24:47.000000000 +0000
++++ core/include/ia32.h
+@@ -72,6 +72,7 @@ void ASMCALL set_kernel_fs(uint16_t val)
+
+ void ASMCALL asm_btr(uint8_t *addr, uint bit);
+ void ASMCALL asm_bts(uint8_t *addr, uint bit);
++void ASMCALL asm_clts(void);
+ void ASMCALL asm_fxinit(void);
+ void ASMCALL asm_fxsave(mword *addr);
+ void ASMCALL asm_fxrstor(mword *addr);
+@@ -85,6 +86,8 @@ void ia32_wrmsr(uint32_t reg, uint64_t v
+
+ uint64_t ia32_rdtsc(void);
+
++void hax_clts(void);
++
+ void hax_fxinit(void);
+ void hax_fxsave(mword *addr);
+ void hax_fxrstor(mword *addr);
diff --git a/emulators/haxm/patches/patch-core_include_vcpu.h b/emulators/haxm/patches/patch-core_include_vcpu.h
new file mode 100644
index 00000000000..f9c27d0a914
--- /dev/null
+++ b/emulators/haxm/patches/patch-core_include_vcpu.h
@@ -0,0 +1,16 @@
+$NetBSD: patch-core_include_vcpu.h,v 1.1 2019/02/13 05:20:15 kamil Exp $
+
+Cherry-pick from upstream review:
+ - Fix FPU DNA exception on NetBSD
+ https://github.com/intel/haxm/pull/168
+
+--- core/include/vcpu.h.orig 2019-02-12 09:24:47.000000000 +0000
++++ core/include/vcpu.h
+@@ -238,6 +238,7 @@ struct vcpu_t {
+ #ifdef CONFIG_HAX_EPT2
+ struct mmio_fetch_cache mmio_fetch;
+ #endif // CONFIG_HAX_EPT2
++ int cr0_ts;
+ };
+
+ #define vmx(v, field) v->vmx.field
diff --git a/emulators/haxm/patches/patch-core_vcpu.c b/emulators/haxm/patches/patch-core_vcpu.c
new file mode 100644
index 00000000000..e0878e3e13f
--- /dev/null
+++ b/emulators/haxm/patches/patch-core_vcpu.c
@@ -0,0 +1,34 @@
+$NetBSD: patch-core_vcpu.c,v 1.1 2019/02/13 05:20:15 kamil Exp $
+
+Cherry-pick from upstream review:
+ - Fix FPU DNA exception on NetBSD
+ https://github.com/intel/haxm/pull/168
+
+--- core/vcpu.c.orig 2019-02-12 09:24:47.000000000 +0000
++++ core/vcpu.c
+@@ -2041,6 +2041,10 @@ static void vcpu_enter_fpu_state(struct
+ struct fx_layout *hfx = (struct fx_layout *)hax_page_va(hstate->hfxpage);
+ struct fx_layout *gfx = (struct fx_layout *)hax_page_va(gstate->gfxpage);
+
++ vcpu->cr0_ts = !!(get_cr0() & CR0_TS);
++
++ hax_clts();
++
+ hax_fxsave((mword *)hfx);
+ hax_fxrstor((mword *)gfx);
+ }
+@@ -2052,8 +2056,14 @@ static void vcpu_exit_fpu_state(struct v
+ struct fx_layout *hfx = (struct fx_layout *)hax_page_va(hstate->hfxpage);
+ struct fx_layout *gfx = (struct fx_layout *)hax_page_va(gstate->gfxpage);
+
++ hax_clts();
++
+ hax_fxsave((mword *)gfx);
+ hax_fxrstor((mword *)hfx);
++
++ if (vcpu->cr0_ts) {
++ set_cr0(get_cr0() | CR0_TS);
++ }
+ }
+
+ // Instructions are never longer than 15 bytes: