diff options
author | Juergen Lock <nox@FreeBSD.org> | 2013-06-25 20:32:57 +0000 |
---|---|---|
committer | Juergen Lock <nox@FreeBSD.org> | 2013-06-25 20:32:57 +0000 |
commit | a1c0bdc00884ebe31a8cbc191c011b5a252d0936 (patch) | |
tree | d236aa3a51fbf07d4ae9b7e84e9c16847d3f2a20 /emulators/kqemu-kmod | |
parent | d34ccac259633fe403a6e4d29b2016c6079d4d0a (diff) | |
download | ports-a1c0bdc00884ebe31a8cbc191c011b5a252d0936.tar.gz ports-a1c0bdc00884ebe31a8cbc191c011b5a252d0936.zip |
Notes
Diffstat (limited to 'emulators/kqemu-kmod')
-rw-r--r-- | emulators/kqemu-kmod/Makefile | 41 | ||||
-rw-r--r-- | emulators/kqemu-kmod/files/patch-tssworkaround | 112 |
2 files changed, 13 insertions, 140 deletions
diff --git a/emulators/kqemu-kmod/Makefile b/emulators/kqemu-kmod/Makefile index 18379c7ee16a..48929f93ccdf 100644 --- a/emulators/kqemu-kmod/Makefile +++ b/emulators/kqemu-kmod/Makefile @@ -1,9 +1,5 @@ -# New ports collection makefile for: kqemu-kmod -# Date created: 2005/10/25 -# Whom: nork@FreeBSD.org -# +# Created by: nork@FreeBSD.org # $FreeBSD$ -# PORTNAME= kqemu PORTVERSION= 1.3.0.p11 @@ -20,6 +16,9 @@ DIST_SUBDIR= kqemu MAINTAINER= nox@FreeBSD.org COMMENT= Kernel Accelerator for QEMU CPU Emulator +LICENSE= GPLv2 +LICENSE_FILE= ${WRKSRC}/COPYING + ONLY_FOR_ARCHS= i386 amd64 HAS_CONFIGURE= yes USE_GMAKE= yes @@ -37,6 +36,7 @@ PLIST_FILES+= "@dirrm include/kqemu" PLIST_FILES+= "@cwd /" PLIST_FILES+= ${KMODDIR:C,^/,,}/kqemu.ko PLIST_FILES+= "@unexec kldxref ${KMODDIR}" +PLIST_FILES+= "@cwd" MAKEFILE= Makefile.freebsd @@ -49,43 +49,28 @@ KMODDIR= /boot/modules MAKE_ENV+= KMODDIR="${KMODDIR}" -.if !exists(${SRC_BASE}/sys/Makefile) -IGNORE= requires kernel source to be installed -.endif +SYSDIR?= ${SRC_BASE}/sys +MAKE_ENV+= SYSDIR="${SYSDIR}" -.if ${OSVERSION} >= 700024 && ${OSVERSION} < 700053 && !defined(NOKSE) -# XXX this is wrong if you have `nooption KSE' in your kernel config, -# please define NOKSE in that case (no longer a problem after attilio's -# Sun Jul 22 21:35:44 2007 UTC commit removing the KSE ABI incompatiblity) -CFLAGS+= -DKSE +.if !exists(${SYSDIR}/Makefile) +IGNORE= requires kernel source to be installed .endif -CFLAGS+= ${DEBUG_FLAGS} +CFLAGS+= ${DEBUG_FLAGS} -post-extract: -.if ${OSVERSION} >= 700024 && ${OSVERSION} < 700053 && !defined(NOKSE) - @${ECHO_MSG} "Compiling with -DKSE." - @${ECHO_MSG} "If this is wrong (i.e. you have \`nooption KSE' in your kernel config)," - @${ECHO_MSG} "then please define NOKSE." -.endif - -# 7.1 and head have seperate gdts also on amd64 now so the tss fixup code -# is no longer needed there post-patch: -.if ${OSVERSION} >= 701100 && (${OSVERSION} < 800000 || ${OSVERSION} >= 800046) - @cd ${WRKSRC} && ${PATCH} -R --quiet < ${FILESDIR}/patch-tssworkaround -.endif + @${REINPLACE_CMD} -e '/CC=/s,gcc,${CC},' ${WRKSRC}/common/Makefile do-build: @(cd ${BUILD_WRKSRC}; ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} beforedepend && ${LN} -sfh @/sys sys) @(cd ${BUILD_WRKSRC}/common; ${SETENV} ${MAKE_ENV} ${GMAKE} ${MAKE_FLAGS} Makefile ${MAKE_ARGS} ${ALL_TARGET}) - @(cd ${BUILD_WRKSRC}; ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} ${ALL_TARGET}) + @(cd ${BUILD_WRKSRC}; ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} CWARNFLAGS=-Wall ${ALL_TARGET}) do-install: @(cd ${INSTALL_WRKSRC} && ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} ${INSTALL_TARGET}) ${MKDIR} ${PREFIX}/include/kqemu ${INSTALL_DATA} ${WRKSRC}/kqemu.h ${PREFIX}/include/kqemu -.if !defined(NOPORTDOCS) +.if ${PORT_OPTIONS:MDOCS} ${MKDIR} ${DOCSDIR} ${INSTALL_DATA} ${WRKSRC}/kqemu-doc.html ${WRKSRC}/kqemu-tech.html \ ${DOCSDIR} diff --git a/emulators/kqemu-kmod/files/patch-tssworkaround b/emulators/kqemu-kmod/files/patch-tssworkaround deleted file mode 100644 index 922342bb7781..000000000000 --- a/emulators/kqemu-kmod/files/patch-tssworkaround +++ /dev/null @@ -1,112 +0,0 @@ -Index: kqemu-freebsd.c -@@ -38,6 +38,14 @@ - #else - #include <machine/npx.h> - #endif -+#ifdef __x86_64__ -+#include <sys/smp.h> -+#include <sys/pcpu.h> -+#include <machine/pcb.h> -+#include <machine/specialreg.h> -+#include <machine/segments.h> -+#include <machine/tss.h> -+#endif - - #include "kqemu-kernel.h" - -@@ -248,6 +256,57 @@ - va_end(ap); - } - -+#ifdef __x86_64__ -+int kqemu_cpu0gdtfixed; -+int kqemu_gdts_used; -+struct user_segment_descriptor *kqemu_gdts; -+struct region_descriptor kqemu_r_newgdt; -+extern struct pcpu __pcpu[]; -+ -+/* called with interrupts disabled */ -+void CDECL kqemu_tss_fixup(unsigned long kerngdtbase) -+{ -+ int gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); -+ unsigned cpuid = PCPU_GET(cpuid); -+ struct user_segment_descriptor *newgdt = gdt; -+ -+ if (mp_ncpus <= 1 || kerngdtbase != (unsigned long)gdt) -+ /* UP host or gdt already moved, nothing to do */ -+ return; -+ if (cpuid) { -+ /* move gdts of all but first cpu */ -+ if (!kqemu_gdts) -+ /* -+ * XXX gdt is allocated as -+ * struct user_segment_descriptor gdt[NGDT * MAXCPU]; -+ * so it has room for the moved copies; need to allocate at -+ * kldload (and only free if kqemu_gdts_used is zero) should this -+ * change in the future -+ */ -+ kqemu_gdts = &gdt[NGDT]; -+ ++kqemu_gdts_used; -+ newgdt = &kqemu_gdts[NGDT * (cpuid - 1)]; -+ bcopy(gdt, newgdt, NGDT * sizeof(gdt[0])); -+ kqemu_r_newgdt.rd_limit = NGDT * sizeof(gdt[0]) - 1; -+ kqemu_r_newgdt.rd_base = (long) newgdt; -+ } else { -+ if (kqemu_cpu0gdtfixed) -+ return; -+ ++kqemu_cpu0gdtfixed; -+ } -+ gdt_segs[GPROC0_SEL].ssd_base = (long) &common_tss[cpuid]; -+ ssdtosyssd(&gdt_segs[GPROC0_SEL], -+ (struct system_segment_descriptor *)&newgdt[GPROC0_SEL]); -+ if (cpuid) { -+ lgdt(&kqemu_r_newgdt); -+ wrmsr(MSR_GSBASE, (u_int64_t)&__pcpu[cpuid]); -+ wrmsr(MSR_KGSBASE, curthread->td_pcb->pcb_gsbase); -+ wrmsr(MSR_FSBASE, curthread->td_pcb->pcb_fsbase); -+ } -+ ltr(gsel_tss); -+} -+#endif -+ - struct kqemu_instance { - #if __FreeBSD_version >= 500000 - TAILQ_ENTRY(kqemu_instance) kqemu_ent; -Index: common/kernel.c -@@ -1025,6 +1025,9 @@ - #ifdef __x86_64__ - uint16_t saved_ds, saved_es; - unsigned long fs_base, gs_base; -+#ifdef __FreeBSD__ -+ struct kqemu_global_state *g = s->global_state; -+#endif - #endif - - #ifdef PROFILE -@@ -1096,6 +1099,14 @@ - apic_nmi_mask = apic_save_and_disable_nmi(s); - } - -+#ifdef __FreeBSD__ -+#ifdef __x86_64__ -+ spin_lock(&g->lock); -+ asm volatile ("sgdt %0" : : "m" (s->kernel_gdt)); -+ kqemu_tss_fixup(s->kernel_gdt.base); -+ spin_unlock(&g->lock); -+#endif -+#endif - /* load breakpoint registers and avoid setting them if in the - monitor address space. We suppose that no breakpoints are - set by the host OS for this process */ -Index: kqemu-kernel.h -@@ -48,4 +48,10 @@ - - void CDECL kqemu_log(const char *fmt, ...); - -+#ifdef __FreeBSD__ -+#ifdef __x86_64__ -+void CDECL kqemu_tss_fixup(unsigned long kerngdtbase); -+#endif -+#endif -+ - #endif /* KQEMU_KERNEL_H */ |