# This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # kqemu-kmod-devel/Makefile # kqemu-kmod-devel/distinfo # kqemu-kmod-devel/pkg-descr # kqemu-kmod-devel/pkg-message # kqemu-kmod-devel/files/ # kqemu-kmod-devel/files/kqemu.in # kqemu-kmod-devel/files/patch-common-Makefile # kqemu-kmod-devel/files/patch-fpucontext # kqemu-kmod-devel/files/patch-kqemu-freebsd.c # kqemu-kmod-devel/files/patch-tssworkaround # echo x - kqemu-kmod-devel/Makefile sed 's/^X//' >kqemu-kmod-devel/Makefile << 'END-of-kqemu-kmod-devel/Makefile' X# New ports collection makefile for: kqemu-kmod X# Date created: 2005/10/25 X# Whom: nork@FreeBSD.org X# X# $FreeBSD: $ X# X XPORTNAME= kqemu XPORTVERSION= 1.4.0.p1 XCATEGORIES= emulators kld XMASTER_SITES= http://bellard.org/qemu/ \ X http://qemu.org/ \ X ${MASTER_SITE_LOCAL} XMASTER_SITE_SUBDIR= nox XPKGNAMESUFFIX= -kmod-devel XDISTNAME= ${PORTNAME}-${PORTVERSION:C/.p/pre/} XDIST_SUBDIR= kqemu X XMAINTAINER= nox@FreeBSD.org XCOMMENT= Kernel Accelerator for QEMU CPU Emulator (development version) X XONLY_FOR_ARCHS= i386 amd64 XHAS_CONFIGURE= yes XUSE_GMAKE= yes XCONFIGURE_ARGS+= --prefix=${PREFIX} --cc=${CC} XCONFLICTS= kqemu-kmod-[0-9]* X XUSE_RC_SUBR= kqemu X X.include X XPORTDOCS= kqemu-doc.html kqemu-tech.html XPLIST_FILES= "include/kqemu/kqemu.h" XPLIST_FILES+= "@dirrm include/kqemu" XPLIST_FILES+= "@cwd /" XPLIST_FILES+= ${KMODDIR:C,^/,,}/kqemu.ko XPLIST_FILES+= "@unexec kldxref ${KMODDIR}" X XMAKEFILE= Makefile.freebsd X X.if ${ARCH} == "amd64" XMAKE_ARGS+= ARCH=x86_64 X.endif X X# install where x11/nvidia-driver does also: XKMODDIR= /boot/modules X XMAKE_ENV+= KMODDIR="${KMODDIR}" X X.if !exists(${SRC_BASE}/sys/Makefile) XIGNORE= requires kernel source to be installed X.endif X X.if ${OSVERSION} >= 700024 && ${OSVERSION} < 700053 && !defined(NOKSE) X# XXX this is wrong if you have `nooption KSE' in your kernel config, X# please define NOKSE in that case (no longer a problem after attilio's X# Sun Jul 22 21:35:44 2007 UTC commit removing the KSE ABI incompatiblity) XCFLAGS+= -DKSE X.endif X XCFLAGS+= ${DEBUG_FLAGS} X Xpost-extract: X.if ${OSVERSION} >= 700024 && ${OSVERSION} < 700053 && !defined(NOKSE) X @${ECHO_MSG} "Compiling with -DKSE." X @${ECHO_MSG} "If this is wrong (i.e. you have \`nooption KSE' in your kernel config)," X @${ECHO_MSG} "then please define NOKSE." X.endif X Xdo-build: X @(cd ${BUILD_WRKSRC}/common; ${SETENV} ${MAKE_ENV} ${GMAKE} ${MAKE_FLAGS} Makefile ${MAKE_ARGS} ${ALL_TARGET}) X @(cd ${BUILD_WRKSRC}; ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} ${ALL_TARGET}) X Xdo-install: X @(cd ${INSTALL_WRKSRC} && ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} ${INSTALL_TARGET}) X ${MKDIR} ${PREFIX}/include/kqemu X ${INSTALL_DATA} ${WRKSRC}/kqemu.h ${PREFIX}/include/kqemu X.if !defined(NOPORTDOCS) X ${MKDIR} ${DOCSDIR} X ${INSTALL_DATA} ${WRKSRC}/kqemu-doc.html ${WRKSRC}/kqemu-tech.html \ X ${DOCSDIR} X.endif X X.include END-of-kqemu-kmod-devel/Makefile echo x - kqemu-kmod-devel/distinfo sed 's/^X//' >kqemu-kmod-devel/distinfo << 'END-of-kqemu-kmod-devel/distinfo' XMD5 (kqemu/kqemu-1.4.0pre1.tar.gz) = d738d8ca7332211ab716ec3213d82ee1 XSHA256 (kqemu/kqemu-1.4.0pre1.tar.gz) = bac3e84eae1c867b06cd06ed2bcf563ba8304bd4e5a900880c2abe61b9aab491 XSIZE (kqemu/kqemu-1.4.0pre1.tar.gz) = 168249 END-of-kqemu-kmod-devel/distinfo echo x - kqemu-kmod-devel/pkg-descr sed 's/^X//' >kqemu-kmod-devel/pkg-descr << 'END-of-kqemu-kmod-devel/pkg-descr' XKQEMU is a qemu accelerator kernel module on x86/amd64. X XWWW: http://fabrice.bellard.free.fr/qemu/ END-of-kqemu-kmod-devel/pkg-descr echo x - kqemu-kmod-devel/pkg-message sed 's/^X//' >kqemu-kmod-devel/pkg-message << 'END-of-kqemu-kmod-devel/pkg-message' X==== XNotice: XIf you installed this from a package and your kernel configuration Xdiffers from the one on the package build machine (or your kernel source Xis newer than the package), then the kld may not work, or even panic. XConsider building it from ports in that case. X==== END-of-kqemu-kmod-devel/pkg-message echo c - kqemu-kmod-devel/files/ mkdir -p kqemu-kmod-devel/files/ > /dev/null 2>&1 echo x - kqemu-kmod-devel/files/kqemu.in sed 's/^X//' >kqemu-kmod-devel/files/kqemu.in << 'END-of-kqemu-kmod-devel/files/kqemu.in' X#!/bin/sh X# $FreeBSD: ports/emulators/kqemu-kmod/files/kqemu.in,v 1.2 2006/12/21 22:13:24 miwi Exp $ X# X# PROVIDE: kqemu X# KEYWORD: nojail X# X# Add the following line to /etc/rc.conf[.local] to enable kqemu X# X# kqemu_enable="YES" X# X X. /etc/rc.subr X Xname="kqemu" Xrcvar=${name}_enable X Xload_rc_config $name X X: ${kqemu_enable="NO"} X Xstart_cmd=kqemu_start Xstop_cmd=kqemu_stop X Xkqemu_start() X{ X # load aio if needed X if ! kldstat -qm aio; then X if kldload aio; then X info 'aio module loaded.' X else X warn 'aio module failed to load.' X return 1 X fi X fi X if ! kldstat -qm kqemu; then X if kldload kqemu; then X echo 'kqemu module loaded.' X else X warn 'kqemu module failed to load.' X return 1 X fi X fi X return 0 X} X Xkqemu_stop() X{ X if kldstat -qm kqemu && kldunload kqemu; then X echo 'kqemu module unloaded.' X fi X} X Xrun_rc_command "$1" END-of-kqemu-kmod-devel/files/kqemu.in echo x - kqemu-kmod-devel/files/patch-common-Makefile sed 's/^X//' >kqemu-kmod-devel/files/patch-common-Makefile << 'END-of-kqemu-kmod-devel/files/patch-common-Makefile' XIndex: common/Makefile X@@ -47,9 +47,9 @@ X ifeq ($(ARCH), x86_64) X COMMON_CFLAGS+=-mno-red-zone X endif X-CFLAGS=$(COMMON_CFLAGS) X+CFLAGS=$(COMMON_CFLAGS) ${DEBUG_FLAGS} X MON_CFLAGS=$(COMMON_CFLAGS) X-KERNEL_CFLAGS=$(COMMON_CFLAGS) X+KERNEL_CFLAGS=$(COMMON_CFLAGS) ${DEBUG_FLAGS} X X # Disable SSP if GCC supports it X MON_CFLAGS+=$(call cc-option,$(MON_CC),-fno-stack-protector,) X@@ -119,7 +119,7 @@ X $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c -o $@ $< X X %.o: %.S X- $(CC) $(DEFINES) $(INCLUDES) -D__ASSEMBLY__ -c -o $@ $< X+ $(CC) ${DEBUG_FLAGS} $(DEFINES) $(INCLUDES) -D__ASSEMBLY__ -c -o $@ $< X X clean: X rm -f *.o *~ monitor-image.h genoffsets genmon monitor_def.h \ END-of-kqemu-kmod-devel/files/patch-common-Makefile echo x - kqemu-kmod-devel/files/patch-fpucontext sed 's/^X//' >kqemu-kmod-devel/files/patch-fpucontext << 'END-of-kqemu-kmod-devel/files/patch-fpucontext' XIndex: common/kernel.c X@@ -1240,6 +1240,11 @@ X case MON_REQ_EXCEPTION: X exec_exception(s->arg0); X break; X+#ifdef __FreeBSD__ X+ case MON_REQ_LOADFPUCONTEXT: X+ kqemu_loadfpucontext(s->arg0); X+ break; X+#endif X default: X kqemu_log("invalid mon request: %d\n", s->mon_req); X break; XIndex: common/kqemu_int.h X@@ -523,6 +523,7 @@ X MON_REQ_LOCK_USER_PAGE, X MON_REQ_UNLOCK_USER_PAGE, X MON_REQ_EXCEPTION, X+ MON_REQ_LOADFPUCONTEXT, X } MonitorRequest; X X #define INTERRUPT_ENTRY_SIZE 16 XIndex: common/monitor.c X@@ -1995,8 +1995,13 @@ X raise_exception_err(s, EXCP07_PREX, 0); X } else { X /* the host needs to restore the FPU state for us */ X+#ifndef __FreeBSD__ X s->mon_req = MON_REQ_EXCEPTION; X s->arg0 = 0x07; X+#else X+ s->mon_req = MON_REQ_LOADFPUCONTEXT; X+ s->arg0 = (unsigned long)s->cpu_state.cpl; X+#endif X monitor2kernel1(s); X } X } XIndex: kqemu-freebsd.c X@@ -33,6 +33,11 @@ X X #include X #include X+#ifdef __x86_64__ X+#include X+#else X+#include X+#endif X X #include "kqemu-kernel.h" X X@@ -172,6 +177,15 @@ X { X } X X+void CDECL kqemu_loadfpucontext(unsigned long cpl) X+{ X+#ifdef __x86_64__ X+ fpudna(); X+#else X+ npxdna(); X+#endif X+} X+ X #if __FreeBSD_version < 500000 X static int X curpriority_cmp(struct proc *p) XIndex: kqemu-kernel.h X@@ -40,6 +40,10 @@ X void * CDECL kqemu_io_map(unsigned long page_index, unsigned int size); X void CDECL kqemu_io_unmap(void *ptr, unsigned int size); X X+#ifdef __FreeBSD__ X+void CDECL kqemu_loadfpucontext(unsigned long cpl); X+#endif X+ X int CDECL kqemu_schedule(void); X X void CDECL kqemu_log(const char *fmt, ...); END-of-kqemu-kmod-devel/files/patch-fpucontext echo x - kqemu-kmod-devel/files/patch-kqemu-freebsd.c sed 's/^X//' >kqemu-kmod-devel/files/patch-kqemu-freebsd.c << 'END-of-kqemu-kmod-devel/files/patch-kqemu-freebsd.c' XIndex: kqemu-freebsd.c X@@ -208,9 +208,17 @@ X int CDECL kqemu_schedule(void) X { X /* kqemu_log("kqemu_schedule\n"); */ X+#if __FreeBSD_version < 700044 X mtx_lock_spin(&sched_lock); X mi_switch(SW_VOL, NULL); X mtx_unlock_spin(&sched_lock); X+#else X+ /* -current no longer uses sched_lock */ X+ struct thread *td = curthread; X+ thread_lock(td); X+ mi_switch(SW_VOL, NULL); X+ thread_unlock(td); X+#endif X return SIGPENDING(curthread); X } X #endif X@@ -320,8 +328,15 @@ X #if __FreeBSD_version >= 500000 X dev->si_drv1 = NULL; X TAILQ_REMOVE(&kqemuhead, ks, kqemu_ent); X+#if __FreeBSD_version >= 700051 X+ destroy_dev_sched(dev); X+#else X+#if __FreeBSD_version >= 700024 X+ dev_relthread(dev); X+#endif X destroy_dev(dev); X #endif X+#endif X free(ks, M_KQEMU); X --kqemu_ref_count; X } X@@ -427,6 +486,19 @@ X ks->state = s; X break; X } X+ case KQEMU_SET_PHYS_MEM: { X+ struct kqemu_phys_mem kphys_mem; X+ if (!s) { X+ ret = -EIO; X+ break; X+ } X+ kphys_mem = *(struct kqemu_phys_mem *)addr; X+ ret = kqemu_set_phys_mem(s, &kphys_mem); X+ if (ret != 0) { X+ ret = -EINVAL; X+ } X+ break; X+ } X case KQEMU_EXEC: { X struct kqemu_cpu_state *ctx; X if (s == NULL) { X@@ -500,7 +515,13 @@ X while ((ks = TAILQ_FIRST(&kqemuhead)) != NULL) { X kqemu_destroy(ks); X } X+#if __FreeBSD_version >= 700051 X+ drain_dev_clone_events(); X+#endif X clone_cleanup(&kqemuclones); X+#if __FreeBSD_version >= 700051 X+ destroy_dev_drain(&kqemu_cdevsw); X+#endif X #endif X kqemu_global_delete(kqemu_gs); X kqemu_gs = NULL; END-of-kqemu-kmod-devel/files/patch-kqemu-freebsd.c echo x - kqemu-kmod-devel/files/patch-tssworkaround sed 's/^X//' >kqemu-kmod-devel/files/patch-tssworkaround << 'END-of-kqemu-kmod-devel/files/patch-tssworkaround' XIndex: kqemu-freebsd.c X@@ -38,6 +38,14 @@ X #else X #include X #endif X+#ifdef __x86_64__ X+#include X+#include X+#include X+#include X+#include X+#include X+#endif X X #include "kqemu-kernel.h" X X@@ -248,6 +256,57 @@ X va_end(ap); X } X X+#ifdef __x86_64__ X+int kqemu_cpu0gdtfixed; X+int kqemu_gdts_used; X+struct user_segment_descriptor *kqemu_gdts; X+struct region_descriptor kqemu_r_newgdt; X+extern struct pcpu __pcpu[]; X+ X+/* called with interrupts disabled */ X+void CDECL kqemu_tss_fixup(unsigned long kerngdtbase) X+{ X+ int gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); X+ unsigned cpuid = PCPU_GET(cpuid); X+ struct user_segment_descriptor *newgdt = gdt; X+ X+ if (mp_ncpus <= 1 || kerngdtbase != (unsigned long)gdt) X+ /* UP host or gdt already moved, nothing to do */ X+ return; X+ if (cpuid) { X+ /* move gdts of all but first cpu */ X+ if (!kqemu_gdts) X+ /* X+ * XXX gdt is allocated as X+ * struct user_segment_descriptor gdt[NGDT * MAXCPU]; X+ * so it has room for the moved copies; need to allocate at X+ * kldload (and only free if kqemu_gdts_used is zero) should this X+ * change in the future X+ */ X+ kqemu_gdts = &gdt[NGDT]; X+ ++kqemu_gdts_used; X+ newgdt = &kqemu_gdts[NGDT * (cpuid - 1)]; X+ bcopy(gdt, newgdt, NGDT * sizeof(gdt[0])); X+ kqemu_r_newgdt.rd_limit = NGDT * sizeof(gdt[0]) - 1; X+ kqemu_r_newgdt.rd_base = (long) newgdt; X+ } else { X+ if (kqemu_cpu0gdtfixed) X+ return; X+ ++kqemu_cpu0gdtfixed; X+ } X+ gdt_segs[GPROC0_SEL].ssd_base = (long) &common_tss[cpuid]; X+ ssdtosyssd(&gdt_segs[GPROC0_SEL], X+ (struct system_segment_descriptor *)&newgdt[GPROC0_SEL]); X+ if (cpuid) { X+ lgdt(&kqemu_r_newgdt); X+ wrmsr(MSR_GSBASE, (u_int64_t)&__pcpu[cpuid]); X+ wrmsr(MSR_KGSBASE, curthread->td_pcb->pcb_gsbase); X+ wrmsr(MSR_FSBASE, curthread->td_pcb->pcb_fsbase); X+ } X+ ltr(gsel_tss); X+} X+#endif X+ X struct kqemu_instance { X #if __FreeBSD_version >= 500000 X TAILQ_ENTRY(kqemu_instance) kqemu_ent; XIndex: common/kernel.c X@@ -1025,6 +1025,9 @@ X #ifdef __x86_64__ X uint16_t saved_ds, saved_es; X unsigned long fs_base, gs_base; X+#ifdef __FreeBSD__ X+ struct kqemu_global_state *g = s->global_state; X+#endif X #endif X X #ifdef PROFILE X@@ -1096,6 +1099,14 @@ X apic_nmi_mask = apic_save_and_disable_nmi(s); X } X X+#ifdef __FreeBSD__ X+#ifdef __x86_64__ X+ spin_lock(&g->lock); X+ asm volatile ("sgdt %0" : : "m" (s->kernel_gdt)); X+ kqemu_tss_fixup(s->kernel_gdt.base); X+ spin_unlock(&g->lock); X+#endif X+#endif X /* load breakpoint registers and avoid setting them if in the X monitor address space. We suppose that no breakpoints are X set by the host OS for this process */ XIndex: kqemu-kernel.h X@@ -48,4 +48,10 @@ X X void CDECL kqemu_log(const char *fmt, ...); X X+#ifdef __FreeBSD__ X+#ifdef __x86_64__ X+void CDECL kqemu_tss_fixup(unsigned long kerngdtbase); X+#endif X+#endif X+ X #endif /* KQEMU_KERNEL_H */ END-of-kqemu-kmod-devel/files/patch-tssworkaround exit