svn commit: r208880 - in projects/altix/sys: amd64/acpica amd64/amd64 amd64/ia32 amd64/include arm/arm boot/fdt/dts boot/i386/boot0 boot/i386/btx/btx boot/i386/btx/btxldr boot/i386/cdboot boot/i386...

Marcel Moolenaar marcel at FreeBSD.org
Sun Jun 6 21:19:05 UTC 2010


Author: marcel
Date: Sun Jun  6 21:19:04 2010
New Revision: 208880
URL: http://svn.freebsd.org/changeset/base/208880

Log:
  Merge svn+ssh://svn.freebsd.org/base/head@208879

Added:
  projects/altix/sys/boot/fdt/dts/
     - copied from r208879, head/sys/boot/fdt/dts/
  projects/altix/sys/dev/fdt/
     - copied from r208879, head/sys/dev/fdt/
  projects/altix/sys/dev/ofw/ofw_fdt.c
     - copied unchanged from r208879, head/sys/dev/ofw/ofw_fdt.c
  projects/altix/sys/dev/uart/uart_bus_fdt.c
     - copied unchanged from r208879, head/sys/dev/uart/uart_bus_fdt.c
  projects/altix/sys/libkern/memchr.c
     - copied unchanged from r208879, head/sys/libkern/memchr.c
  projects/altix/sys/powerpc/powermac/smusat.c
     - copied unchanged from r208879, head/sys/powerpc/powermac/smusat.c
  projects/altix/sys/tools/fdt/
     - copied from r208879, head/sys/tools/fdt/
Modified:
  projects/altix/sys/amd64/acpica/acpi_wakeup.c
  projects/altix/sys/amd64/amd64/cpu_switch.S
  projects/altix/sys/amd64/amd64/fpu.c
  projects/altix/sys/amd64/amd64/machdep.c
  projects/altix/sys/amd64/amd64/mca.c
  projects/altix/sys/amd64/amd64/mp_machdep.c
  projects/altix/sys/amd64/amd64/pmap.c
  projects/altix/sys/amd64/amd64/trap.c
  projects/altix/sys/amd64/amd64/vm_machdep.c
  projects/altix/sys/amd64/ia32/ia32_reg.c
  projects/altix/sys/amd64/include/fpu.h
  projects/altix/sys/amd64/include/pcb.h
  projects/altix/sys/arm/arm/pmap.c
  projects/altix/sys/boot/i386/boot0/Makefile
  projects/altix/sys/boot/i386/btx/btx/Makefile
  projects/altix/sys/boot/i386/btx/btxldr/Makefile
  projects/altix/sys/boot/i386/cdboot/Makefile
  projects/altix/sys/boot/i386/mbr/Makefile
  projects/altix/sys/boot/i386/pmbr/Makefile
  projects/altix/sys/boot/pc98/boot0.5/Makefile
  projects/altix/sys/boot/pc98/boot0/Makefile
  projects/altix/sys/boot/pc98/btx/btx/Makefile
  projects/altix/sys/boot/pc98/btx/btxldr/Makefile
  projects/altix/sys/boot/pc98/cdboot/Makefile
  projects/altix/sys/boot/sparc64/boot1/Makefile
  projects/altix/sys/boot/zfs/zfs.c
  projects/altix/sys/boot/zfs/zfsimpl.c
  projects/altix/sys/cam/ata/ata_pmp.c
  projects/altix/sys/cam/ata/ata_xpt.c
  projects/altix/sys/cam/cam_ccb.h
  projects/altix/sys/cam/cam_periph.c
  projects/altix/sys/cam/cam_xpt.c
  projects/altix/sys/cam/scsi/scsi_cd.c
  projects/altix/sys/cam/scsi/scsi_xpt.c
  projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
  projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
  projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
  projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
  projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
  projects/altix/sys/conf/files.powerpc
  projects/altix/sys/conf/options
  projects/altix/sys/contrib/libfdt/libfdt_env.h
  projects/altix/sys/crypto/via/padlock.c
  projects/altix/sys/crypto/via/padlock.h
  projects/altix/sys/crypto/via/padlock_cipher.c
  projects/altix/sys/crypto/via/padlock_hash.c
  projects/altix/sys/dev/acpica/acpi_ec.c
  projects/altix/sys/dev/ahci/ahci.c
  projects/altix/sys/dev/amdsbwd/amdsbwd.c
  projects/altix/sys/dev/ata/ata-all.h
  projects/altix/sys/dev/ata/ata-lowlevel.c
  projects/altix/sys/dev/ata/atapi-cam.c
  projects/altix/sys/dev/ata/chipsets/ata-acerlabs.c
  projects/altix/sys/dev/ata/chipsets/ata-intel.c
  projects/altix/sys/dev/ata/chipsets/ata-serverworks.c
  projects/altix/sys/dev/ath/ath_hal/ah.h
  projects/altix/sys/dev/ath/ath_hal/ah_eeprom_v1.c
  projects/altix/sys/dev/ath/ath_hal/ah_eeprom_v4k.c
  projects/altix/sys/dev/ath/ath_hal/ah_eeprom_v4k.h
  projects/altix/sys/dev/ath/ath_hal/ar5210/ar5210_reset.c
  projects/altix/sys/dev/ath/ath_hal/ar5211/ar5211_reset.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416phy.h
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416reg.h
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar9285_reset.c
  projects/altix/sys/dev/bge/if_bge.c
  projects/altix/sys/dev/bge/if_bgereg.h
  projects/altix/sys/dev/cas/if_cas.c
  projects/altix/sys/dev/fdc/fdc_acpi.c
  projects/altix/sys/dev/hwpmc/hwpmc_mod.c
  projects/altix/sys/dev/iicbus/iic.h
  projects/altix/sys/dev/isp/isp.c
  projects/altix/sys/dev/isp/isp_freebsd.c
  projects/altix/sys/dev/isp/isp_library.c
  projects/altix/sys/dev/isp/isp_pci.c
  projects/altix/sys/dev/ixgbe/ixgbe.c
  projects/altix/sys/dev/ixgbe/ixgbe.h
  projects/altix/sys/dev/mvs/mvs.c
  projects/altix/sys/dev/ofw/ofw_bus_subr.c
  projects/altix/sys/dev/ofw/ofw_bus_subr.h
  projects/altix/sys/dev/ofw/ofw_if.m
  projects/altix/sys/dev/ofw/ofw_standard.c
  projects/altix/sys/dev/ofw/openfirm.c
  projects/altix/sys/dev/ofw/openfirm.h
  projects/altix/sys/dev/random/nehemiah.c
  projects/altix/sys/dev/sge/if_sge.c
  projects/altix/sys/dev/siis/siis.c
  projects/altix/sys/fs/devfs/devfs_vnops.c
  projects/altix/sys/fs/udf/udf_vnops.c
  projects/altix/sys/geom/label/g_label.c
  projects/altix/sys/geom/mountver/g_mountver.c
  projects/altix/sys/geom/part/g_part_bsd.c
  projects/altix/sys/geom/part/g_part_gpt.c
  projects/altix/sys/i386/i386/machdep.c
  projects/altix/sys/i386/i386/mca.c
  projects/altix/sys/i386/i386/pmap.c
  projects/altix/sys/i386/i386/ptrace_machdep.c
  projects/altix/sys/i386/i386/swtch.s
  projects/altix/sys/i386/i386/trap.c
  projects/altix/sys/i386/i386/vm_machdep.c
  projects/altix/sys/i386/include/npx.h
  projects/altix/sys/i386/include/pcb.h
  projects/altix/sys/i386/include/pcpu.h
  projects/altix/sys/i386/isa/npx.c
  projects/altix/sys/i386/linux/linux_ptrace.c
  projects/altix/sys/i386/xen/pmap.c
  projects/altix/sys/ia64/ia64/pmap.c
  projects/altix/sys/isa/syscons_isa.c
  projects/altix/sys/kern/kern_jail.c
  projects/altix/sys/kern/kern_proc.c
  projects/altix/sys/kern/posix4_mib.c
  projects/altix/sys/kern/sched_4bsd.c
  projects/altix/sys/kern/sched_ule.c
  projects/altix/sys/kern/subr_acl_nfs4.c
  projects/altix/sys/kern/subr_acl_posix1e.c
  projects/altix/sys/kern/subr_taskqueue.c
  projects/altix/sys/kern/subr_trap.c
  projects/altix/sys/kern/uipc_sem.c
  projects/altix/sys/kern/uipc_shm.c
  projects/altix/sys/kern/uipc_socket.c
  projects/altix/sys/kern/vfs_acl.c
  projects/altix/sys/kern/vfs_bio.c
  projects/altix/sys/kern/vfs_subr.c
  projects/altix/sys/mips/mips/pmap.c
  projects/altix/sys/mips/mips/tick.c
  projects/altix/sys/mips/mips/uio_machdep.c
  projects/altix/sys/modules/Makefile
  projects/altix/sys/modules/iwnfw/Makefile.inc
  projects/altix/sys/modules/zfs/Makefile
  projects/altix/sys/net/vnet.h
  projects/altix/sys/net80211/ieee80211_hwmp.c
  projects/altix/sys/net80211/ieee80211_ioctl.c
  projects/altix/sys/net80211/ieee80211_scan_sta.c
  projects/altix/sys/netgraph/ng_pppoe.c
  projects/altix/sys/netinet/ip_mroute.c
  projects/altix/sys/netinet/ip_mroute.h
  projects/altix/sys/netinet/pim_var.h
  projects/altix/sys/netinet/sctp_auth.c
  projects/altix/sys/netinet/sctp_bsd_addr.c
  projects/altix/sys/netinet/sctp_constants.h
  projects/altix/sys/netinet/sctp_indata.c
  projects/altix/sys/netinet/sctp_input.c
  projects/altix/sys/netinet/sctp_lock_bsd.h
  projects/altix/sys/netinet/sctp_output.c
  projects/altix/sys/netinet/sctp_pcb.c
  projects/altix/sys/netinet/sctp_pcb.h
  projects/altix/sys/netinet/sctp_sysctl.c
  projects/altix/sys/netinet/sctp_usrreq.c
  projects/altix/sys/netinet/sctputil.c
  projects/altix/sys/nfsclient/nfs_vfsops.c
  projects/altix/sys/nfsclient/nfs_vnops.c
  projects/altix/sys/opencrypto/crypto.c
  projects/altix/sys/pc98/cbus/syscons_cbus.c
  projects/altix/sys/pc98/pc98/machdep.c
  projects/altix/sys/powerpc/aim/mmu_oea.c
  projects/altix/sys/powerpc/aim/mmu_oea64.c
  projects/altix/sys/powerpc/booke/pmap.c
  projects/altix/sys/powerpc/ofw/ofw_real.c
  projects/altix/sys/powerpc/powermac/kiic.c
  projects/altix/sys/powerpc/powermac/macgpio.c
  projects/altix/sys/powerpc/powermac/smu.c
  projects/altix/sys/powerpc/powermac/uninorth.c
  projects/altix/sys/powerpc/powerpc/intr_machdep.c
  projects/altix/sys/sparc64/sparc64/pmap.c
  projects/altix/sys/sun4v/sun4v/pmap.c
  projects/altix/sys/sys/_task.h
  projects/altix/sys/sys/libkern.h
  projects/altix/sys/sys/pmc.h
  projects/altix/sys/sys/posix4.h
  projects/altix/sys/sys/sysent.h
  projects/altix/sys/sys/taskqueue.h
  projects/altix/sys/sys/user.h
  projects/altix/sys/sys/vtoc.h
  projects/altix/sys/ufs/ufs/ufs_quota.c
  projects/altix/sys/vm/vm_contig.c
  projects/altix/sys/vm/vm_map.c
  projects/altix/sys/vm/vm_mmap.c
  projects/altix/sys/vm/vm_page.c
  projects/altix/sys/vm/vm_page.h
  projects/altix/sys/vm/vm_pageout.h
  projects/altix/sys/vm/vnode_pager.c
Directory Properties:
  projects/altix/lib/libstand/   (props changed)
  projects/altix/sys/   (props changed)
  projects/altix/sys/amd64/include/xen/   (props changed)
  projects/altix/sys/cddl/contrib/opensolaris/   (props changed)
  projects/altix/sys/contrib/dev/acpica/   (props changed)
  projects/altix/sys/contrib/x86emu/   (props changed)
  projects/altix/sys/dev/xen/xenpci/   (props changed)

Modified: projects/altix/sys/amd64/acpica/acpi_wakeup.c
==============================================================================
--- projects/altix/sys/amd64/acpica/acpi_wakeup.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/acpica/acpi_wakeup.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -245,7 +245,7 @@ acpi_sleep_machdep(struct acpi_softc *sc
 	cr3 = rcr3();
 	load_cr3(KPML4phys);
 
-	stopfpu = &stopxpcbs[0]->xpcb_pcb.pcb_save;
+	stopfpu = stopxpcbs[0]->xpcb_pcb.pcb_save;
 	if (acpi_savecpu(stopxpcbs[0])) {
 		fpugetregs(curthread, stopfpu);
 

Modified: projects/altix/sys/amd64/amd64/cpu_switch.S
==============================================================================
--- projects/altix/sys/amd64/amd64/cpu_switch.S	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/cpu_switch.S	Sun Jun  6 21:19:04 2010	(r208880)
@@ -116,7 +116,7 @@ done_store_dr:
 	/* have we used fp, and need a save? */
 	cmpq	%rdi,PCPU(FPCURTHREAD)
 	jne	1f
-	addq	$PCB_SAVEFPU,%r8
+	movq	PCB_SAVEFPU(%r8),%r8
 	clts
 	fxsave	(%r8)
 	smsw	%ax
@@ -341,7 +341,7 @@ ENTRY(savectx)
 	je	1f
 
 	movq	TD_PCB(%rax),%rdi
-	leaq	PCB_SAVEFPU(%rdi),%rdi
+	movq	PCB_SAVEFPU(%rdi),%rdi
 	clts
 	fxsave	(%rdi)
 	smsw	%ax
@@ -349,7 +349,7 @@ ENTRY(savectx)
 	lmsw	%ax
 
 	movq	$PCB_SAVEFPU_SIZE,%rdx	/* arg 3 */
-	leaq	PCB_SAVEFPU(%rcx),%rsi	/* arg 2 */
+	movq	PCB_SAVEFPU(%rcx),%rsi	/* arg 2 */
 	/* arg 1 (%rdi) already loaded */
 	call	bcopy
 1:

Modified: projects/altix/sys/amd64/amd64/fpu.c
==============================================================================
--- projects/altix/sys/amd64/amd64/fpu.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/fpu.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -91,8 +91,8 @@ void	stop_emulating(void);
 
 #endif	/* __GNUCLIKE_ASM && !lint */
 
-#define GET_FPU_CW(thread) ((thread)->td_pcb->pcb_save.sv_env.en_cw)
-#define GET_FPU_SW(thread) ((thread)->td_pcb->pcb_save.sv_env.en_sw)
+#define GET_FPU_CW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_cw)
+#define GET_FPU_SW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_sw)
 
 typedef u_char bool_t;
 
@@ -146,7 +146,7 @@ fpuexit(struct thread *td)
 	savecrit = intr_disable();
 	if (curthread == PCPU_GET(fpcurthread)) {
 		stop_emulating();
-		fxsave(&PCPU_GET(curpcb)->pcb_save);
+		fxsave(PCPU_GET(curpcb)->pcb_save);
 		start_emulating();
 		PCPU_SET(fpcurthread, 0);
 	}
@@ -424,8 +424,10 @@ fpudna(void)
 		if (pcb->pcb_initial_fpucw != __INITIAL_FPUCW__)
 			fldcw(&pcb->pcb_initial_fpucw);
 		pcb->pcb_flags |= PCB_FPUINITDONE;
+		if (PCB_USER_FPU(pcb))
+			pcb->pcb_flags |= PCB_USERFPUINITDONE;
 	} else
-		fxrstor(&pcb->pcb_save);
+		fxrstor(pcb->pcb_save);
 	intr_restore(s);
 }
 
@@ -449,13 +451,39 @@ fpudrop()
  * It returns the FPU ownership status.
  */
 int
+fpugetuserregs(struct thread *td, struct savefpu *addr)
+{
+	struct pcb *pcb;
+	register_t s;
+
+	pcb = td->td_pcb;
+	if ((pcb->pcb_flags & PCB_USERFPUINITDONE) == 0) {
+		bcopy(&fpu_initialstate, addr, sizeof(fpu_initialstate));
+		addr->sv_env.en_cw = pcb->pcb_initial_fpucw;
+		return (_MC_FPOWNED_NONE);
+	}
+	s = intr_disable();
+	if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) {
+		fxsave(addr);
+		intr_restore(s);
+		return (_MC_FPOWNED_FPU);
+	} else {
+		intr_restore(s);
+		bcopy(&pcb->pcb_user_save, addr, sizeof(*addr));
+		return (_MC_FPOWNED_PCB);
+	}
+}
+
+int
 fpugetregs(struct thread *td, struct savefpu *addr)
 {
+	struct pcb *pcb;
 	register_t s;
 
-	if ((td->td_pcb->pcb_flags & PCB_FPUINITDONE) == 0) {
+	pcb = td->td_pcb;
+	if ((pcb->pcb_flags & PCB_FPUINITDONE) == 0) {
 		bcopy(&fpu_initialstate, addr, sizeof(fpu_initialstate));
-		addr->sv_env.en_cw = td->td_pcb->pcb_initial_fpucw;
+		addr->sv_env.en_cw = pcb->pcb_initial_fpucw;
 		return (_MC_FPOWNED_NONE);
 	}
 	s = intr_disable();
@@ -465,7 +493,7 @@ fpugetregs(struct thread *td, struct sav
 		return (_MC_FPOWNED_FPU);
 	} else {
 		intr_restore(s);
-		bcopy(&td->td_pcb->pcb_save, addr, sizeof(*addr));
+		bcopy(pcb->pcb_save, addr, sizeof(*addr));
 		return (_MC_FPOWNED_PCB);
 	}
 }
@@ -474,19 +502,44 @@ fpugetregs(struct thread *td, struct sav
  * Set the state of the FPU.
  */
 void
+fpusetuserregs(struct thread *td, struct savefpu *addr)
+{
+	struct pcb *pcb;
+	register_t s;
+
+	pcb = td->td_pcb;
+	s = intr_disable();
+	if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) {
+		fxrstor(addr);
+		intr_restore(s);
+		pcb->pcb_flags |= PCB_FPUINITDONE | PCB_USERFPUINITDONE;
+	} else {
+		intr_restore(s);
+		bcopy(addr, &td->td_pcb->pcb_user_save, sizeof(*addr));
+		if (PCB_USER_FPU(pcb))
+			pcb->pcb_flags |= PCB_FPUINITDONE;
+		pcb->pcb_flags |= PCB_USERFPUINITDONE;
+	}
+}
+
+void
 fpusetregs(struct thread *td, struct savefpu *addr)
 {
+	struct pcb *pcb;
 	register_t s;
 
+	pcb = td->td_pcb;
 	s = intr_disable();
 	if (td == PCPU_GET(fpcurthread)) {
 		fxrstor(addr);
 		intr_restore(s);
 	} else {
 		intr_restore(s);
-		bcopy(addr, &td->td_pcb->pcb_save, sizeof(*addr));
+		bcopy(addr, td->td_pcb->pcb_save, sizeof(*addr));
 	}
-	curthread->td_pcb->pcb_flags |= PCB_FPUINITDONE;
+	if (PCB_USER_FPU(pcb))
+		pcb->pcb_flags |= PCB_USERFPUINITDONE;
+	pcb->pcb_flags |= PCB_FPUINITDONE;
 }
 
 /*
@@ -575,3 +628,74 @@ static devclass_t fpupnp_devclass;
 
 DRIVER_MODULE(fpupnp, acpi, fpupnp_driver, fpupnp_devclass, 0, 0);
 #endif	/* DEV_ISA */
+
+int
+fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags)
+{
+	struct pcb *pcb;
+
+	pcb = td->td_pcb;
+	KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save == &pcb->pcb_user_save,
+	    ("mangled pcb_save"));
+	ctx->flags = 0;
+	if ((pcb->pcb_flags & PCB_FPUINITDONE) != 0)
+		ctx->flags |= FPU_KERN_CTX_FPUINITDONE;
+	fpuexit(td);
+	ctx->prev = pcb->pcb_save;
+	pcb->pcb_save = &ctx->hwstate;
+	pcb->pcb_flags |= PCB_KERNFPU;
+	pcb->pcb_flags &= ~PCB_FPUINITDONE;
+	return (0);
+}
+
+int
+fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx)
+{
+	struct pcb *pcb;
+	register_t savecrit;
+
+	pcb = td->td_pcb;
+	savecrit = intr_disable();
+	if (curthread == PCPU_GET(fpcurthread))
+		fpudrop();
+	intr_restore(savecrit);
+	pcb->pcb_save = ctx->prev;
+	if (pcb->pcb_save == &pcb->pcb_user_save) {
+		if ((pcb->pcb_flags & PCB_USERFPUINITDONE) != 0)
+			pcb->pcb_flags |= PCB_FPUINITDONE;
+		else
+			pcb->pcb_flags &= ~PCB_FPUINITDONE;
+		pcb->pcb_flags &= ~PCB_KERNFPU;
+	} else {
+		if ((ctx->flags & FPU_KERN_CTX_FPUINITDONE) != 0)
+			pcb->pcb_flags |= PCB_FPUINITDONE;
+		else
+			pcb->pcb_flags &= ~PCB_FPUINITDONE;
+		KASSERT(!PCB_USER_FPU(pcb), ("unpaired fpu_kern_leave"));
+	}
+	return (0);
+}
+
+int
+fpu_kern_thread(u_int flags)
+{
+	struct pcb *pcb;
+
+	pcb = PCPU_GET(curpcb);
+	KASSERT((curthread->td_pflags & TDP_KTHREAD) != 0,
+	    ("Only kthread may use fpu_kern_thread"));
+	KASSERT(pcb->pcb_save == &pcb->pcb_user_save, ("mangled pcb_save"));
+	KASSERT(PCB_USER_FPU(pcb), ("recursive call"));
+
+	pcb->pcb_flags |= PCB_KERNFPU;
+	return (0);
+}
+
+int
+is_fpu_kern_thread(u_int flags)
+{
+
+	if ((curthread->td_pflags & TDP_KTHREAD) == 0)
+		return (0);
+	return ((PCPU_GET(curpcb)->pcb_flags & PCB_KERNFPU) != 0);
+}

Modified: projects/altix/sys/amd64/amd64/machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/machdep.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/machdep.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -285,7 +285,6 @@ cpu_startup(dummy)
 	vm_pager_bufferinit();
 
 	cpu_setregs();
-	mca_init();
 }
 
 /*
@@ -1961,7 +1960,7 @@ int
 fill_fpregs(struct thread *td, struct fpreg *fpregs)
 {
 
-	fill_fpregs_xmm(&td->td_pcb->pcb_save, fpregs);
+	fill_fpregs_xmm(&td->td_pcb->pcb_user_save, fpregs);
 	return (0);
 }
 
@@ -1970,7 +1969,7 @@ int
 set_fpregs(struct thread *td, struct fpreg *fpregs)
 {
 
-	set_fpregs_xmm(fpregs, &td->td_pcb->pcb_save);
+	set_fpregs_xmm(fpregs, &td->td_pcb->pcb_user_save);
 	return (0);
 }
 
@@ -2085,7 +2084,8 @@ static void
 get_fpcontext(struct thread *td, mcontext_t *mcp)
 {
 
-	mcp->mc_ownedfp = fpugetregs(td, (struct savefpu *)&mcp->mc_fpstate);
+	mcp->mc_ownedfp = fpugetuserregs(td,
+	    (struct savefpu *)&mcp->mc_fpstate);
 	mcp->mc_fpformat = fpuformat();
 }
 
@@ -2110,7 +2110,7 @@ set_fpcontext(struct thread *td, const m
 		 */
 		fpstate = (struct savefpu *)&mcp->mc_fpstate;
 		fpstate->sv_env.en_mxcsr &= cpu_mxcsr_mask;
-		fpusetregs(td, fpstate);
+		fpusetuserregs(td, fpstate);
 	} else
 		return (EINVAL);
 	return (0);
@@ -2121,6 +2121,7 @@ fpstate_drop(struct thread *td)
 {
 	register_t s;
 
+	KASSERT(PCB_USER_FPU(td->td_pcb), ("fpstate_drop: kernel-owned fpu"));
 	s = intr_disable();
 	if (PCPU_GET(fpcurthread) == td)
 		fpudrop();
@@ -2134,7 +2135,8 @@ fpstate_drop(struct thread *td)
 	 * sendsig() is the only caller of fpugetregs()... perhaps we just
 	 * have too many layers.
 	 */
-	curthread->td_pcb->pcb_flags &= ~PCB_FPUINITDONE;
+	curthread->td_pcb->pcb_flags &= ~(PCB_FPUINITDONE |
+	    PCB_USERFPUINITDONE);
 	intr_restore(s);
 }
 

Modified: projects/altix/sys/amd64/amd64/mca.c
==============================================================================
--- projects/altix/sys/amd64/amd64/mca.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/mca.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -789,6 +789,19 @@ mca_init(void)
 	load_cr4(rcr4() | CR4_MCE);
 }
 
+/*
+ * The machine check registers for the BSP cannot be initialized until
+ * the local APIC is initialized.  This happens at SI_SUB_CPU,
+ * SI_ORDER_SECOND.
+ */
+static void
+mca_init_bsp(void *arg __unused)
+{
+
+	mca_init();
+}
+SYSINIT(mca_init_bsp, SI_SUB_CPU, SI_ORDER_ANY, mca_init_bsp, NULL);
+
 /* Called when a machine check exception fires. */
 int
 mca_intr(void)

Modified: projects/altix/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/mp_machdep.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/mp_machdep.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -1247,7 +1247,7 @@ cpususpend_handler(void)
 
 	rf = intr_disable();
 	cr3 = rcr3();
-	stopfpu = &stopxpcbs[cpu]->xpcb_pcb.pcb_save;
+	stopfpu = stopxpcbs[cpu]->xpcb_pcb.pcb_save;
 	if (savectx2(stopxpcbs[cpu])) {
 		fpugetregs(curthread, stopfpu);
 		wbinvd();

Modified: projects/altix/sys/amd64/amd64/pmap.c
==============================================================================
--- projects/altix/sys/amd64/amd64/pmap.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/pmap.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -2041,7 +2041,6 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_coll
 static void
 pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
 {
-	struct md_page *pvh;
 	pd_entry_t *pde;
 	pmap_t pmap;
 	pt_entry_t *pte, tpte;
@@ -2077,15 +2076,13 @@ pmap_collect(pmap_t locked_pmap, struct 
 			pmap_invalidate_page(pmap, va);
 			pmap_free_zero_pages(free);
 			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
-			if (TAILQ_EMPTY(&m->md.pv_list)) {
-				pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
-				if (TAILQ_EMPTY(&pvh->pv_list))
-					vm_page_flag_clear(m, PG_WRITEABLE);
-			}
 			free_pv_entry(pmap, pv);
 			if (pmap != locked_pmap)
 				PMAP_UNLOCK(pmap);
 		}
+		if (TAILQ_EMPTY(&m->md.pv_list) &&
+		    TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list))
+			vm_page_flag_clear(m, PG_WRITEABLE);
 	}
 }
 
@@ -2796,6 +2793,7 @@ pmap_remove_all(vm_page_t m)
 
 	KASSERT((m->flags & PG_FICTITIOUS) == 0,
 	    ("pmap_remove_all: page %p is fictitious", m));
+	free = NULL;
 	vm_page_lock_queues();
 	pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
 	while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
@@ -2825,16 +2823,15 @@ pmap_remove_all(vm_page_t m)
 		 */
 		if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
 			vm_page_dirty(m);
-		free = NULL;
 		pmap_unuse_pt(pmap, pv->pv_va, *pde, &free);
 		pmap_invalidate_page(pmap, pv->pv_va);
-		pmap_free_zero_pages(free);
 		TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
 		free_pv_entry(pmap, pv);
 		PMAP_UNLOCK(pmap);
 	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
 	vm_page_unlock_queues();
+	pmap_free_zero_pages(free);
 }
 
 /*
@@ -3128,11 +3125,11 @@ void
 pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m,
     vm_prot_t prot, boolean_t wired)
 {
-	vm_paddr_t pa;
 	pd_entry_t *pde;
 	pt_entry_t *pte;
-	vm_paddr_t opa;
-	pt_entry_t origpte, newpte;
+	pt_entry_t newpte, origpte;
+	pv_entry_t pv;
+	vm_paddr_t opa, pa;
 	vm_page_t mpte, om;
 	boolean_t invlva;
 
@@ -3190,16 +3187,15 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 		if (mpte)
 			mpte->wire_count--;
 
-		/*
-		 * We might be turning off write access to the page,
-		 * so we go ahead and sense modify status.
-		 */
 		if (origpte & PG_MANAGED) {
 			om = m;
 			pa |= PG_MANAGED;
 		}
 		goto validate;
 	} 
+
+	pv = NULL;
+
 	/*
 	 * Mapping has changed, invalidate old range and fall through to
 	 * handle validating new mapping.
@@ -3209,7 +3205,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 			pmap->pm_stats.wired_count--;
 		if (origpte & PG_MANAGED) {
 			om = PHYS_TO_VM_PAGE(opa);
-			pmap_remove_entry(pmap, om, va);
+			pv = pmap_pvh_remove(&om->md, pmap, va);
 		}
 		if (mpte != NULL) {
 			mpte->wire_count--;
@@ -3226,9 +3222,13 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
 		KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
 		    ("pmap_enter: managed mapping within the clean submap"));
-		pmap_insert_entry(pmap, va, m);
+		if (pv == NULL)
+			pv = get_pv_entry(pmap, FALSE);
+		pv->pv_va = va;
+		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 		pa |= PG_MANAGED;
-	}
+	} else if (pv != NULL)
+		free_pv_entry(pmap, pv);
 
 	/*
 	 * Increment counters
@@ -3243,7 +3243,8 @@ validate:
 	newpte = (pt_entry_t)(pa | pmap_cache_bits(m->md.pat_mode, 0) | PG_V);
 	if ((prot & VM_PROT_WRITE) != 0) {
 		newpte |= PG_RW;
-		vm_page_flag_set(m, PG_WRITEABLE);
+		if ((newpte & PG_MANAGED) != 0)
+			vm_page_flag_set(m, PG_WRITEABLE);
 	}
 	if ((prot & VM_PROT_EXECUTE) == 0)
 		newpte |= pg_nx;
@@ -3278,6 +3279,10 @@ validate:
 				if ((newpte & PG_RW) == 0)
 					invlva = TRUE;
 			}
+			if ((origpte & PG_MANAGED) != 0 &&
+			    TAILQ_EMPTY(&om->md.pv_list) &&
+			    TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list))
+				vm_page_flag_clear(om, PG_WRITEABLE);
 			if (invlva)
 				pmap_invalidate_page(pmap, va);
 		} else
@@ -3389,6 +3394,7 @@ pmap_enter_object(pmap_t pmap, vm_offset
 	psize = atop(end - start);
 	mpte = NULL;
 	m = m_start;
+	vm_page_lock_queues();
 	PMAP_LOCK(pmap);
 	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
 		va = start + ptoa(diff);
@@ -3402,6 +3408,7 @@ pmap_enter_object(pmap_t pmap, vm_offset
 			    mpte);
 		m = TAILQ_NEXT(m, listq);
 	}
+	vm_page_unlock_queues();
 	PMAP_UNLOCK(pmap);
 }
 
@@ -4209,12 +4216,15 @@ pmap_is_prefaultable(pmap_t pmap, vm_off
 boolean_t
 pmap_is_referenced(vm_page_t m)
 {
+	boolean_t rv;
 
-	if (m->flags & PG_FICTITIOUS)
-		return (FALSE);
-	if (pmap_is_referenced_pvh(&m->md))
-		return (TRUE);
-	return (pmap_is_referenced_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m))));
+	KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+	    ("pmap_is_referenced: page %p is not managed", m));
+	vm_page_lock_queues();
+	rv = pmap_is_referenced_pvh(&m->md) ||
+	    pmap_is_referenced_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m)));
+	vm_page_unlock_queues();
+	return (rv);
 }
 
 /*

Modified: projects/altix/sys/amd64/amd64/trap.c
==============================================================================
--- projects/altix/sys/amd64/amd64/trap.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/trap.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -425,6 +425,8 @@ trap(struct trapframe *frame)
 
 		case T_DNA:
 			/* transparent fault (due to context switch "late") */
+			KASSERT(PCB_USER_FPU(td->td_pcb),
+			    ("kernel FPU ctx has leaked"));
 			fpudna();
 			goto userout;
 
@@ -449,16 +451,19 @@ trap(struct trapframe *frame)
 			goto out;
 
 		case T_DNA:
+			KASSERT(!PCB_USER_FPU(td->td_pcb),
+			    ("Unregistered use of FPU in kernel"));
+			fpudna();
+			goto out;
+
+		case T_ARITHTRAP:	/* arithmetic trap */
+		case T_XMMFLT:		/* SIMD floating-point exception */
+		case T_FPOPFLT:		/* FPU operand fetch fault */
 			/*
-			 * The kernel is apparently using fpu for copying.
-			 * XXX this should be fatal unless the kernel has
-			 * registered such use.
+			 * XXXKIB for now disable any FPU traps in kernel
+			 * handler registration seems to be overkill
 			 */
-			printf("fpudna in kernel mode!\n");
-#ifdef KDB
-			kdb_backtrace();
-#endif
-			fpudna();
+			trap_fatal(frame, 0);
 			goto out;
 
 		case T_STKFLT:		/* stack fault */
@@ -603,6 +608,8 @@ trap(struct trapframe *frame)
 user:
 	userret(td, frame);
 	mtx_assert(&Giant, MA_NOTOWNED);
+	KASSERT(PCB_USER_FPU(td->td_pcb),
+	    ("Return from trap with kernel FPU ctx leaked"));
 userout:
 out:
 	return;
@@ -891,5 +898,12 @@ syscall(struct trapframe *frame)
 		trapsignal(td, &ksi);
 	}
 
+	KASSERT(PCB_USER_FPU(td->td_pcb),
+	    ("System call %s returing with kernel FPU ctx leaked",
+	     syscallname(td->td_proc, sa.code)));
+	KASSERT(td->td_pcb->pcb_save == &td->td_pcb->pcb_user_save,
+	    ("System call %s returning with mangled pcb_save",
+	     syscallname(td->td_proc, sa.code)));
+
 	syscallret(td, error, &sa);
 }

Modified: projects/altix/sys/amd64/amd64/vm_machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/vm_machdep.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/amd64/vm_machdep.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -122,7 +122,7 @@ cpu_fork(td1, p2, td2, flags)
 		return;
 	}
 
-	/* Ensure that p1's pcb is up to date. */
+	/* Ensure that td1's pcb is up to date. */
 	fpuexit(td1);
 
 	/* Point the pcb to the top of the stack */
@@ -130,9 +130,12 @@ cpu_fork(td1, p2, td2, flags)
 	    td2->td_kstack_pages * PAGE_SIZE) - 1;
 	td2->td_pcb = pcb2;
 
-	/* Copy p1's pcb */
+	/* Copy td1's pcb */
 	bcopy(td1->td_pcb, pcb2, sizeof(*pcb2));
 
+	/* Properly initialize pcb_save */
+	pcb2->pcb_save = &pcb2->pcb_user_save;
+
 	/* Point mdproc and then copy over td1's contents */
 	mdp2 = &p2->p_md;
 	bcopy(&p1->p_md, mdp2, sizeof(*mdp2));
@@ -308,6 +311,7 @@ cpu_thread_alloc(struct thread *td)
 	td->td_pcb = (struct pcb *)(td->td_kstack +
 	    td->td_kstack_pages * PAGE_SIZE) - 1;
 	td->td_frame = (struct trapframe *)td->td_pcb - 1;
+	td->td_pcb->pcb_save = &td->td_pcb->pcb_user_save;
 }
 
 void
@@ -381,7 +385,8 @@ cpu_set_upcall(struct thread *td, struct
 	 * values here.
 	 */
 	bcopy(td0->td_pcb, pcb2, sizeof(*pcb2));
-	pcb2->pcb_flags &= ~PCB_FPUINITDONE;
+	pcb2->pcb_flags &= ~(PCB_FPUINITDONE | PCB_USERFPUINITDONE);
+	pcb2->pcb_save = &pcb2->pcb_user_save;
 	pcb2->pcb_full_iret = 1;
 
 	/*

Modified: projects/altix/sys/amd64/ia32/ia32_reg.c
==============================================================================
--- projects/altix/sys/amd64/ia32/ia32_reg.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/ia32/ia32_reg.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -147,7 +147,7 @@ fill_fpregs32(struct thread *td, struct 
 {
 	struct save87 *sv_87 = (struct save87 *)regs;
 	struct env87 *penv_87 = &sv_87->sv_env;
-	struct savefpu *sv_fpu = &td->td_pcb->pcb_save;
+	struct savefpu *sv_fpu = &td->td_pcb->pcb_user_save;
 	struct envxmm *penv_xmm = &sv_fpu->sv_env;
 	int i;
 
@@ -182,7 +182,7 @@ set_fpregs32(struct thread *td, struct f
 {
 	struct save87 *sv_87 = (struct save87 *)regs;
 	struct env87 *penv_87 = &sv_87->sv_env;
-	struct savefpu *sv_fpu = &td->td_pcb->pcb_save;
+	struct savefpu *sv_fpu = &td->td_pcb->pcb_user_save;
 	struct envxmm *penv_xmm = &sv_fpu->sv_env;
 	int i;
 

Modified: projects/altix/sys/amd64/include/fpu.h
==============================================================================
--- projects/altix/sys/amd64/include/fpu.h	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/include/fpu.h	Sun Jun  6 21:19:04 2010	(r208880)
@@ -73,6 +73,17 @@ struct  savefpu {
 	u_char sv_pad[96];
 } __aligned(16);
 
+#ifdef _KERNEL
+struct fpu_kern_ctx {
+	struct savefpu hwstate;
+	struct savefpu *prev;
+	uint32_t flags;
+};
+#define	FPU_KERN_CTX_FPUINITDONE 0x01
+
+#define	PCB_USER_FPU(pcb) (((pcb)->pcb_flags & PCB_KERNFPU) == 0)
+#endif
+
 /*
  * The hardware default control word for i387's and later coprocessors is
  * 0x37F, giving:
@@ -102,9 +113,22 @@ void	fpudrop(void);
 void	fpuexit(struct thread *td);
 int	fpuformat(void);
 int	fpugetregs(struct thread *td, struct savefpu *addr);
+int	fpugetuserregs(struct thread *td, struct savefpu *addr);
 void	fpuinit(void);
 void	fpusetregs(struct thread *td, struct savefpu *addr);
+void	fpusetuserregs(struct thread *td, struct savefpu *addr);
 int	fputrap(void);
+int	fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx,
+	    u_int flags);
+int	fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx);
+int	fpu_kern_thread(u_int flags);
+int	is_fpu_kern_thread(u_int flags);
+
+/*
+ * Flags for fpu_kern_enter() and fpu_kern_thread().
+ */
+#define	FPU_KERN_NORMAL	0x0000
+
 #endif
 
 #endif /* !_MACHINE_FPU_H_ */

Modified: projects/altix/sys/amd64/include/pcb.h
==============================================================================
--- projects/altix/sys/amd64/include/pcb.h	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/amd64/include/pcb.h	Sun Jun  6 21:19:04 2010	(r208880)
@@ -57,7 +57,9 @@ struct pcb {
 	register_t	pcb_gsbase;
 	u_long		pcb_flags;
 #define	PCB_DBREGS	0x02	/* process using debug registers */
+#define	PCB_KERNFPU	0x04	/* kernel uses fpu */
 #define	PCB_FPUINITDONE	0x08	/* fpu state is initialized */
+#define	PCB_USERFPUINITDONE 0x10 /* fpu user state is initialized */
 #define	PCB_GS32BIT	0x20	/* linux gs switch */
 #define	PCB_32BIT	0x40	/* process has 32 bit context (segs etc) */
 #define	PCB_FULLCTX	0x80	/* full context restore on sysret */
@@ -69,7 +71,7 @@ struct pcb {
 	u_int64_t	pcb_dr6;
 	u_int64_t	pcb_dr7;
 
-	struct	savefpu	pcb_save;
+	struct	savefpu pcb_user_save;
 	uint16_t	pcb_initial_fpucw;
 
 	caddr_t		pcb_onfault; /* copyin/out fault recovery */
@@ -78,6 +80,7 @@ struct pcb {
 	struct user_segment_descriptor	pcb_gs32sd;
 	/* local tss, with i/o bitmap; NULL for common */
 	struct amd64tss *pcb_tssp;
+	struct	savefpu	*pcb_save;
 	char		pcb_full_iret;
 };
 

Modified: projects/altix/sys/arm/arm/pmap.c
==============================================================================
--- projects/altix/sys/arm/arm/pmap.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/arm/arm/pmap.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -3318,15 +3318,16 @@ pmap_enter_locked(pmap_t pmap, vm_offset
 	u_int oflags;
 	vm_paddr_t pa;
 
-	KASSERT((m->oflags & VPO_BUSY) != 0 || (flags & M_NOWAIT) != 0,
-	    ("pmap_enter_locked: page %p is not busy", m));
 	PMAP_ASSERT_LOCKED(pmap);
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	if (va == vector_page) {
 		pa = systempage.pv_pa;
 		m = NULL;
-	} else
+	} else {
+		KASSERT((m->oflags & VPO_BUSY) != 0 || (flags & M_NOWAIT) != 0,
+		    ("pmap_enter_locked: page %p is not busy", m));
 		pa = VM_PAGE_TO_PHYS(m);
+	}
 	nflags = 0;
 	if (prot & VM_PROT_WRITE)
 		nflags |= PVF_WRITE;
@@ -3411,7 +3412,8 @@ do_l2b_alloc:
 	
 	if (prot & VM_PROT_WRITE) {
 		npte |= L2_S_PROT_W;
-		if (m != NULL)
+		if (m != NULL &&
+		    (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0)
 			vm_page_flag_set(m, PG_WRITEABLE);
 	}
 	npte |= pte_l2_s_cache_mode;
@@ -3589,12 +3591,14 @@ pmap_enter_object(pmap_t pmap, vm_offset
 
 	psize = atop(end - start);
 	m = m_start;
+	vm_page_lock_queues();
 	PMAP_LOCK(pmap);
 	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
 		pmap_enter_locked(pmap, start + ptoa(diff), m, prot &
 		    (VM_PROT_READ | VM_PROT_EXECUTE), FALSE, M_NOWAIT);
 		m = TAILQ_NEXT(m, listq);
 	}
+	vm_page_unlock_queues();
  	PMAP_UNLOCK(pmap);
 }
 
@@ -4521,8 +4525,9 @@ boolean_t
 pmap_is_referenced(vm_page_t m)
 {
 
-	return ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 &&
-	    (m->md.pvh_attrs & PVF_REF) != 0);
+	KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+	    ("pmap_is_referenced: page %p is not managed", m));
+	return ((m->md.pvh_attrs & PVF_REF) != 0);
 }
 
 /*

Modified: projects/altix/sys/boot/i386/boot0/Makefile
==============================================================================
--- projects/altix/sys/boot/i386/boot0/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/i386/boot0/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -74,6 +74,6 @@ CFLAGS+=-DFLAGS=${BOOT_BOOT0_FLAGS} \
 	-DTICKS=${BOOT_BOOT0_TICKS} \
 	-DCOMSPEED=${BOOT_BOOT0_COMCONSOLE_SPEED}
 
-LDFLAGS=-N -e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/i386/btx/btx/Makefile
==============================================================================
--- projects/altix/sys/boot/i386/btx/btx/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/i386/btx/btx/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -24,6 +24,6 @@ CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COM
 
 ORG=	0x9000
 
-LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/i386/btx/btxldr/Makefile
==============================================================================
--- projects/altix/sys/boot/i386/btx/btxldr/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/i386/btx/btxldr/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -11,6 +11,6 @@ CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRES
 CFLAGS+=-DBTXLDR_VERBOSE
 .endif
 
-LDFLAGS=-N -e start -Ttext ${LOADER_ADDRESS} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${LOADER_ADDRESS} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/i386/cdboot/Makefile
==============================================================================
--- projects/altix/sys/boot/i386/cdboot/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/i386/cdboot/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -8,6 +8,6 @@ SRCS=	${PROG}.s
 
 ORG=	0x7c00
 
-LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/i386/mbr/Makefile
==============================================================================
--- projects/altix/sys/boot/i386/mbr/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/i386/mbr/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -12,6 +12,6 @@ BOOT_MBR_FLAGS?=	0x80
 ORG=	0x600
 
 AFLAGS+=--defsym FLAGS=${BOOT_MBR_FLAGS}
-LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/i386/pmbr/Makefile
==============================================================================
--- projects/altix/sys/boot/i386/pmbr/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/i386/pmbr/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -9,6 +9,6 @@ SRCS=	${PROG}.s
 ORG=	0x600
 
 AFLAGS+=--defsym FLAGS=${BOOT_MBR_FLAGS}
-LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/pc98/boot0.5/Makefile
==============================================================================
--- projects/altix/sys/boot/pc98/boot0.5/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/pc98/boot0.5/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -14,7 +14,7 @@ BOOT=	boot0.5
 # unless you are glutton for punishment.
 BOOT_BOOT0_ORG?=	0x0000
 
-LDFLAGS=-N -e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-T,${.CURDIR}/ldscript
+LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-T,${.CURDIR}/ldscript
 
 # The size of boot0.5 must be 7168 bytes
 ${BOOT}: ${BOOT}.bin

Modified: projects/altix/sys/boot/pc98/boot0/Makefile
==============================================================================
--- projects/altix/sys/boot/pc98/boot0/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/pc98/boot0/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -13,7 +13,7 @@ BOOT=	boot0
 # unless you are glutton for punishment.
 BOOT_BOOT0_ORG?=	0x0000
 
-LDFLAGS=-N -e start -Ttext ${BOOT_BOOT0_ORG}
+LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N
 
 ${BOOT}: ${BOOT}.out
 	objcopy -S -O binary ${BOOT}.out ${.TARGET}

Modified: projects/altix/sys/boot/pc98/btx/btx/Makefile
==============================================================================
--- projects/altix/sys/boot/pc98/btx/btx/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/pc98/btx/btx/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -24,6 +24,6 @@ CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COM
 
 ORG=	0x9000
 
-LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/pc98/btx/btxldr/Makefile
==============================================================================
--- projects/altix/sys/boot/pc98/btx/btxldr/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/pc98/btx/btxldr/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -11,6 +11,6 @@ CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRES
 CFLAGS+=-DBTXLDR_VERBOSE
 .endif
 
-LDFLAGS=-N -e start -Ttext ${LOADER_ADDRESS} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${LOADER_ADDRESS} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/pc98/cdboot/Makefile
==============================================================================
--- projects/altix/sys/boot/pc98/cdboot/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/pc98/cdboot/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -8,6 +8,6 @@ SRCS=	${PROG}.s
 
 ORG=	0x0000
 
-LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary
+LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
 
 .include <bsd.prog.mk>

Modified: projects/altix/sys/boot/sparc64/boot1/Makefile
==============================================================================
--- projects/altix/sys/boot/sparc64/boot1/Makefile	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/sparc64/boot1/Makefile	Sun Jun  6 21:19:04 2010	(r208880)
@@ -9,7 +9,7 @@ SRCS=	_start.s boot1.c
 BOOTBLOCKBASE= 0x4000
 
 CFLAGS=	-mcmodel=medlow -Os -I${.CURDIR}/../../common
-LDFLAGS=-N -Ttext ${BOOTBLOCKBASE}
+LDFLAGS=-Ttext ${BOOTBLOCKBASE} -Wl,-N
 
 # Construct boot1. sunlabel expects it to contain zeroed-out space for the
 # label, and to be of the correct size.

Modified: projects/altix/sys/boot/zfs/zfs.c
==============================================================================
--- projects/altix/sys/boot/zfs/zfs.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/zfs/zfs.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -265,6 +265,8 @@ zfs_readdir(struct open_file *f, struct 
 
 		rc = dnode_read(spa, &fp->f_dnode,
 				fp->f_seekp, &mze, sizeof(mze));
+		if (rc)
+			return (rc);
 		fp->f_seekp += sizeof(mze);
 
 		if (!mze.mze_name[0])

Modified: projects/altix/sys/boot/zfs/zfsimpl.c
==============================================================================
--- projects/altix/sys/boot/zfs/zfsimpl.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/boot/zfs/zfsimpl.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -958,12 +958,17 @@ zio_read_gang(spa_t *spa, const blkptr_t
 			break;
 	if (!vdev || !vdev->v_read)
 		return (EIO);
-	if (vdev->v_read(vdev, bp, &zio_gb, offset, SPA_GANGBLOCKSIZE))
+	if (vdev->v_read(vdev, NULL, &zio_gb, offset, SPA_GANGBLOCKSIZE))
 		return (EIO);
 
 	for (i = 0; i < SPA_GBH_NBLKPTRS; i++) {
-		if (zio_read(spa, &zio_gb.zg_blkptr[i], buf))
+		blkptr_t *gbp = &zio_gb.zg_blkptr[i];
+
+		if (BP_IS_HOLE(gbp))
+			continue;
+		if (zio_read(spa, gbp, buf))
 			return (EIO);
+		buf = (char*)buf + BP_GET_PSIZE(gbp);
 	}
  
 	return (0);
@@ -994,9 +999,8 @@ zio_read(spa_t *spa, const blkptr_t *bp,
 			continue;
 
 		if (DVA_GET_GANG(dva)) {
-			printf("ZFS: gang block detected!\n");
 			if (zio_read_gang(spa, bp, dva, buf))
-				return (EIO); 
+				continue;
 		} else {
 			vdevid = DVA_GET_VDEV(dva);
 			offset = DVA_GET_OFFSET(dva);

Modified: projects/altix/sys/cam/ata/ata_pmp.c
==============================================================================
--- projects/altix/sys/cam/ata/ata_pmp.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/cam/ata/ata_pmp.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -737,10 +737,8 @@ pmpdone(struct cam_periph *periph, union
 			if (xpt_create_path(&dpath, periph,
 			    xpt_path_path_id(periph->path),
 			    i, 0) != CAM_REQ_CMP) {
-				printf("pmpdone: xpt_create_path failed"
-				    ", bus scan halted\n");
-				xpt_free_ccb(done_ccb);
-				goto done;
+				printf("pmpdone: xpt_create_path failed\n");
+				continue;
 			}
 			/* If we did hard reset to this device, inform XPT. */
 			if ((softc->reset & softc->found & (1 << i)) != 0)

Modified: projects/altix/sys/cam/ata/ata_xpt.c
==============================================================================
--- projects/altix/sys/cam/ata/ata_xpt.c	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/cam/ata/ata_xpt.c	Sun Jun  6 21:19:04 2010	(r208880)
@@ -1185,6 +1185,7 @@ ata_scan_bus(struct cam_periph *periph, 
 		  ("xpt_scan_bus\n"));
 	switch (request_ccb->ccb_h.func_code) {
 	case XPT_SCAN_BUS:
+	case XPT_SCAN_TGT:
 		/* Find out the characteristics of the bus */
 		work_ccb = xpt_alloc_ccb_nowait();
 		if (work_ccb == NULL) {
@@ -1209,6 +1210,12 @@ ata_scan_bus(struct cam_periph *periph, 
 		    !(work_ccb->cpi.hba_misc & PIM_NOBUSRESET) &&
 		    !timevalisset(&request_ccb->ccb_h.path->bus->last_reset)) {
 			reset_ccb = xpt_alloc_ccb_nowait();
+			if (reset_ccb == NULL) {
+				request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
+				xpt_free_ccb(work_ccb);
+				xpt_done(request_ccb);
+				return;
+			}
 			xpt_setup_ccb(&reset_ccb->ccb_h, request_ccb->ccb_h.path,
 			      CAM_PRIORITY_NONE);
 			reset_ccb->ccb_h.func_code = XPT_RESET_BUS;
@@ -1228,6 +1235,7 @@ ata_scan_bus(struct cam_periph *periph, 
 		    malloc(sizeof(ata_scan_bus_info), M_CAMXPT, M_NOWAIT);
 		if (scan_info == NULL) {
 			request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
+			xpt_free_ccb(work_ccb);
 			xpt_done(request_ccb);
 			return;
 		}
@@ -1526,6 +1534,7 @@ ata_action(union ccb *start_ccb)
 		break;
 	}
 	case XPT_SCAN_BUS:
+	case XPT_SCAN_TGT:
 		ata_scan_bus(start_ccb->ccb_h.path->periph, start_ccb);
 		break;
 	case XPT_SCAN_LUN:

Modified: projects/altix/sys/cam/cam_ccb.h
==============================================================================
--- projects/altix/sys/cam/cam_ccb.h	Sun Jun  6 20:34:17 2010	(r208879)
+++ projects/altix/sys/cam/cam_ccb.h	Sun Jun  6 21:19:04 2010	(r208880)
@@ -184,6 +184,11 @@ typedef enum {
 				/*
 				 * Set SIM specific knob values.
 				 */

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-projects mailing list