svn commit: r220557 - in projects/altix/sys: amd64/amd64 amd64/ia32 boot/common boot/i386/boot2 boot/pc98/boot2 cam/ata cddl/compat/opensolaris/sys cddl/contrib/opensolaris/common/zfs cddl/dev/dtra...

Marcel Moolenaar marcel at FreeBSD.org
Tue Apr 12 04:48:38 UTC 2011


Author: marcel
Date: Tue Apr 12 04:48:37 2011
New Revision: 220557
URL: http://svn.freebsd.org/changeset/base/220557

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

Modified:
  projects/altix/sys/amd64/amd64/exception.S
  projects/altix/sys/amd64/amd64/legacy.c
  projects/altix/sys/amd64/amd64/machdep.c
  projects/altix/sys/amd64/amd64/prof_machdep.c
  projects/altix/sys/amd64/amd64/sys_machdep.c
  projects/altix/sys/amd64/amd64/trap.c
  projects/altix/sys/amd64/ia32/ia32_exception.S
  projects/altix/sys/boot/common/module.c
  projects/altix/sys/boot/i386/boot2/Makefile
  projects/altix/sys/boot/i386/boot2/boot2.c
  projects/altix/sys/boot/i386/boot2/lib.h
  projects/altix/sys/boot/i386/boot2/sio.S
  projects/altix/sys/boot/pc98/boot2/Makefile
  projects/altix/sys/cam/ata/ata_da.c
  projects/altix/sys/cddl/compat/opensolaris/sys/sunddi.h
  projects/altix/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c
  projects/altix/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
  projects/altix/sys/cddl/dev/dtrace/i386/dtrace_subr.c
  projects/altix/sys/cddl/dev/systrace/systrace.c
  projects/altix/sys/compat/linprocfs/linprocfs.c
  projects/altix/sys/compat/linux/linux_misc.c
  projects/altix/sys/compat/svr4/imgact_svr4.c
  projects/altix/sys/conf/options
  projects/altix/sys/conf/options.mips
  projects/altix/sys/contrib/altq/altq/altq_subr.c
  projects/altix/sys/ddb/db_command.c
  projects/altix/sys/dev/acpica/acpi.c
  projects/altix/sys/dev/acpica/acpi_cpu.c
  projects/altix/sys/dev/acpica/acpi_timer.c
  projects/altix/sys/dev/acpica/acpivar.h
  projects/altix/sys/dev/ahci/ahci.c
  projects/altix/sys/dev/arcmsr/arcmsr.c
  projects/altix/sys/dev/arcmsr/arcmsr.h
  projects/altix/sys/dev/ath/ah_osdep.c
  projects/altix/sys/dev/ath/ath_hal/ah.c
  projects/altix/sys/dev/ath/ath_hal/ah.h
  projects/altix/sys/dev/ath/ath_hal/ah_decode.h
  projects/altix/sys/dev/ath/ath_hal/ah_desc.h
  projects/altix/sys/dev/ath/ath_hal/ah_eeprom_v14.c
  projects/altix/sys/dev/ath/ath_hal/ah_internal.h
  projects/altix/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c
  projects/altix/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c
  projects/altix/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c
  projects/altix/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416.h
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
  projects/altix/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c
  projects/altix/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c
  projects/altix/sys/dev/ath/ath_hal/ar9002/ar9285_reset.c
  projects/altix/sys/dev/ath/if_ath.c
  projects/altix/sys/dev/ath/if_athvar.h
  projects/altix/sys/dev/bge/if_bge.c
  projects/altix/sys/dev/bge/if_bgereg.h
  projects/altix/sys/dev/bxe/if_bxe.c
  projects/altix/sys/dev/bxe/if_bxe.h
  projects/altix/sys/dev/cxgbe/t4_ioctl.h
  projects/altix/sys/dev/cxgbe/t4_main.c
  projects/altix/sys/dev/e1000/if_igb.c
  projects/altix/sys/dev/e1000/if_igb.h
  projects/altix/sys/dev/mxge/if_mxge.c
  projects/altix/sys/dev/mxge/mxge_lro.c
  projects/altix/sys/dev/ral/rt2560.c
  projects/altix/sys/dev/ral/rt2661.c
  projects/altix/sys/dev/usb/storage/umass.c
  projects/altix/sys/fs/fdescfs/fdesc_vfsops.c
  projects/altix/sys/fs/fdescfs/fdesc_vnops.c
  projects/altix/sys/fs/nfs/nfs_var.h
  projects/altix/sys/fs/nfsserver/nfs_nfsdport.c
  projects/altix/sys/fs/nfsserver/nfs_nfsdstate.c
  projects/altix/sys/i386/i386/legacy.c
  projects/altix/sys/i386/i386/machdep.c
  projects/altix/sys/i386/i386/perfmon.c
  projects/altix/sys/i386/i386/trap.c
  projects/altix/sys/i386/include/atomic.h
  projects/altix/sys/i386/include/cpu.h
  projects/altix/sys/i386/isa/prof_machdep.c
  projects/altix/sys/i386/linux/imgact_linux.c
  projects/altix/sys/kern/imgact_aout.c
  projects/altix/sys/kern/imgact_elf.c
  projects/altix/sys/kern/imgact_gzip.c
  projects/altix/sys/kern/kern_clock.c
  projects/altix/sys/kern/kern_descrip.c
  projects/altix/sys/kern/kern_exit.c
  projects/altix/sys/kern/kern_ktrace.c
  projects/altix/sys/kern/kern_racct.c
  projects/altix/sys/kern/kern_rctl.c
  projects/altix/sys/kern/kern_resource.c
  projects/altix/sys/kern/kern_sig.c
  projects/altix/sys/kern/kern_timeout.c
  projects/altix/sys/kern/sched_4bsd.c
  projects/altix/sys/kern/sysv_msg.c
  projects/altix/sys/kern/sysv_sem.c
  projects/altix/sys/kern/sysv_shm.c
  projects/altix/sys/kern/vfs_subr.c
  projects/altix/sys/mips/atheros/if_arge.c
  projects/altix/sys/mips/atheros/if_argevar.h
  projects/altix/sys/modules/arcnet/Makefile
  projects/altix/sys/modules/dtrace/dtraceall/Makefile
  projects/altix/sys/modules/dtrace/systrace_linux32/Makefile
  projects/altix/sys/modules/firewire/fwip/Makefile
  projects/altix/sys/net/if.c
  projects/altix/sys/net80211/_ieee80211.h
  projects/altix/sys/net80211/ieee80211_input.c
  projects/altix/sys/net80211/ieee80211_node.c
  projects/altix/sys/net80211/ieee80211_node.h
  projects/altix/sys/net80211/ieee80211_proto.h
  projects/altix/sys/netgraph/ng_hub.c
  projects/altix/sys/netinet/tcp_lro.c
  projects/altix/sys/netinet6/udp6_usrreq.c
  projects/altix/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
  projects/altix/sys/pc98/pc98/machdep.c
  projects/altix/sys/sys/acl.h
  projects/altix/sys/sys/errno.h
  projects/altix/sys/sys/msg.h
  projects/altix/sys/sys/priv.h
  projects/altix/sys/sys/rctl.h
  projects/altix/sys/sys/sem.h
  projects/altix/sys/sys/shm.h
  projects/altix/sys/ufs/ffs/ffs_alloc.c
  projects/altix/sys/ufs/ffs/ffs_extern.h
  projects/altix/sys/ufs/ffs/ffs_softdep.c
  projects/altix/sys/ufs/ffs/softdep.h
  projects/altix/sys/vm/swap_pager.c
  projects/altix/sys/vm/vm_glue.c
  projects/altix/sys/vm/vm_map.c
  projects/altix/sys/vm/vm_mmap.c
  projects/altix/sys/vm/vm_pageout.c
  projects/altix/sys/vm/vm_unix.c
  projects/altix/sys/x86/cpufreq/est.c
  projects/altix/sys/x86/isa/clock.c
  projects/altix/sys/x86/x86/tsc.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/boot/i386/efi/   (props changed)
  projects/altix/sys/boot/ia64/efi/   (props changed)
  projects/altix/sys/boot/ia64/ski/   (props changed)
  projects/altix/sys/boot/powerpc/boot1.chrp/   (props changed)
  projects/altix/sys/boot/powerpc/ofw/   (props changed)
  projects/altix/sys/cddl/contrib/opensolaris/   (props changed)
  projects/altix/sys/conf/   (props changed)
  projects/altix/sys/contrib/dev/acpica/   (props changed)
  projects/altix/sys/contrib/octeon-sdk/   (props changed)
  projects/altix/sys/contrib/pf/   (props changed)
  projects/altix/sys/contrib/x86emu/   (props changed)
  projects/altix/sys/kern/subr_busdma.c   (props changed)

Modified: projects/altix/sys/amd64/amd64/exception.S
==============================================================================
--- projects/altix/sys/amd64/amd64/exception.S	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/amd64/amd64/exception.S	Tue Apr 12 04:48:37 2011	(r220557)
@@ -339,6 +339,9 @@ IDTVEC(prot)
  * and the new privilige level.  We are still running on the old user stack
  * pointer.  We have to juggle a few things around to find our stack etc.
  * swapgs gives us access to our PCPU space only.
+ *
+ * We do not support invoking this from a custom %cs or %ss (e.g. using
+ * entries from an LDT).
  */
 IDTVEC(fast_syscall)
 	swapgs
@@ -379,7 +382,38 @@ IDTVEC(fast_syscall)
 	FAKE_MCOUNT(TF_RIP(%rsp))
 	movq	%rsp,%rdi
 	call	syscall
-	movq	PCPU(CURPCB),%rax
+1:	movq	PCPU(CURPCB),%rax
+	/* Disable interrupts before testing PCB_FULL_IRET. */
+	cli
+	testl	$PCB_FULL_IRET,PCB_FLAGS(%rax)
+	jnz	3f
+	/* Check for and handle AST's on return to userland. */
+	movq	PCPU(CURTHREAD),%rax
+	testl	$TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%rax)
+	je	2f
+	sti
+	movq	%rsp, %rdi
+	call	ast
+	jmp	1b
+2:	/* Restore preserved registers. */
+	MEXITCOUNT
+	movq	TF_RDI(%rsp),%rdi	/* bonus; preserve arg 1 */
+	movq	TF_RSI(%rsp),%rsi	/* bonus: preserve arg 2 */
+	movq	TF_RDX(%rsp),%rdx	/* return value 2 */
+	movq	TF_RAX(%rsp),%rax	/* return value 1 */
+	movq	TF_RBX(%rsp),%rbx	/* C preserved */
+	movq	TF_RBP(%rsp),%rbp	/* C preserved */
+	movq	TF_R12(%rsp),%r12	/* C preserved */
+	movq	TF_R13(%rsp),%r13	/* C preserved */
+	movq	TF_R14(%rsp),%r14	/* C preserved */
+	movq	TF_R15(%rsp),%r15	/* C preserved */
+	movq	TF_RFLAGS(%rsp),%r11	/* original %rflags */
+	movq	TF_RIP(%rsp),%rcx	/* original %rip */
+	movq	TF_RSP(%rsp),%r9	/* user stack pointer */
+	movq	%r9,%rsp		/* original %rsp */
+	swapgs
+	sysretq
+3:	/* Requested full context restore, use doreti for that. */
 	MEXITCOUNT
 	jmp	doreti
 
@@ -628,7 +662,7 @@ doreti:
 doreti_ast:
 	/*
 	 * Check for ASTs atomically with returning.  Disabling CPU
-	 * interrupts provides sufficient locking eve in the SMP case,
+	 * interrupts provides sufficient locking even in the SMP case,
 	 * since we will be informed of any new ASTs by an IPI.
 	 */
 	cli
@@ -649,8 +683,7 @@ doreti_ast:
 	 */
 doreti_exit:
 	MEXITCOUNT
-	movq	PCPU(CURTHREAD),%r8
-	movq	TD_PCB(%r8),%r8
+	movq	PCPU(CURPCB),%r8
 
 	/*
 	 * Do not reload segment registers for kernel.

Modified: projects/altix/sys/amd64/amd64/legacy.c
==============================================================================
--- projects/altix/sys/amd64/amd64/legacy.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/amd64/amd64/legacy.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -321,7 +321,8 @@ cpu_read_ivar(device_t dev, device_t chi
 		break;
 	case CPU_IVAR_NOMINAL_MHZ:
 		if (tsc_is_invariant) {
-			*result = (uintptr_t)(tsc_freq / 1000000);
+			*result = (uintptr_t)(atomic_load_acq_64(&tsc_freq) /
+			    1000000);
 			break;
 		}
 		/* FALLTHROUGH */

Modified: projects/altix/sys/amd64/amd64/machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/machdep.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/amd64/amd64/machdep.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -546,18 +546,19 @@ int
 cpu_est_clockrate(int cpu_id, uint64_t *rate)
 {
 	register_t reg;
-	uint64_t tsc1, tsc2;
+	uint64_t freq, tsc1, tsc2;
 
 	if (pcpu_find(cpu_id) == NULL || rate == NULL)
 		return (EINVAL);
+	freq = atomic_load_acq_64(&tsc_freq);
 
 	/* If TSC is P-state invariant, DELAY(9) based logic fails. */
-	if (tsc_is_invariant && tsc_freq != 0)
+	if (tsc_is_invariant && freq != 0)
 		return (EOPNOTSUPP);
 
 	/* If we're booting, trust the rate calibrated moments ago. */
-	if (cold && tsc_freq != 0) {
-		*rate = tsc_freq;
+	if (cold && freq != 0) {
+		*rate = freq;
 		return (0);
 	}
 
@@ -586,7 +587,7 @@ cpu_est_clockrate(int cpu_id, uint64_t *
 #endif
 
 	tsc2 -= tsc1;
-	if (tsc_freq != 0) {
+	if (freq != 0) {
 		*rate = tsc2 * 1000;
 		return (0);
 	}

Modified: projects/altix/sys/amd64/amd64/prof_machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/prof_machdep.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/amd64/amd64/prof_machdep.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -63,9 +63,7 @@ static u_int	cputime_clock_pmc_conf = I5
 static int	cputime_clock_pmc_init;
 static struct gmonparam saved_gmp;
 #endif
-#if defined(I586_CPU) || defined(I686_CPU)
 static int	cputime_prof_active;
-#endif
 #endif /* GUPROF */
 
 #ifdef __GNUCLIKE_ASM
@@ -200,14 +198,12 @@ cputime()
 {
 	u_int count;
 	int delta;
-#if (defined(I586_CPU) || defined(I686_CPU)) && !defined(SMP) && \
-    defined(PERFMON) && defined(I586_PMC_GUPROF)
+#if defined(PERFMON) && defined(I586_PMC_GUPROF) && !defined(SMP)
 	u_quad_t event_count;
 #endif
 	u_char high, low;
 	static u_int prev_count;
 
-#if defined(I586_CPU) || defined(I686_CPU)
 	if (cputime_clock == CPUTIME_CLOCK_TSC) {
 		/*
 		 * Scale the TSC a little to make cputime()'s frequency
@@ -236,7 +232,6 @@ cputime()
 		return (delta);
 	}
 #endif /* PERFMON && I586_PMC_GUPROF && !SMP */
-#endif /* I586_CPU || I686_CPU */
 
 	/*
 	 * Read the current value of the 8254 timer counter 0.
@@ -316,21 +311,22 @@ void
 startguprof(gp)
 	struct gmonparam *gp;
 {
+	uint64_t freq;
+
+	freq = atomic_load_acq_64(&tsc_freq);
 	if (cputime_clock == CPUTIME_CLOCK_UNINITIALIZED) {
-		cputime_clock = CPUTIME_CLOCK_I8254;
-#if defined(I586_CPU) || defined(I686_CPU)
-		if (tsc_freq != 0 && mp_ncpus == 1)
+		if (freq != 0 && mp_ncpus == 1)
 			cputime_clock = CPUTIME_CLOCK_TSC;
-#endif
+		else
+			cputime_clock = CPUTIME_CLOCK_I8254;
 	}
-	gp->profrate = i8254_freq << CPUTIME_CLOCK_I8254_SHIFT;
-#if defined(I586_CPU) || defined(I686_CPU)
 	if (cputime_clock == CPUTIME_CLOCK_TSC) {
-		gp->profrate = tsc_freq >> 1;
+		gp->profrate = freq >> 1;
 		cputime_prof_active = 1;
-	}
+	} else
+		gp->profrate = i8254_freq << CPUTIME_CLOCK_I8254_SHIFT;
 #if defined(PERFMON) && defined(I586_PMC_GUPROF)
-	else if (cputime_clock == CPUTIME_CLOCK_I586_PMC) {
+	if (cputime_clock == CPUTIME_CLOCK_I586_PMC) {
 		if (perfmon_avail() &&
 		    perfmon_setup(0, cputime_clock_pmc_conf) == 0) {
 			if (perfmon_start(0) != 0)
@@ -355,7 +351,6 @@ startguprof(gp)
 		}
 	}
 #endif /* PERFMON && I586_PMC_GUPROF */
-#endif /* I586_CPU || I686_CPU */
 	cputime_bias = 0;
 	cputime();
 }
@@ -371,13 +366,10 @@ stopguprof(gp)
 		cputime_clock_pmc_init = FALSE;
 	}
 #endif
-#if defined(I586_CPU) || defined(I686_CPU)
 	if (cputime_clock == CPUTIME_CLOCK_TSC)
 		cputime_prof_active = 0;
-#endif
 }
 
-#if defined(I586_CPU) || defined(I686_CPU)
 /* If the cpu frequency changed while profiling, report a warning. */
 static void
 tsc_freq_changed(void *arg, const struct cf_level *level, int status)
@@ -395,6 +387,5 @@ tsc_freq_changed(void *arg, const struct
 
 EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL,
     EVENTHANDLER_PRI_ANY);
-#endif /* I586_CPU || I686_CPU */
 
 #endif /* GUPROF */

Modified: projects/altix/sys/amd64/amd64/sys_machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/sys_machdep.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/amd64/amd64/sys_machdep.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -243,7 +243,6 @@ sysarch(td, uap)
 		if (!error) {
 			pcb->pcb_fsbase = i386base;
 			td->td_frame->tf_fs = _ufssel;
-			set_pcb_flags(pcb, PCB_FULL_IRET);
 			update_gdt_fsbase(td, i386base);
 		}
 		break;
@@ -255,7 +254,6 @@ sysarch(td, uap)
 		error = copyin(uap->parms, &i386base, sizeof(i386base));
 		if (!error) {
 			pcb->pcb_gsbase = i386base;
-			set_pcb_flags(pcb, PCB_FULL_IRET);
 			td->td_frame->tf_gs = _ugssel;
 			update_gdt_gsbase(td, i386base);
 		}

Modified: projects/altix/sys/amd64/amd64/trap.c
==============================================================================
--- projects/altix/sys/amd64/amd64/trap.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/amd64/amd64/trap.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -164,10 +164,12 @@ static char *trap_msg[] = {
 static int kdb_on_nmi = 1;
 SYSCTL_INT(_machdep, OID_AUTO, kdb_on_nmi, CTLFLAG_RW,
 	&kdb_on_nmi, 0, "Go to KDB on NMI");
+TUNABLE_INT("machdep.kdb_on_nmi", &kdb_on_nmi);
 #endif
 static int panic_on_nmi = 1;
 SYSCTL_INT(_machdep, OID_AUTO, panic_on_nmi, CTLFLAG_RW,
 	&panic_on_nmi, 0, "Panic on NMI");
+TUNABLE_INT("machdep.panic_on_nmi", &panic_on_nmi);
 static int prot_fault_translation = 0;
 SYSCTL_INT(_machdep, OID_AUTO, prot_fault_translation, CTLFLAG_RW,
 	&prot_fault_translation, 0, "Select signal to deliver on protection fault");

Modified: projects/altix/sys/amd64/ia32/ia32_exception.S
==============================================================================
--- projects/altix/sys/amd64/ia32/ia32_exception.S	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/amd64/ia32/ia32_exception.S	Tue Apr 12 04:48:37 2011	(r220557)
@@ -46,7 +46,7 @@ IDTVEC(int0x80_syscall)
 	subq	$TF_ERR,%rsp		/* skip over tf_trapno */
 	movq	%rdi,TF_RDI(%rsp)
 	movq	PCPU(CURPCB),%rdi
-	movb	$0,PCB_FULL_IRET(%rdi)
+	andl	$~PCB_FULL_IRET,PCB_FLAGS(%rdi)
 	movw	%fs,TF_FS(%rsp)
 	movw	%gs,TF_GS(%rsp)
 	movw	%es,TF_ES(%rsp)

Modified: projects/altix/sys/boot/common/module.c
==============================================================================
--- projects/altix/sys/boot/common/module.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/boot/common/module.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -280,7 +280,7 @@ file_load(char *filename, vm_offset_t de
 
     error = EFTYPE;
     for (i = 0, fp = NULL; file_formats[i] && fp == NULL; i++) {
-	error = (file_formats[i]->l_load)(filename, loadaddr, &fp);
+	error = (file_formats[i]->l_load)(filename, dest, &fp);
 	if (error == 0) {
 	    fp->f_loader = i;		/* remember the loader */
 	    *result = fp;

Modified: projects/altix/sys/boot/i386/boot2/Makefile
==============================================================================
--- projects/altix/sys/boot/i386/boot2/Makefile	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/boot/i386/boot2/Makefile	Tue Apr 12 04:48:37 2011	(r220557)
@@ -31,6 +31,7 @@ CFLAGS=	-Os \
 	-fno-unit-at-a-time \
 	-mno-align-long-strings \
 	-mrtd \
+	-mregparm=3 \
 	-D${BOOT2_UFS} \
 	-DFLAGS=${BOOT_BOOT1_FLAGS} \
 	-DSIOPRT=${BOOT_COMCONSOLE_PORT} \

Modified: projects/altix/sys/boot/i386/boot2/boot2.c
==============================================================================
--- projects/altix/sys/boot/i386/boot2/boot2.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/boot/i386/boot2/boot2.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -148,7 +148,7 @@ static int drvread(void *, unsigned, uns
 static int keyhit(unsigned);
 static int xputc(int);
 static int xgetc(int);
-static int getc(int);
+static inline int getc(int);
 
 static void memcpy(void *, const void *, int);
 static void
@@ -627,6 +627,15 @@ xputc(int c)
 }
 
 static int
+getc(int fn)
+{
+    v86.addr = 0x16;
+    v86.eax = fn << 8;
+    v86int();
+    return fn == 0 ? v86.eax & 0xff : !V86_ZR(v86.efl);
+}
+
+static int
 xgetc(int fn)
 {
     if (OPT_CHECK(RBX_NOINTR))
@@ -640,12 +649,3 @@ xgetc(int fn)
 	    return 0;
     }
 }
-
-static int
-getc(int fn)
-{
-    v86.addr = 0x16;
-    v86.eax = fn << 8;
-    v86int();
-    return fn == 0 ? v86.eax & 0xff : !V86_ZR(v86.efl);
-}

Modified: projects/altix/sys/boot/i386/boot2/lib.h
==============================================================================
--- projects/altix/sys/boot/i386/boot2/lib.h	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/boot/i386/boot2/lib.h	Tue Apr 12 04:48:37 2011	(r220557)
@@ -17,8 +17,8 @@
  * $FreeBSD$
  */
 
-void sio_init(int);
+void sio_init(int) __attribute__((regparm (3)));
 void sio_flush(void);
-void sio_putc(int);
+void sio_putc(int) __attribute__((regparm (3)));
 int sio_getc(void);
 int sio_ischar(void);

Modified: projects/altix/sys/boot/i386/boot2/sio.S
==============================================================================
--- projects/altix/sys/boot/i386/boot2/sio.S	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/boot/i386/boot2/sio.S	Tue Apr 12 04:48:37 2011	(r220557)
@@ -26,14 +26,14 @@
 
 /* void sio_init(int div) */
 
-sio_init:	movw $SIO_PRT+0x3,%dx		# Data format reg
+sio_init:	pushl %eax
+		movw $SIO_PRT+0x3,%dx		# Data format reg
 		movb $SIO_FMT|0x80,%al		# Set format
 		outb %al,(%dx)			#  and DLAB
-		pushl %edx			# Save
 		subb $0x3,%dl			# Divisor latch reg
-		movl 0x8(%esp),%eax		# Set
+		popl %eax
 		outw %ax,(%dx)			#  BPS
-		popl %edx			# Restore
+		movw $SIO_PRT+0x3,%dx		# Data format reg
 		movb $SIO_FMT,%al		# Clear
 		outb %al,(%dx)			#  DLAB
 		incl %edx			# Modem control reg
@@ -41,7 +41,7 @@ sio_init:	movw $SIO_PRT+0x3,%dx		# Data 
 		outb %al,(%dx)			#  DTR
 		incl %edx			# Line status reg
 		call sio_flush
-		ret $0x4
+		ret
 
 /* void sio_flush(void) */
 
@@ -52,17 +52,18 @@ sio_flush:	call sio_ischar 		# Check for
 
 /* void sio_putc(int c) */
 
-sio_putc:	movw $SIO_PRT+0x5,%dx		# Line status reg
+sio_putc:	pushl %eax
+		movw $SIO_PRT+0x5,%dx		# Line status reg
 		xor %ecx,%ecx			# Timeout
 		movb $0x40,%ch			#  counter
 sio_putc.1:	inb (%dx),%al			# Transmitter
 		testb $0x20,%al 		#  buffer empty?
 		loopz sio_putc.1		# No
 		jz sio_putc.2			# If timeout
-		movb 0x4(%esp,1),%al		# Get character
+		popl %eax                       # Get the character
 		subb $0x5,%dl			# Transmitter hold reg
 		outb %al,(%dx)			# Write character
-sio_putc.2:	ret $0x4			# To caller
+sio_putc.2:	ret				# To caller
 
 /* int sio_getc(void) */
 

Modified: projects/altix/sys/boot/pc98/boot2/Makefile
==============================================================================
--- projects/altix/sys/boot/pc98/boot2/Makefile	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/boot/pc98/boot2/Makefile	Tue Apr 12 04:48:37 2011	(r220557)
@@ -28,6 +28,7 @@ CFLAGS=	-Os \
 	-fno-unit-at-a-time \
 	-mno-align-long-strings \
 	-mrtd \
+	-mregparm=3 \
 	-D${BOOT2_UFS} \
 	-DFLAGS=${BOOT_BOOT1_FLAGS} \
 	-DSIOPRT=${BOOT_COMCONSOLE_PORT} \

Modified: projects/altix/sys/cam/ata/ata_da.c
==============================================================================
--- projects/altix/sys/cam/ata/ata_da.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/cam/ata/ata_da.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -27,6 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_ada.h"
+
 #include <sys/param.h>
 
 #ifdef _KERNEL
@@ -66,6 +68,7 @@ __FBSDID("$FreeBSD$");
 #define ATA_MAX_28BIT_LBA               268435455UL
 
 typedef enum {
+	ADA_STATE_WCACHE,
 	ADA_STATE_NORMAL
 } ada_state;
 
@@ -89,6 +92,7 @@ typedef enum {
 } ada_quirks;
 
 typedef enum {
+	ADA_CCB_WCACHE		= 0x01,
 	ADA_CCB_BUFFER_IO	= 0x03,
 	ADA_CCB_WAITING		= 0x04,
 	ADA_CCB_DUMP		= 0x05,
@@ -125,6 +129,13 @@ struct ada_softc {
 	int	 outstanding_cmds;
 	int	 trim_max_ranges;
 	int	 trim_running;
+	int	 write_cache;
+#ifdef ADA_TEST_FAILURE
+	int      force_read_error;
+	int      force_write_error;
+	int      periodic_read_error;
+	int      periodic_read_count;
+#endif
 	struct	 disk_params params;
 	struct	 disk *disk;
 	struct task		sysctl_task;
@@ -186,6 +197,10 @@ static void		adashutdown(void *arg, int 
 #define	ADA_DEFAULT_SPINDOWN_SHUTDOWN	1
 #endif
 
+#ifndef	ADA_DEFAULT_WRITE_CACHE
+#define	ADA_DEFAULT_WRITE_CACHE	1
+#endif
+
 /*
  * Most platforms map firmware geometry to actual, but some don't.  If
  * not overridden, default to nothing.
@@ -198,6 +213,7 @@ static int ada_retry_count = ADA_DEFAULT
 static int ada_default_timeout = ADA_DEFAULT_TIMEOUT;
 static int ada_send_ordered = ADA_DEFAULT_SEND_ORDERED;
 static int ada_spindown_shutdown = ADA_DEFAULT_SPINDOWN_SHUTDOWN;
+static int ada_write_cache = ADA_DEFAULT_WRITE_CACHE;
 
 SYSCTL_NODE(_kern_cam, OID_AUTO, ada, CTLFLAG_RD, 0,
             "CAM Direct Access Disk driver");
@@ -213,6 +229,9 @@ TUNABLE_INT("kern.cam.ada.ada_send_order
 SYSCTL_INT(_kern_cam_ada, OID_AUTO, spindown_shutdown, CTLFLAG_RW,
            &ada_spindown_shutdown, 0, "Spin down upon shutdown");
 TUNABLE_INT("kern.cam.ada.spindown_shutdown", &ada_spindown_shutdown);
+SYSCTL_INT(_kern_cam_ada, OID_AUTO, write_cache, CTLFLAG_RW,
+           &ada_write_cache, 0, "Enable disk write cache");
+TUNABLE_INT("kern.cam.ada.write_cache", &ada_write_cache);
 
 /*
  * ADA_ORDEREDTAG_INTERVAL determines how often, relative
@@ -568,6 +587,7 @@ adaasync(void *callback_arg, u_int32_t c
 	struct cam_path *path, void *arg)
 {
 	struct cam_periph *periph;
+	struct ada_softc *softc;
 
 	periph = (struct cam_periph *)callback_arg;
 	switch (code) {
@@ -600,6 +620,28 @@ adaasync(void *callback_arg, u_int32_t c
 				"due to status 0x%x\n", status);
 		break;
 	}
+	case AC_SENT_BDR:
+	case AC_BUS_RESET:
+	{
+		struct ccb_getdev cgd;
+
+		softc = (struct ada_softc *)periph->softc;
+		cam_periph_async(periph, code, path, arg);
+		if (ada_write_cache < 0 && softc->write_cache < 0)
+			break;
+		if (softc->state != ADA_STATE_NORMAL)
+			break;
+		xpt_setup_ccb(&cgd.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
+		cgd.ccb_h.func_code = XPT_GDEV_TYPE;
+		xpt_action((union ccb *)&cgd);
+		if ((cgd.ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) == 0)
+			break;
+		softc->state = ADA_STATE_WCACHE;
+		cam_periph_acquire(periph);
+		cam_freeze_devq_arg(periph->path,
+		    RELSIM_RELEASE_RUNLEVEL, CAM_RL_DEV + 1);
+		xpt_schedule(periph, CAM_PRIORITY_DEV);
+	}
 	default:
 		cam_periph_async(periph, code, path, arg);
 		break;
@@ -614,8 +656,12 @@ adasysctlinit(void *context, int pending
 	char tmpstr[80], tmpstr2[80];
 
 	periph = (struct cam_periph *)context;
-	if (cam_periph_acquire(periph) != CAM_REQ_CMP)
+
+	/* periph was held for us when this task was enqueued */
+	if (periph->flags & CAM_PERIPH_INVALID) {
+		cam_periph_release(periph);
 		return;
+	}
 
 	softc = (struct ada_softc *)periph->softc;
 	snprintf(tmpstr, sizeof(tmpstr), "CAM ADA unit %d", periph->unit_number);
@@ -632,6 +678,28 @@ adasysctlinit(void *context, int pending
 		return;
 	}
 
+	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "write_cache", CTLFLAG_RW | CTLFLAG_MPSAFE,
+		&softc->write_cache, 0, "Enable disk write cache.");
+#ifdef ADA_TEST_FAILURE
+	/*
+	 * Add a 'door bell' sysctl which allows one to set it from userland
+	 * and cause something bad to happen.  For the moment, we only allow
+	 * whacking the next read or write.
+	 */
+	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "force_read_error", CTLFLAG_RW | CTLFLAG_MPSAFE,
+		&softc->force_read_error, 0,
+		"Force a read error for the next N reads.");
+	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "force_write_error", CTLFLAG_RW | CTLFLAG_MPSAFE,
+		&softc->force_write_error, 0,
+		"Force a write error for the next N writes.");
+	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "periodic_read_error", CTLFLAG_RW | CTLFLAG_MPSAFE,
+		&softc->periodic_read_error, 0,
+		"Force a read error every N reads (don't set too low).");
+#endif
 	cam_periph_release(periph);
 }
 
@@ -691,7 +759,6 @@ adaregister(struct cam_periph *periph, v
 	}
 	if (cgd->ident_data.support.command2 & ATA_SUPPORT_CFA)
 		softc->flags |= ADA_FLAG_CAN_CFA;
-	softc->state = ADA_STATE_NORMAL;
 
 	periph->softc = softc;
 
@@ -706,6 +773,10 @@ adaregister(struct cam_periph *periph, v
 		softc->quirks = ((struct ada_quirk_entry *)match)->quirks;
 	else
 		softc->quirks = ADA_Q_NONE;
+	softc->write_cache = -1;
+	snprintf(announce_buf, sizeof(announce_buf),
+	    "kern.cam.ada.%d.writa_cache", periph->unit_number);
+	TUNABLE_INT_FETCH(announce_buf, &softc->write_cache);
 
 	bzero(&cpi, sizeof(cpi));
 	xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NONE);
@@ -780,6 +851,14 @@ adaregister(struct cam_periph *periph, v
 		dp->secsize, dp->heads,
 		dp->secs_per_track, dp->cylinders);
 	xpt_announce_periph(periph, announce_buf);
+
+	/*
+	 * Create our sysctl variables, now that we know
+	 * we have successfully attached.
+	 */
+	cam_periph_acquire(periph);
+	taskqueue_enqueue(taskqueue_thread, &softc->sysctl_task);
+
 	/*
 	 * Add async callbacks for bus reset and
 	 * bus device reset calls.  I don't bother
@@ -788,7 +867,7 @@ adaregister(struct cam_periph *periph, v
 	 * them and the only alternative would be to
 	 * not attach the device on failure.
 	 */
-	xpt_register_async(AC_LOST_DEVICE,
+	xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE,
 			   adaasync, periph, periph->path);
 
 	/*
@@ -800,6 +879,16 @@ adaregister(struct cam_periph *periph, v
 	    (ADA_DEFAULT_TIMEOUT * hz) / ADA_ORDEREDTAG_INTERVAL,
 	    adasendorderedtag, softc);
 
+	if ((ada_write_cache >= 0 || softc->write_cache >= 0) &&
+	    cgd->ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) {
+		softc->state = ADA_STATE_WCACHE;
+		cam_periph_acquire(periph);
+		cam_freeze_devq_arg(periph->path,
+		    RELSIM_RELEASE_RUNLEVEL, CAM_RL_DEV + 1);
+		xpt_schedule(periph, CAM_PRIORITY_DEV);
+	} else
+		softc->state = ADA_STATE_NORMAL;
+
 	return(CAM_REQ_CMP);
 }
 
@@ -902,7 +991,45 @@ adastart(struct cam_periph *periph, unio
 		{
 			uint64_t lba = bp->bio_pblkno;
 			uint16_t count = bp->bio_bcount / softc->params.secsize;
+#ifdef ADA_TEST_FAILURE
+			int fail = 0;
 
+			/*
+			 * Support the failure ioctls.  If the command is a
+			 * read, and there are pending forced read errors, or
+			 * if a write and pending write errors, then fail this
+			 * operation with EIO.  This is useful for testing
+			 * purposes.  Also, support having every Nth read fail.
+			 *
+			 * This is a rather blunt tool.
+			 */
+			if (bp->bio_cmd == BIO_READ) {
+				if (softc->force_read_error) {
+					softc->force_read_error--;
+					fail = 1;
+				}
+				if (softc->periodic_read_error > 0) {
+					if (++softc->periodic_read_count >=
+					    softc->periodic_read_error) {
+						softc->periodic_read_count = 0;
+						fail = 1;
+					}
+				}
+			} else {
+				if (softc->force_write_error) {
+					softc->force_write_error--;
+					fail = 1;
+				}
+			}
+			if (fail) {
+				bp->bio_error = EIO;
+				bp->bio_flags |= BIO_ERROR;
+				biodone(bp);
+				xpt_release_ccb(start_ccb);
+				adaschedule(periph);
+				return;
+			}
+#endif
 			cam_fill_ataio(ataio,
 			    ada_retry_count,
 			    adadone,
@@ -1009,6 +1136,24 @@ out:
 		adaschedule(periph);
 		break;
 	}
+	case ADA_STATE_WCACHE:
+	{
+		cam_fill_ataio(ataio,
+		    1,
+		    adadone,
+		    CAM_DIR_NONE,
+		    0,
+		    NULL,
+		    0,
+		    ada_default_timeout*1000);
+
+		ata_28bit_cmd(ataio, ATA_SETFEATURES, (softc->write_cache > 0 ||
+		     (softc->write_cache < 0 && ada_write_cache)) ?
+		    ATA_SF_ENAB_WCACHE : ATA_SF_DIS_WCACHE, 0, 0);
+		start_ccb->ccb_h.ccb_state = ADA_CCB_WCACHE;
+		xpt_action(start_ccb);
+		break;
+	}
 	}
 }
 
@@ -1097,6 +1242,36 @@ adadone(struct cam_periph *periph, union
 			biodone(bp);
 		break;
 	}
+	case ADA_CCB_WCACHE:
+	{
+		if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+			if (adaerror(done_ccb, 0, 0) == ERESTART) {
+				return;
+			} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
+				cam_release_devq(done_ccb->ccb_h.path,
+				    /*relsim_flags*/0,
+				    /*reduction*/0,
+				    /*timeout*/0,
+				    /*getcount_only*/0);
+			}
+		}
+
+		softc->state = ADA_STATE_NORMAL;
+		/*
+		 * Since our peripheral may be invalidated by an error
+		 * above or an external event, we must release our CCB
+		 * before releasing the reference on the peripheral.
+		 * The peripheral will only go away once the last reference
+		 * is removed, and we need it around for the CCB release
+		 * operation.
+		 */
+		xpt_release_ccb(done_ccb);
+		cam_release_devq(periph->path,
+		    RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_DEV + 1, FALSE);
+		adaschedule(periph);
+		cam_periph_release_locked(periph);
+		return;
+	}
 	case ADA_CCB_WAITING:
 	{
 		/* Caller will release the CCB */

Modified: projects/altix/sys/cddl/compat/opensolaris/sys/sunddi.h
==============================================================================
--- projects/altix/sys/cddl/compat/opensolaris/sys/sunddi.h	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/cddl/compat/opensolaris/sys/sunddi.h	Tue Apr 12 04:48:37 2011	(r220557)
@@ -37,8 +37,10 @@
 
 #define	strdup(ptr)				strdup((ptr), M_SOLARIS)
 #define	ddi_driver_major(zfs_dip)		(0)
-#define	ddi_copyin(from, to, size, flag)	(bcopy((from), (to), (size)), 0)
-#define	ddi_copyout(from, to, size, flag)	(bcopy((from), (to), (size)), 0)
+#define	ddi_copyin(from, to, size, flag)				\
+	(copyin((from), (to), (size)), 0)
+#define	ddi_copyout(from, to, size, flag)				\
+	(copyout((from), (to), (size)), 0)
 int ddi_strtol(const char *str, char **nptr, int base, long *result);
 int ddi_strtoul(const char *str, char **nptr, int base, unsigned long *result);
 int ddi_strtoull(const char *str, char **nptr, int base,

Modified: projects/altix/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c
==============================================================================
--- projects/altix/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -20,6 +20,8 @@
  */
 /*
  * Copyright 2010 Martin Matuska <mm at FreeBSD.org>. All rights reserved.
+ * Portions Copyright 2005, 2010, Oracle and/or its affiliates.
+ * All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -151,17 +153,69 @@ zfs_cmd_compat_put(zfs_cmd_t *zc, caddr_
 }
 
 static int
-zfs_ioctl_compat_write_nvlist_dst(zfs_cmd_t *zc, nvlist_t *nvl, size_t nvsize)
+zfs_ioctl_compat_get_nvlist(uint64_t nvl, size_t size, int iflag,
+    nvlist_t **nvp)
 {
-	char *packed = (void *)(uintptr_t)zc->zc_nvlist_dst;
-	int err;
+	char *packed;
+	int error;
+	nvlist_t *list = NULL;
+
+	/*
+	 * Read in and unpack the user-supplied nvlist.
+	 */
+	if (size == 0)
+		return (EINVAL);
+
+#ifdef _KERNEL
+	packed = kmem_alloc(size, KM_SLEEP);
+	if ((error = ddi_copyin((void *)(uintptr_t)nvl, packed, size,
+	    iflag)) != 0) {
+		kmem_free(packed, size);
+		return (error);
+	}
+#else
+	packed = (void *)(uintptr_t)nvl;
+#endif
 
-	err = nvlist_pack(nvl, &packed, &nvsize,
-	    NV_ENCODE_NATIVE, 0);
-	if (err == 0)
-		zc->zc_nvlist_dst_size = nvsize;
+	error = nvlist_unpack(packed, size, &list, 0);
 
-	return (err);
+#ifdef _KERNEL
+	kmem_free(packed, size);
+#endif
+
+	if (error != 0)
+		return (error);
+
+	*nvp = list;
+	return (0);
+}
+
+static int
+zfs_ioctl_compat_put_nvlist(zfs_cmd_t *zc, nvlist_t *nvl)
+{
+	char *packed = NULL;
+	int error = 0;
+	size_t size;
+
+	VERIFY(nvlist_size(nvl, &size, NV_ENCODE_NATIVE) == 0);
+
+#ifdef _KERNEL
+	packed = kmem_alloc(size, KM_SLEEP);
+	VERIFY(nvlist_pack(nvl, &packed, &size, NV_ENCODE_NATIVE,
+	    KM_SLEEP) == 0);
+
+	if (ddi_copyout(packed,
+	    (void *)(uintptr_t)zc->zc_nvlist_dst, size, zc->zc_iflags) != 0)
+		error = EFAULT;
+	kmem_free(packed, size);
+#else
+	packed = (void *)(uintptr_t)zc->zc_nvlist_dst;
+	VERIFY(nvlist_pack(nvl, &packed, &size, NV_ENCODE_NATIVE,
+	    0) == 0);
+#endif
+
+	zc->zc_nvlist_dst_size = size;
+	return (error);
 }
 
 static void
@@ -205,17 +259,16 @@ zfs_ioctl_compat_fix_stats_nvlist(nvlist
 	}
 }
 
-static void
+static int
 zfs_ioctl_compat_fix_stats(zfs_cmd_t *zc, const int cflag)
 {
 	nvlist_t *nv, *nvp = NULL;
 	nvpair_t *elem;
-	size_t nvsize;
-	char *packed;
+	int error;
 
-	if (nvlist_unpack((void *)(uintptr_t)zc->zc_nvlist_dst,
-	    zc->zc_nvlist_dst_size, &nv, 0) != 0)
-		return;
+	if ((error = zfs_ioctl_compat_get_nvlist(zc->zc_nvlist_dst,
+	    zc->zc_nvlist_dst_size, zc->zc_iflags, &nv)) != 0)
+		return (error);
 
 	if (cflag == 5) { /* ZFS_IOC_POOL_STATS */
 		elem = NULL;
@@ -227,21 +280,22 @@ zfs_ioctl_compat_fix_stats(zfs_cmd_t *zc
 	} else
 		zfs_ioctl_compat_fix_stats_nvlist(nv);
 
-	VERIFY(nvlist_size(nv, &nvsize, NV_ENCODE_NATIVE) == 0);
-	zfs_ioctl_compat_write_nvlist_dst(zc, nv, nvsize);
+	error = zfs_ioctl_compat_put_nvlist(zc, nv);
 
 	nvlist_free(nv);
+
+	return (error);
 }
 
-static void
+static int
 zfs_ioctl_compat_pool_get_props(zfs_cmd_t *zc)
 {
 	nvlist_t *nv, *nva = NULL;
-	size_t nvsize;
+	int error;
 
-	if (nvlist_unpack((void *)(uintptr_t)zc->zc_nvlist_dst,
-	    zc->zc_nvlist_dst_size, &nv, 0) != 0)
-		return;
+	if ((error = zfs_ioctl_compat_get_nvlist(zc->zc_nvlist_dst,
+	    zc->zc_nvlist_dst_size, zc->zc_iflags, &nv)) != 0)
+		return (error);
 
 #ifdef _KERNEL
 	if (nvlist_lookup_nvlist(nv, "allocated", &nva) == 0) {
@@ -265,10 +319,11 @@ zfs_ioctl_compat_pool_get_props(zfs_cmd_
 	}
 #endif
 
-	VERIFY(nvlist_size(nv, &nvsize, NV_ENCODE_NATIVE) == 0);
-	zfs_ioctl_compat_write_nvlist_dst(zc, nv, nvsize);
+	error = zfs_ioctl_compat_put_nvlist(zc, nv);
 
 	nvlist_free(nv);
+
+	return (error);
 }
 
 #ifndef _KERNEL

Modified: projects/altix/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
==============================================================================
--- projects/altix/sys/cddl/dev/dtrace/amd64/dtrace_subr.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/cddl/dev/dtrace/amd64/dtrace_subr.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -403,7 +403,7 @@ dtrace_gethrtime_init(void *arg)
 	 * Otherwise tick->time conversion will be inaccurate, but
 	 * will preserve monotonic property of TSC.
 	 */
-	tsc_f = tsc_freq;
+	tsc_f = atomic_load_acq_64(&tsc_freq);
 
 	/*
 	 * The following line checks that nsec_scale calculated below

Modified: projects/altix/sys/cddl/dev/dtrace/i386/dtrace_subr.c
==============================================================================
--- projects/altix/sys/cddl/dev/dtrace/i386/dtrace_subr.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/cddl/dev/dtrace/i386/dtrace_subr.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -403,7 +403,7 @@ dtrace_gethrtime_init(void *arg)
 	 * Otherwise tick->time conversion will be inaccurate, but
 	 * will preserve monotonic property of TSC.
 	 */
-	tsc_f = tsc_freq;
+	tsc_f = atomic_load_acq_64(&tsc_freq);
 
 	/*
 	 * The following line checks that nsec_scale calculated below

Modified: projects/altix/sys/cddl/dev/systrace/systrace.c
==============================================================================
--- projects/altix/sys/cddl/dev/systrace/systrace.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/cddl/dev/systrace/systrace.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -64,16 +64,17 @@
 #include <amd64/linux32/linux32_proto.h>
 #include <amd64/linux32/linux32_syscalls.c>
 #include <amd64/linux32/linux32_systrace_args.c>
+#define	MODNAME		"linux32"
 #elif defined(__i386__)
 #include <i386/linux/linux.h>
 #include <i386/linux/linux_proto.h>
 #include <i386/linux/linux_syscalls.c>
 #include <i386/linux/linux_systrace_args.c>
+#define	MODNAME		"linux"
 #else
 #error Only i386 and amd64 are supported.
 #endif
 extern struct sysent linux_sysent[];
-#define	MODNAME		"linux32"
 #define	MAXSYSCALL	LINUX_SYS_MAXSYSCALL
 #define	SYSCALLNAMES	linux_syscallnames
 #define	SYSENT		linux_sysent
@@ -132,7 +133,7 @@ static struct cdevsw systrace_cdevsw = {
 	.d_version	= D_VERSION,
 	.d_open		= systrace_open,
 #ifdef LINUX_SYSTRACE
-	.d_name		= "linsystrace",
+	.d_name		= "systrace_" MODNAME,
 #else
 	.d_name		= "systrace",
 #endif

Modified: projects/altix/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- projects/altix/sys/compat/linprocfs/linprocfs.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/compat/linprocfs/linprocfs.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -221,6 +221,7 @@ linprocfs_docpuinfo(PFS_FILL_ARGS)
 {
 	int hw_model[2];
 	char model[128];
+	uint64_t freq;
 	size_t size;
 	int class, fqmhz, fqkhz;
 	int i;
@@ -303,9 +304,10 @@ linprocfs_docpuinfo(PFS_FILL_ARGS)
 		if (cpu_feature & (1 << i))
 			sbuf_printf(sb, " %s", flags[i]);
 	sbuf_cat(sb, "\n");
-	if (class >= 5) {
-		fqmhz = (tsc_freq + 4999) / 1000000;
-		fqkhz = ((tsc_freq + 4999) / 10000) % 100;
+	freq = atomic_load_acq_64(&tsc_freq);
+	if (freq != 0) {
+		fqmhz = (freq + 4999) / 1000000;
+		fqkhz = ((freq + 4999) / 10000) % 100;
 		sbuf_printf(sb,
 		    "cpu MHz\t\t: %d.%02d\n"
 		    "bogomips\t: %d.%02d\n",

Modified: projects/altix/sys/compat/linux/linux_misc.c
==============================================================================
--- projects/altix/sys/compat/linux/linux_misc.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/compat/linux/linux_misc.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/reboot.h>
+#include <sys/racct.h>
 #include <sys/resourcevar.h>
 #include <sys/sched.h>
 #include <sys/signalvar.h>
@@ -357,7 +358,9 @@ linux_uselib(struct thread *td, struct l
 	 */
 	PROC_LOCK(td->td_proc);
 	if (a_out->a_text > maxtsiz ||
-	    a_out->a_data + bss_size > lim_cur(td->td_proc, RLIMIT_DATA)) {
+	    a_out->a_data + bss_size > lim_cur(td->td_proc, RLIMIT_DATA) ||
+	    racct_set(td->td_proc, RACCT_DATA, a_out->a_data +
+	    bss_size) != 0) {
 		PROC_UNLOCK(td->td_proc);
 		error = ENOMEM;
 		goto cleanup;

Modified: projects/altix/sys/compat/svr4/imgact_svr4.c
==============================================================================
--- projects/altix/sys/compat/svr4/imgact_svr4.c	Tue Apr 12 02:07:23 2011	(r220556)
+++ projects/altix/sys/compat/svr4/imgact_svr4.c	Tue Apr 12 04:48:37 2011	(r220557)
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mman.h>
 #include <sys/mutex.h>
 #include <sys/proc.h>
+#include <sys/racct.h>
 #include <sys/resourcevar.h>
 #include <sys/vnode.h>
 
@@ -108,7 +109,8 @@ exec_svr4_imgact(imgp)
      */
     PROC_LOCK(imgp->proc);
     if (a_out->a_text > maxtsiz ||
-	a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) {
+	a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA) ||
+	racct_set(imgp->proc, RACCT_DATA, a_out->a_data + bss_size) != 0) {
     	PROC_UNLOCK(imgp->proc);
 	return (ENOMEM);

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


More information about the svn-src-projects mailing list