svn commit: r220120 - in projects/altix/sys: amd64/amd64 amd64/include amd64/linux32 boot/pc98/boot2 cddl/contrib/opensolaris/uts/common/fs/zfs compat/freebsd32 compat/linprocfs compat/linux conf d...

Marcel Moolenaar marcel at FreeBSD.org
Tue Mar 29 00:47:01 UTC 2011


Author: marcel
Date: Tue Mar 29 00:47:00 2011
New Revision: 220120
URL: http://svn.freebsd.org/changeset/base/220120

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

Added:
  projects/altix/sys/geom/raid/
     - copied from r220114, head/sys/geom/raid/
  projects/altix/sys/modules/geom/geom_raid/
     - copied from r220114, head/sys/modules/geom/geom_raid/
Modified:
  projects/altix/sys/amd64/amd64/identcpu.c
  projects/altix/sys/amd64/amd64/initcpu.c
  projects/altix/sys/amd64/amd64/machdep.c
  projects/altix/sys/amd64/amd64/minidump_machdep.c
  projects/altix/sys/amd64/amd64/mp_machdep.c
  projects/altix/sys/amd64/include/pmap.h
  projects/altix/sys/amd64/include/smp.h
  projects/altix/sys/amd64/linux32/linux.h
  projects/altix/sys/amd64/linux32/linux32_dummy.c
  projects/altix/sys/amd64/linux32/linux32_proto.h
  projects/altix/sys/amd64/linux32/linux32_syscall.h
  projects/altix/sys/amd64/linux32/linux32_syscalls.c
  projects/altix/sys/amd64/linux32/linux32_sysent.c
  projects/altix/sys/amd64/linux32/linux32_systrace_args.c
  projects/altix/sys/amd64/linux32/linux32_sysvec.c
  projects/altix/sys/amd64/linux32/syscalls.master
  projects/altix/sys/boot/pc98/boot2/boot2.c
  projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  projects/altix/sys/compat/freebsd32/freebsd32_ioctl.c
  projects/altix/sys/compat/freebsd32/freebsd32_ioctl.h
  projects/altix/sys/compat/linprocfs/linprocfs.c
  projects/altix/sys/compat/linux/linux_misc.c
  projects/altix/sys/compat/linux/linux_misc.h
  projects/altix/sys/compat/linux/linux_socket.c
  projects/altix/sys/compat/linux/linux_socket.h
  projects/altix/sys/conf/NOTES
  projects/altix/sys/conf/files
  projects/altix/sys/conf/files.sparc64
  projects/altix/sys/conf/files.sun4v
  projects/altix/sys/conf/ldscript.amd64
  projects/altix/sys/conf/options
  projects/altix/sys/dev/ae/if_ae.c
  projects/altix/sys/dev/age/if_age.c
  projects/altix/sys/dev/agp/agp.c
  projects/altix/sys/dev/aic7xxx/aic79xx_pci.c
  projects/altix/sys/dev/alc/if_alc.c
  projects/altix/sys/dev/ale/if_ale.c
  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_eeprom_v14.h
  projects/altix/sys/dev/ath/ath_hal/ah_internal.h
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar2133.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416.h
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c
  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_interrupts.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c
  projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416reg.h
  projects/altix/sys/dev/ath/ath_hal/ar9001/ar9160_attach.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_rate/sample/sample.c
  projects/altix/sys/dev/ath/if_ath.c
  projects/altix/sys/dev/ath/if_ath_tx.c
  projects/altix/sys/dev/ath/if_ath_tx_ht.c
  projects/altix/sys/dev/ath/if_athvar.h
  projects/altix/sys/dev/bce/if_bce.c
  projects/altix/sys/dev/bge/if_bge.c
  projects/altix/sys/dev/bwn/if_bwn.c
  projects/altix/sys/dev/bxe/if_bxe.c
  projects/altix/sys/dev/cxgb/common/cxgb_common.h
  projects/altix/sys/dev/cxgb/common/cxgb_t3_hw.c
  projects/altix/sys/dev/cxgb/cxgb_adapter.h
  projects/altix/sys/dev/cxgb/cxgb_main.c
  projects/altix/sys/dev/cxgb/cxgb_sge.c
  projects/altix/sys/dev/cxgb/cxgb_t3fw.h
  projects/altix/sys/dev/cxgbe/adapter.h
  projects/altix/sys/dev/cxgbe/t4_main.c
  projects/altix/sys/dev/cxgbe/t4_sge.c
  projects/altix/sys/dev/dc/if_dc.c
  projects/altix/sys/dev/drm/drm_agpsupport.c
  projects/altix/sys/dev/e1000/e1000_osdep.c
  projects/altix/sys/dev/e1000/if_em.c
  projects/altix/sys/dev/e1000/if_lem.c
  projects/altix/sys/dev/et/if_et.c
  projects/altix/sys/dev/fxp/if_fxp.c
  projects/altix/sys/dev/iwn/if_iwn.c
  projects/altix/sys/dev/ixgbe/ixv.c
  projects/altix/sys/dev/jme/if_jme.c
  projects/altix/sys/dev/ksyms/ksyms.c
  projects/altix/sys/dev/led/led.c
  projects/altix/sys/dev/led/led.h
  projects/altix/sys/dev/malo/if_malo_pci.c
  projects/altix/sys/dev/msk/if_msk.c
  projects/altix/sys/dev/mvs/mvs_soc.c
  projects/altix/sys/dev/mxge/if_mxge.c
  projects/altix/sys/dev/nfe/if_nfe.c
  projects/altix/sys/dev/nge/if_nge.c
  projects/altix/sys/dev/pci/hostb_pci.c
  projects/altix/sys/dev/pci/pci.c
  projects/altix/sys/dev/pci/pcivar.h
  projects/altix/sys/dev/re/if_re.c
  projects/altix/sys/dev/siba/siba_core.c
  projects/altix/sys/dev/sis/if_sis.c
  projects/altix/sys/dev/ste/if_ste.c
  projects/altix/sys/dev/txp/if_txp.c
  projects/altix/sys/dev/usb/controller/ehci.c
  projects/altix/sys/dev/usb/input/ums.c
  projects/altix/sys/dev/usb/wlan/if_zyd.c
  projects/altix/sys/dev/vge/if_vge.c
  projects/altix/sys/dev/vr/if_vr.c
  projects/altix/sys/dev/vte/if_vtevar.h
  projects/altix/sys/dev/xl/if_xl.c
  projects/altix/sys/fs/msdosfs/msdosfs_lookup.c
  projects/altix/sys/fs/nfsclient/nfs_clport.c
  projects/altix/sys/geom/gate/g_gate.c
  projects/altix/sys/geom/gate/g_gate.h
  projects/altix/sys/geom/geom.h
  projects/altix/sys/geom/geom_dev.c
  projects/altix/sys/geom/geom_disk.c
  projects/altix/sys/i386/i386/identcpu.c
  projects/altix/sys/i386/i386/initcpu.c
  projects/altix/sys/i386/include/vmparam.h
  projects/altix/sys/i386/linux/linux.h
  projects/altix/sys/i386/linux/linux_dummy.c
  projects/altix/sys/i386/linux/linux_proto.h
  projects/altix/sys/i386/linux/linux_syscall.h
  projects/altix/sys/i386/linux/linux_syscalls.c
  projects/altix/sys/i386/linux/linux_sysent.c
  projects/altix/sys/i386/linux/linux_systrace_args.c
  projects/altix/sys/i386/linux/linux_sysvec.c
  projects/altix/sys/i386/linux/syscalls.master
  projects/altix/sys/ia64/include/pmap.h
  projects/altix/sys/kern/kern_descrip.c
  projects/altix/sys/kern/kern_fork.c
  projects/altix/sys/kern/kern_malloc.c
  projects/altix/sys/kern/kern_proc.c
  projects/altix/sys/kern/kern_resource.c
  projects/altix/sys/kern/kern_sig.c
  projects/altix/sys/kern/kern_thread.c
  projects/altix/sys/kern/subr_acl_nfs4.c
  projects/altix/sys/kern/subr_param.c
  projects/altix/sys/kern/subr_uio.c
  projects/altix/sys/kern/vfs_mount.c
  projects/altix/sys/kern/vfs_syscalls.c
  projects/altix/sys/mips/atheros/ar71xx_ehci.c
  projects/altix/sys/mips/atheros/ar71xx_machdep.c
  projects/altix/sys/modules/Makefile
  projects/altix/sys/modules/geom/Makefile
  projects/altix/sys/net80211/ieee80211_proto.c
  projects/altix/sys/netinet/tcp_sack.c
  projects/altix/sys/ofed/drivers/infiniband/hw/mthca/mthca_main.c
  projects/altix/sys/ofed/drivers/net/mlx4/en_cq.c
  projects/altix/sys/ofed/drivers/net/mlx4/en_ethtool.c
  projects/altix/sys/ofed/drivers/net/mlx4/en_main.c
  projects/altix/sys/ofed/drivers/net/mlx4/en_netdev.c
  projects/altix/sys/ofed/drivers/net/mlx4/en_port.c
  projects/altix/sys/ofed/drivers/net/mlx4/en_rx.c
  projects/altix/sys/ofed/drivers/net/mlx4/fw.c
  projects/altix/sys/ofed/drivers/net/mlx4/fw.h
  projects/altix/sys/ofed/drivers/net/mlx4/main.c
  projects/altix/sys/ofed/drivers/net/mlx4/mlx4_en.h
  projects/altix/sys/ofed/include/linux/gfp.h
  projects/altix/sys/ofed/include/linux/mlx4/device.h
  projects/altix/sys/ofed/include/linux/pci.h
  projects/altix/sys/ofed/include/linux/scatterlist.h
  projects/altix/sys/ofed/include/rdma/ib_addr.h
  projects/altix/sys/pci/if_rl.c
  projects/altix/sys/sparc64/pci/ofw_pci.h
  projects/altix/sys/sparc64/pci/ofw_pci_if.m
  projects/altix/sys/sparc64/pci/ofw_pcibus.c
  projects/altix/sys/sparc64/pci/psycho.c
  projects/altix/sys/sparc64/pci/psychovar.h
  projects/altix/sys/sparc64/pci/schizo.c
  projects/altix/sys/sparc64/pci/schizoreg.h
  projects/altix/sys/sparc64/pci/schizovar.h
  projects/altix/sys/sys/acl.h
  projects/altix/sys/sys/fcntl.h
  projects/altix/sys/sys/filedesc.h
  projects/altix/sys/sys/proc.h
  projects/altix/sys/sys/systm.h
  projects/altix/sys/sys/uio.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/vm/vm_fault.c
  projects/altix/sys/vm/vm_meter.c
  projects/altix/sys/vm/vm_pageout.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/identcpu.c
==============================================================================
--- projects/altix/sys/amd64/amd64/identcpu.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/amd64/identcpu.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -385,7 +385,7 @@ printcpuinfo(void)
 				);
 			}
 
-			if (cpu_vendor_id == CPU_VENDOR_CENTAUR)
+			if (via_feature_rng != 0 || via_feature_xcrypt != 0)
 				print_via_padlock_info();
 
 			if ((cpu_feature & CPUID_HTT) &&
@@ -643,25 +643,7 @@ print_via_padlock_info(void)
 {
 	u_int regs[4];
 
-	/* Check for supported models. */
-	switch (cpu_id & 0xff0) {
-	case 0x690:
-		if ((cpu_id & 0xf) < 3)
-			return;
-	case 0x6a0:
-	case 0x6d0:
-	case 0x6f0:
-		break;
-	default:
-		return;
-	}
-	
-	do_cpuid(0xc0000000, regs);
-	if (regs[0] >= 0xc0000001)
-		do_cpuid(0xc0000001, regs);
-	else
-		return;
-
+	do_cpuid(0xc0000001, regs);
 	printf("\n  VIA Padlock Features=0x%b", regs[3],
 	"\020"
 	"\003RNG"		/* RNG */

Modified: projects/altix/sys/amd64/amd64/initcpu.c
==============================================================================
--- projects/altix/sys/amd64/amd64/initcpu.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/amd64/initcpu.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -74,72 +74,47 @@ u_int	cpu_mxcsr_mask;		/* Valid bits in 
 u_int	cpu_clflush_line_size = 32;
 
 SYSCTL_UINT(_hw, OID_AUTO, via_feature_rng, CTLFLAG_RD,
-	&via_feature_rng, 0, "VIA C3/C7 RNG feature available in CPU");
+	&via_feature_rng, 0, "VIA RNG feature available in CPU");
 SYSCTL_UINT(_hw, OID_AUTO, via_feature_xcrypt, CTLFLAG_RD,
-	&via_feature_xcrypt, 0, "VIA C3/C7 xcrypt feature available in CPU");
+	&via_feature_xcrypt, 0, "VIA xcrypt feature available in CPU");
 
 /*
- * Initialize special VIA C3/C7 features
+ * Initialize special VIA features
  */
 static void
 init_via(void)
 {
 	u_int regs[4], val;
-	u_int64_t msreg;
 
+	/*
+	 * Check extended CPUID for PadLock features.
+	 *
+	 * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/programming_guide.pdf
+	 */
 	do_cpuid(0xc0000000, regs);
-	val = regs[0];
-	if (val >= 0xc0000001) {
+	if (regs[0] >= 0xc0000001) {
 		do_cpuid(0xc0000001, regs);
 		val = regs[3];
 	} else
-		val = 0;
+		return;
 
-	/* Enable RNG if present and disabled */
-	if (val & VIA_CPUID_HAS_RNG) {
-		if (!(val & VIA_CPUID_DO_RNG)) {
-			msreg = rdmsr(0x110B);
-			msreg |= 0x40;
-			wrmsr(0x110B, msreg);
-		}
+	/* Enable RNG if present. */
+	if ((val & VIA_CPUID_HAS_RNG) != 0) {
 		via_feature_rng = VIA_HAS_RNG;
+		wrmsr(0x110B, rdmsr(0x110B) | VIA_CPUID_DO_RNG);
 	}
-	/* Enable AES engine if present and disabled */
-	if (val & VIA_CPUID_HAS_ACE) {
-		if (!(val & VIA_CPUID_DO_ACE)) {
-			msreg = rdmsr(0x1107);
-			msreg |= (0x01 << 28);
-			wrmsr(0x1107, msreg);
-		}
+
+	/* Enable PadLock if present. */
+	if ((val & VIA_CPUID_HAS_ACE) != 0)
 		via_feature_xcrypt |= VIA_HAS_AES;
-	}
-	/* Enable ACE2 engine if present and disabled */
-	if (val & VIA_CPUID_HAS_ACE2) {
-		if (!(val & VIA_CPUID_DO_ACE2)) {
-			msreg = rdmsr(0x1107);
-			msreg |= (0x01 << 28);
-			wrmsr(0x1107, msreg);
-		}
+	if ((val & VIA_CPUID_HAS_ACE2) != 0)
 		via_feature_xcrypt |= VIA_HAS_AESCTR;
-	}
-	/* Enable SHA engine if present and disabled */
-	if (val & VIA_CPUID_HAS_PHE) {
-		if (!(val & VIA_CPUID_DO_PHE)) {
-			msreg = rdmsr(0x1107);
-			msreg |= (0x01 << 28/**/);
-			wrmsr(0x1107, msreg);
-		}
+	if ((val & VIA_CPUID_HAS_PHE) != 0)
 		via_feature_xcrypt |= VIA_HAS_SHA;
-	}
-	/* Enable MM engine if present and disabled */
-	if (val & VIA_CPUID_HAS_PMM) {
-		if (!(val & VIA_CPUID_DO_PMM)) {
-			msreg = rdmsr(0x1107);
-			msreg |= (0x01 << 28/**/);
-			wrmsr(0x1107, msreg);
-		}
+	if ((val & VIA_CPUID_HAS_PMM) != 0)
 		via_feature_xcrypt |= VIA_HAS_MM;
-	}
+	if (via_feature_xcrypt != 0)
+		wrmsr(0x1107, rdmsr(0x1107) | (1 << 28));
 }
 
 /*
@@ -159,9 +134,7 @@ initializecpu(void)
 		wrmsr(MSR_EFER, msr);
 		pg_nx = PG_NX;
 	}
-	if (cpu_vendor_id == CPU_VENDOR_CENTAUR &&
-	    CPUID_TO_FAMILY(cpu_id) == 0x6 &&
-	    CPUID_TO_MODEL(cpu_id) >= 0xf)
+	if (cpu_vendor_id == CPU_VENDOR_CENTAUR)
 		init_via();
 }
 

Modified: projects/altix/sys/amd64/amd64/machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/machdep.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/amd64/machdep.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -156,6 +156,11 @@ static void get_fpcontext(struct thread 
 static int  set_fpcontext(struct thread *td, const mcontext_t *mcp);
 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
 
+/*
+ * The file "conf/ldscript.amd64" defines the symbol "kernphys".  Its value is
+ * the physical address at which the kernel is loaded.
+ */
+extern char kernphys[];
 #ifdef DDB
 extern vm_offset_t ksym_start, ksym_end;
 #endif
@@ -1417,7 +1422,7 @@ getmemsize(caddr_t kmdp, u_int64_t first
 			/*
 			 * block out kernel memory as not available.
 			 */
-			if (pa >= 0x100000 && pa < first)
+			if (pa >= (vm_paddr_t)kernphys && pa < first)
 				goto do_dump_avail;
 
 			/*

Modified: projects/altix/sys/amd64/amd64/minidump_machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/minidump_machdep.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/amd64/minidump_machdep.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -53,8 +53,6 @@ CTASSERT(sizeof(struct kerneldumpheader)
 #define	MD_ALIGN(x)	(((off_t)(x) + PAGE_MASK) & ~PAGE_MASK)
 #define	DEV_ALIGN(x)	(((off_t)(x) + (DEV_BSIZE-1)) & ~(DEV_BSIZE-1))
 
-extern uint64_t KPDPphys;
-
 uint64_t *vm_page_dump;
 int vm_page_dump_size;
 

Modified: projects/altix/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- projects/altix/sys/amd64/amd64/mp_machdep.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/amd64/mp_machdep.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -116,7 +116,6 @@ u_long *ipi_invlrng_counts[MAXCPU];
 u_long *ipi_invlpg_counts[MAXCPU];
 u_long *ipi_invlcache_counts[MAXCPU];
 u_long *ipi_rendezvous_counts[MAXCPU];
-u_long *ipi_lazypmap_counts[MAXCPU];
 static u_long *ipi_hardclock_counts[MAXCPU];
 #endif
 
@@ -1620,8 +1619,6 @@ mp_ipi_intrcnt(void *dummy)
 		intrcnt_add(buf, &ipi_ast_counts[i]);
 		snprintf(buf, sizeof(buf), "cpu%d:rendezvous", i);
 		intrcnt_add(buf, &ipi_rendezvous_counts[i]);
-		snprintf(buf, sizeof(buf), "cpu%d:lazypmap", i);
-		intrcnt_add(buf, &ipi_lazypmap_counts[i]);
 		snprintf(buf, sizeof(buf), "cpu%d:hardclock", i);
 		intrcnt_add(buf, &ipi_hardclock_counts[i]);
 	}

Modified: projects/altix/sys/amd64/include/pmap.h
==============================================================================
--- projects/altix/sys/amd64/include/pmap.h	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/include/pmap.h	Tue Mar 29 00:47:00 2011	(r220120)
@@ -180,6 +180,7 @@ typedef u_int64_t pml4_entry_t;
 #define	PML4map		((pd_entry_t *)(addr_PML4map))
 #define	PML4pml4e	((pd_entry_t *)(addr_PML4pml4e))
 
+extern u_int64_t KPDPphys;	/* physical address of kernel level 3 */
 extern u_int64_t KPML4phys;	/* physical address of kernel level 4 */
 
 /*

Modified: projects/altix/sys/amd64/include/smp.h
==============================================================================
--- projects/altix/sys/amd64/include/smp.h	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/include/smp.h	Tue Mar 29 00:47:00 2011	(r220120)
@@ -41,7 +41,6 @@ extern u_long *ipi_invlrng_counts[MAXCPU
 extern u_long *ipi_invlpg_counts[MAXCPU];
 extern u_long *ipi_invlcache_counts[MAXCPU];
 extern u_long *ipi_rendezvous_counts[MAXCPU];
-extern u_long *ipi_lazypmap_counts[MAXCPU];
 #endif
 
 /* IPI handlers */

Modified: projects/altix/sys/amd64/linux32/linux.h
==============================================================================
--- projects/altix/sys/amd64/linux32/linux.h	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux.h	Tue Mar 29 00:47:00 2011	(r220120)
@@ -695,6 +695,7 @@ union l_semun {
 #define	LINUX_SO_NO_CHECK	11
 #define	LINUX_SO_PRIORITY	12
 #define	LINUX_SO_LINGER		13
+#define	LINUX_SO_PASSCRED	16
 #define	LINUX_SO_PEERCRED	17
 #define	LINUX_SO_RCVLOWAT	18
 #define	LINUX_SO_SNDLOWAT	19

Modified: projects/altix/sys/amd64/linux32/linux32_dummy.c
==============================================================================
--- projects/altix/sys/amd64/linux32/linux32_dummy.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux32_dummy.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -54,8 +54,6 @@ DUMMY(sysfs);
 DUMMY(query_module);
 DUMMY(nfsservctl);
 DUMMY(rt_sigqueueinfo);
-DUMMY(capget);
-DUMMY(capset);
 DUMMY(sendfile);
 DUMMY(setfsuid);
 DUMMY(setfsgid);

Modified: projects/altix/sys/amd64/linux32/linux32_proto.h
==============================================================================
--- projects/altix/sys/amd64/linux32/linux32_proto.h	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux32_proto.h	Tue Mar 29 00:47:00 2011	(r220120)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg 
+ * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 220028 2011-03-26 10:51:56Z avg 
  */
 
 #ifndef _LINUX_SYSPROTO_H_
@@ -589,10 +589,12 @@ struct linux_getcwd_args {
 	char bufsize_l_[PADL_(l_ulong)]; l_ulong bufsize; char bufsize_r_[PADR_(l_ulong)];
 };
 struct linux_capget_args {
-	register_t dummy;
+	char hdrp_l_[PADL_(struct l_user_cap_header *)]; struct l_user_cap_header * hdrp; char hdrp_r_[PADR_(struct l_user_cap_header *)];
+	char datap_l_[PADL_(struct l_user_cap_data *)]; struct l_user_cap_data * datap; char datap_r_[PADR_(struct l_user_cap_data *)];
 };
 struct linux_capset_args {
-	register_t dummy;
+	char hdrp_l_[PADL_(struct l_user_cap_header *)]; struct l_user_cap_header * hdrp; char hdrp_r_[PADR_(struct l_user_cap_header *)];
+	char datap_l_[PADL_(struct l_user_cap_data *)]; struct l_user_cap_data * datap; char datap_r_[PADR_(struct l_user_cap_data *)];
 };
 struct linux_sigaltstack_args {
 	char uss_l_[PADL_(l_stack_t *)]; l_stack_t * uss; char uss_r_[PADR_(l_stack_t *)];

Modified: projects/altix/sys/amd64/linux32/linux32_syscall.h
==============================================================================
--- projects/altix/sys/amd64/linux32/linux32_syscall.h	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux32_syscall.h	Tue Mar 29 00:47:00 2011	(r220120)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg 
+ * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 220028 2011-03-26 10:51:56Z avg 
  */
 
 #define	LINUX_SYS_exit	1

Modified: projects/altix/sys/amd64/linux32/linux32_syscalls.c
==============================================================================
--- projects/altix/sys/amd64/linux32/linux32_syscalls.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux32_syscalls.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg 
+ * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 220028 2011-03-26 10:51:56Z avg 
  */
 
 const char *linux_syscallnames[] = {

Modified: projects/altix/sys/amd64/linux32/linux32_sysent.c
==============================================================================
--- projects/altix/sys/amd64/linux32/linux32_sysent.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux32_sysent.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg 
+ * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 220028 2011-03-26 10:51:56Z avg 
  */
 
 #include "opt_compat.h"
@@ -203,8 +203,8 @@ struct sysent linux_sysent[] = {
 	{ AS(linux_pwrite_args), (sy_call_t *)linux_pwrite, AUE_PWRITE, NULL, 0, 0, 0, SY_THR_STATIC },	/* 181 = linux_pwrite */
 	{ AS(linux_chown16_args), (sy_call_t *)linux_chown16, AUE_CHOWN, NULL, 0, 0, 0, SY_THR_STATIC },	/* 182 = linux_chown16 */
 	{ AS(linux_getcwd_args), (sy_call_t *)linux_getcwd, AUE_GETCWD, NULL, 0, 0, 0, SY_THR_STATIC },	/* 183 = linux_getcwd */
-	{ 0, (sy_call_t *)linux_capget, AUE_CAPGET, NULL, 0, 0, 0, SY_THR_STATIC },	/* 184 = linux_capget */
-	{ 0, (sy_call_t *)linux_capset, AUE_CAPSET, NULL, 0, 0, 0, SY_THR_STATIC },	/* 185 = linux_capset */
+	{ AS(linux_capget_args), (sy_call_t *)linux_capget, AUE_CAPGET, NULL, 0, 0, 0, SY_THR_STATIC },	/* 184 = linux_capget */
+	{ AS(linux_capset_args), (sy_call_t *)linux_capset, AUE_CAPSET, NULL, 0, 0, 0, SY_THR_STATIC },	/* 185 = linux_capset */
 	{ AS(linux_sigaltstack_args), (sy_call_t *)linux_sigaltstack, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC },	/* 186 = linux_sigaltstack */
 	{ 0, (sy_call_t *)linux_sendfile, AUE_SENDFILE, NULL, 0, 0, 0, SY_THR_STATIC },	/* 187 = linux_sendfile */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 188 = getpmsg */

Modified: projects/altix/sys/amd64/linux32/linux32_systrace_args.c
==============================================================================
--- projects/altix/sys/amd64/linux32/linux32_systrace_args.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux32_systrace_args.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -1284,12 +1284,18 @@ systrace_args(int sysnum, void *params, 
 	}
 	/* linux_capget */
 	case 184: {
-		*n_args = 0;
+		struct linux_capget_args *p = params;
+		uarg[0] = (intptr_t) p->hdrp; /* struct l_user_cap_header * */
+		uarg[1] = (intptr_t) p->datap; /* struct l_user_cap_data * */
+		*n_args = 2;
 		break;
 	}
 	/* linux_capset */
 	case 185: {
-		*n_args = 0;
+		struct linux_capset_args *p = params;
+		uarg[0] = (intptr_t) p->hdrp; /* struct l_user_cap_header * */
+		uarg[1] = (intptr_t) p->datap; /* struct l_user_cap_data * */
+		*n_args = 2;
 		break;
 	}
 	/* linux_sigaltstack */
@@ -4051,9 +4057,29 @@ systrace_setargdesc(int sysnum, int ndx,
 		break;
 	/* linux_capget */
 	case 184:
+		switch(ndx) {
+		case 0:
+			p = "struct l_user_cap_header *";
+			break;
+		case 1:
+			p = "struct l_user_cap_data *";
+			break;
+		default:
+			break;
+		};
 		break;
 	/* linux_capset */
 	case 185:
+		switch(ndx) {
+		case 0:
+			p = "struct l_user_cap_header *";
+			break;
+		case 1:
+			p = "struct l_user_cap_data *";
+			break;
+		default:
+			break;
+		};
 		break;
 	/* linux_sigaltstack */
 	case 186:

Modified: projects/altix/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- projects/altix/sys/amd64/linux32/linux32_sysvec.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/linux32_sysvec.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -249,8 +249,7 @@ elf_linux_fixup(register_t **stack_base,
 	struct linux32_ps_strings *arginfo;
 
 	arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
-	uplatform = (Elf32_Addr *)((caddr_t)arginfo - linux_szsigcode -
-	    linux_szplatform);
+	uplatform = (Elf32_Addr *)((caddr_t)arginfo - linux_szplatform);
 
 	KASSERT(curthread->td_proc == imgp->proc,
 	    ("unsafe elf_linux_fixup(), should be curproc"));

Modified: projects/altix/sys/amd64/linux32/syscalls.master
==============================================================================
--- projects/altix/sys/amd64/linux32/syscalls.master	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/amd64/linux32/syscalls.master	Tue Mar 29 00:47:00 2011	(r220120)
@@ -326,8 +326,10 @@
 				    l_uid16_t uid, l_gid16_t gid); }
 183	AUE_GETCWD	STD	{ int linux_getcwd(char *buf, \
 				    l_ulong bufsize); }
-184	AUE_CAPGET	STD	{ int linux_capget(void); }
-185	AUE_CAPSET	STD	{ int linux_capset(void); }
+184	AUE_CAPGET	STD	{ int linux_capget(struct l_user_cap_header *hdrp, \
+				    struct l_user_cap_data *datap); }
+185	AUE_CAPSET	STD	{ int linux_capset(struct l_user_cap_header *hdrp, \
+				    struct l_user_cap_data *datap); }
 186	AUE_NULL	STD	{ int linux_sigaltstack(l_stack_t *uss, \
 				    l_stack_t *uoss); }
 187	AUE_SENDFILE	STD	{ int linux_sendfile(void); }

Modified: projects/altix/sys/boot/pc98/boot2/boot2.c
==============================================================================
--- projects/altix/sys/boot/pc98/boot2/boot2.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/boot/pc98/boot2/boot2.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -137,7 +137,7 @@ static const char *kname = NULL;
 static uint32_t opts;
 static int comspeed = SIOSPD;
 static struct bootinfo bootinfo;
-static unsigned ioctrl = IO_KEYBOARD;
+static uint8_t ioctrl = IO_KEYBOARD;
 
 void exit(int);
 static void load(void);
@@ -445,9 +445,8 @@ load(void)
     static Elf32_Shdr es[2];
     caddr_t p;
     ino_t ino;
-    uint32_t addr, x;
+    uint32_t addr;
     int i, j;
-    uint8_t fmt;
 
     if (!(ino = lookup(kname))) {
 	if (!ls)
@@ -456,15 +455,8 @@ load(void)
     }
     if (xfsread(ino, &hdr, sizeof(hdr)))
 	return;
-    if (N_GETMAGIC(hdr.ex) == ZMAGIC)
-	fmt = 0;
-    else if (IS_ELF(hdr.eh))
-	fmt = 1;
-    else {
-	printf("Invalid %s\n", "format");
-	return;
-    }
-    if (fmt == 0) {
+
+    if (N_GETMAGIC(hdr.ex) == ZMAGIC) {
 	addr = hdr.ex.a_entry & 0xffffff;
 	p = PTOV(addr);
 	fs_off = PAGE_SIZE;
@@ -473,7 +465,7 @@ load(void)
 	p += roundup2(hdr.ex.a_text, PAGE_SIZE);
 	if (xfsread(ino, p, hdr.ex.a_data))
 	    return;
-    } else {
+    } else if (IS_ELF(hdr.eh)) {
 	fs_off = hdr.eh.e_phoff;
 	for (j = i = 0; i < hdr.eh.e_phnum && j < 2; i++) {
 	    if (xfsread(ino, ep + j, sizeof(ep[0])))
@@ -505,7 +497,11 @@ load(void)
 	}
 	addr = hdr.eh.e_entry & 0xffffff;
 	bootinfo.bi_esymtab = VTOP(p);
+    } else {
+	printf("Invalid %s\n", "format");
+	return;
     }
+
     bootinfo.bi_kernelname = VTOP(kname);
     bootinfo.bi_bios_dev = dsk.daua;
     __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
@@ -672,7 +668,7 @@ static void
 printf(const char *fmt,...)
 {
     va_list ap;
-    char buf[10];
+    static char buf[10];
     char *s;
     unsigned u;
     int c;

Modified: projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -2962,11 +2962,6 @@ top:
 	 */
 
 	if (mask & AT_SIZE) {
-		err = zfs_zaccess(zp, ACE_WRITE_DATA, 0, skipaclchk, cr);
-		if (err) {
-			ZFS_EXIT(zfsvfs);
-			return (err);
-		}
 		/*
 		 * XXX - Note, we are not providing any open
 		 * mode flags here (like FNDELAY), so we may

Modified: projects/altix/sys/compat/freebsd32/freebsd32_ioctl.c
==============================================================================
--- projects/altix/sys/compat/freebsd32/freebsd32_ioctl.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/compat/freebsd32/freebsd32_ioctl.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -38,7 +38,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/filio.h>
 #include <sys/file.h>
 #include <sys/ioccom.h>
+#include <sys/malloc.h>
 #include <sys/mdioctl.h>
+#include <sys/memrange.h>
 #include <sys/proc.h>
 #include <sys/syscall.h>
 #include <sys/syscallsubr.h>
@@ -55,6 +57,7 @@ __FBSDID("$FreeBSD$");
 CTASSERT((sizeof(struct md_ioctl32)+4) == 436);
 CTASSERT(sizeof(struct ioc_read_toc_entry32) == 8);
 CTASSERT(sizeof(struct ioc_toc_header32) == 4);
+CTASSERT(sizeof(struct mem_range_op32) == 12);
 
 
 static int
@@ -64,13 +67,10 @@ freebsd32_ioctl_md(struct thread *td, st
 	struct md_ioctl mdv;
 	struct md_ioctl32 md32;
 	u_long com = 0;
-	int error;
+	int i, error;
 
-	if (uap->data == NULL)
-		panic("%s: where is my ioctl data??", __func__);
 	if (uap->com & IOC_IN) {
 		if ((error = copyin(uap->data, &md32, sizeof(md32)))) {
-			fdrop(fp, td);
 			return (error);
 		}
 		CP(md32, mdv, md_version);
@@ -119,9 +119,16 @@ freebsd32_ioctl_md(struct thread *td, st
 		CP(mdv, md32, md_base);
 		CP(mdv, md32, md_fwheads);
 		CP(mdv, md32, md_fwsectors);
+		if (com == MDIOCLIST) {
+			/*
+			 * Use MDNPAD, and not MDNPAD32.  Padding is
+			 * allocated and used by compat32 ABI.
+			 */
+			for (i = 0; i < MDNPAD; i++)
+				CP(mdv, md32, md_pad[i]);
+		}
 		error = copyout(&md32, uap->data, sizeof(md32));
 	}
-	fdrop(fp, td);
 	return error;
 }
 
@@ -134,9 +141,6 @@ freebsd32_ioctl_ioc_toc_header(struct th
 	struct ioc_toc_header32 toch32;
 	int error;
 
-	if (uap->data == NULL)
-		panic("%s: where is my ioctl data??", __func__);
-
 	if ((error = copyin(uap->data, &toch32, sizeof(toch32))))
 		return (error);
 	CP(toch32, toch, len);
@@ -144,7 +148,6 @@ freebsd32_ioctl_ioc_toc_header(struct th
 	CP(toch32, toch, ending_track);
 	error = fo_ioctl(fp, CDIOREADTOCHEADER, (caddr_t)&toch,
 	    td->td_ucred, td);
-	fdrop(fp, td);
 	return (error);
 }
 
@@ -157,9 +160,6 @@ freebsd32_ioctl_ioc_read_toc(struct thre
 	struct ioc_read_toc_entry32 toce32;
 	int error;
 
-	if (uap->data == NULL)
-		panic("%s: where is my ioctl data??", __func__);
-
 	if ((error = copyin(uap->data, &toce32, sizeof(toce32))))
 		return (error);
 	CP(toce32, toce, address_format);
@@ -175,7 +175,6 @@ freebsd32_ioctl_ioc_read_toc(struct thre
 		PTROUT_CP(toce, toce32, data);
 		error = copyout(&toce32, uap->data, sizeof(toce32));
 	}
-	fdrop(fp, td);
 	return error;
 }
 
@@ -192,7 +191,49 @@ freebsd32_ioctl_fiodgname(struct thread 
 	CP(fgn32, fgn, len);
 	PTRIN_CP(fgn32, fgn, buf);
 	error = fo_ioctl(fp, FIODGNAME, (caddr_t)&fgn, td->td_ucred, td);
-	fdrop(fp, td);
+	return (error);
+}
+
+static int
+freebsd32_ioctl_memrange(struct thread *td,
+    struct freebsd32_ioctl_args *uap, struct file *fp)
+{
+	struct mem_range_op mro;
+	struct mem_range_op32 mro32;
+	int error;
+	u_long com;
+
+	if ((error = copyin(uap->data, &mro32, sizeof(mro32))) != 0)
+		return (error);
+
+	PTRIN_CP(mro32, mro, mo_desc);
+	CP(mro32, mro, mo_arg[0]);
+	CP(mro32, mro, mo_arg[1]);
+
+	com = 0;
+	switch (uap->com) {
+	case MEMRANGE_GET32:
+		com = MEMRANGE_GET;
+		break;
+
+	case MEMRANGE_SET32:
+		com = MEMRANGE_SET;
+		break;
+
+	default:
+		panic("%s: unknown MEMRANGE %#x", __func__, uap->com);
+	}
+
+	if ((error = fo_ioctl(fp, com, (caddr_t)&mro, td->td_ucred, td)) != 0)
+		return (error);
+
+	if ( (com & IOC_OUT) ) {
+		CP(mro, mro32, mo_arg[0]);
+		CP(mro, mro32, mo_arg[1]);
+
+		error = copyout(&mro32, uap->data, sizeof(mro32));
+	}
+
 	return (error);
 }
 
@@ -219,16 +260,25 @@ freebsd32_ioctl(struct thread *td, struc
 	case MDIOCDETACH_32:	/* FALLTHROUGH */
 	case MDIOCQUERY_32:	/* FALLTHROUGH */
 	case MDIOCLIST_32:
-		return freebsd32_ioctl_md(td, uap, fp);
+		error = freebsd32_ioctl_md(td, uap, fp);
+		break;
 
 	case CDIOREADTOCENTRYS_32:
-		return freebsd32_ioctl_ioc_read_toc(td, uap, fp);
+		error = freebsd32_ioctl_ioc_read_toc(td, uap, fp);
+		break;
 
 	case CDIOREADTOCHEADER_32:
-		return freebsd32_ioctl_ioc_toc_header(td, uap, fp);
+		error = freebsd32_ioctl_ioc_toc_header(td, uap, fp);
+		break;
 
 	case FIODGNAME_32:
-		return freebsd32_ioctl_fiodgname(td, uap, fp);
+		error = freebsd32_ioctl_fiodgname(td, uap, fp);
+		break;
+
+	case MEMRANGE_GET32:	/* FALLTHROUGH */
+	case MEMRANGE_SET32:
+		error = freebsd32_ioctl_memrange(td, uap, fp);
+		break;
 
 	default:
 		fdrop(fp, td);
@@ -237,4 +287,7 @@ freebsd32_ioctl(struct thread *td, struc
 		PTRIN_CP(*uap, ap, data);
 		return ioctl(td, &ap);
 	}
+
+	fdrop(fp, td);
+	return error;
 }

Modified: projects/altix/sys/compat/freebsd32/freebsd32_ioctl.h
==============================================================================
--- projects/altix/sys/compat/freebsd32/freebsd32_ioctl.h	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/compat/freebsd32/freebsd32_ioctl.h	Tue Mar 29 00:47:00 2011	(r220120)
@@ -67,6 +67,12 @@ struct fiodgname_arg32 {
 	caddr_t32	buf;
 };
 
+struct mem_range_op32
+{
+	caddr_t32	mo_desc;
+	int		mo_arg[2];
+};
+
 #define	CDIOREADTOCENTRYS_32 _IOWR('c', 5, struct ioc_read_toc_entry32)
 #define	CDIOREADTOCHEADER_32 _IOR('c', 4, struct ioc_toc_header32)
 #define	MDIOCATTACH_32	_IOC(IOC_INOUT, 'm', 0, sizeof(struct md_ioctl32) + 4)
@@ -74,5 +80,7 @@ struct fiodgname_arg32 {
 #define	MDIOCQUERY_32	_IOC(IOC_INOUT, 'm', 2, sizeof(struct md_ioctl32) + 4)
 #define	MDIOCLIST_32	_IOC(IOC_INOUT, 'm', 3, sizeof(struct md_ioctl32) + 4)
 #define	FIODGNAME_32	_IOW('f', 120, struct fiodgname_arg32)
+#define	MEMRANGE_GET32	_IOWR('m', 50, struct mem_range_op32)
+#define	MEMRANGE_SET32	_IOW('m', 51, struct mem_range_op32)
 
 #endif	/* _COMPAT_FREEBSD32_IOCTL_H_ */

Modified: projects/altix/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- projects/altix/sys/compat/linprocfs/linprocfs.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/compat/linprocfs/linprocfs.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -740,7 +740,6 @@ linprocfs_doprocstatus(PFS_FILL_ARGS)
 	if (P_SHOULDSTOP(p)) {
 		state = "T (stopped)";
 	} else {
-		PROC_SLOCK(p);
 		switch(p->p_state) {
 		case PRS_NEW:
 			state = "I (idle)";
@@ -770,7 +769,6 @@ linprocfs_doprocstatus(PFS_FILL_ARGS)
 			state = "? (unknown)";
 			break;
 		}
-		PROC_SUNLOCK(p);
 	}
 
 	fill_kinfo_proc(p, &kp);

Modified: projects/altix/sys/compat/linux/linux_misc.c
==============================================================================
--- projects/altix/sys/compat/linux/linux_misc.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/compat/linux/linux_misc.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -1679,6 +1679,100 @@ linux_exit_group(struct thread *td, stru
 	return (0);
 }
 
+#define _LINUX_CAPABILITY_VERSION  0x19980330
+
+struct l_user_cap_header {
+	l_int	version;
+	l_int	pid;
+};
+
+struct l_user_cap_data {
+	l_int	effective;
+	l_int	permitted;
+	l_int	inheritable;
+};
+
+int
+linux_capget(struct thread *td, struct linux_capget_args *args)
+{
+	struct l_user_cap_header luch;
+	struct l_user_cap_data lucd;
+	int error;
+
+	if (args->hdrp == NULL)
+		return (EFAULT);
+
+	error = copyin(args->hdrp, &luch, sizeof(luch));
+	if (error != 0)
+		return (error);
+
+	if (luch.version != _LINUX_CAPABILITY_VERSION) {
+		luch.version = _LINUX_CAPABILITY_VERSION;
+		error = copyout(&luch, args->hdrp, sizeof(luch));
+		if (error)
+			return (error);
+		return (EINVAL);
+	}
+
+	if (luch.pid)
+		return (EPERM);
+
+	if (args->datap) {
+		/*
+		 * The current implementation doesn't support setting
+		 * a capability (it's essentially a stub) so indicate
+		 * that no capabilities are currently set or available
+		 * to request.
+		 */
+		bzero (&lucd, sizeof(lucd));
+		error = copyout(&lucd, args->datap, sizeof(lucd));
+	}
+
+	return (error);
+}
+
+int
+linux_capset(struct thread *td, struct linux_capset_args *args)
+{
+	struct l_user_cap_header luch;
+	struct l_user_cap_data lucd;
+	int error;
+
+	if (args->hdrp == NULL || args->datap == NULL)
+		return (EFAULT);
+
+	error = copyin(args->hdrp, &luch, sizeof(luch));
+	if (error != 0)
+		return (error);
+
+	if (luch.version != _LINUX_CAPABILITY_VERSION) {
+		luch.version = _LINUX_CAPABILITY_VERSION;
+		error = copyout(&luch, args->hdrp, sizeof(luch));
+		if (error)
+			return (error);
+		return (EINVAL);
+	}
+
+	if (luch.pid)
+		return (EPERM);
+
+	error = copyin(args->datap, &lucd, sizeof(lucd));
+	if (error != 0)
+		return (error);
+
+	/* We currently don't support setting any capabilities. */
+	if (lucd.effective || lucd.permitted || lucd.inheritable) {
+		linux_msg(td,
+			  "capset effective=0x%x, permitted=0x%x, "
+			  "inheritable=0x%x is not implemented",
+			  (int)lucd.effective, (int)lucd.permitted,
+			  (int)lucd.inheritable);
+		return (EPERM);
+	}
+
+	return (0);
+}
+
 int
 linux_prctl(struct thread *td, struct linux_prctl_args *args)
 {
@@ -1712,6 +1806,21 @@ linux_prctl(struct thread *td, struct li
 		    (void *)(register_t)args->arg2,
 		    sizeof(pdeath_signal));
 		break;
+	case LINUX_PR_GET_KEEPCAPS:
+		/*
+		 * Indicate that we always clear the effective and
+		 * permitted capability sets when the user id becomes
+		 * non-zero (actually the capability sets are simply
+		 * always zero in the current implementation).
+		 */
+		td->td_retval[0] = 0;
+		break;
+	case LINUX_PR_SET_KEEPCAPS:
+		/*
+		 * Ignore requests to keep the effective and permitted
+		 * capability sets when the user id becomes non-zero.
+		 */
+		break;
 	case LINUX_PR_SET_NAME:
 		/*
 		 * To be on the safe side we need to make sure to not

Modified: projects/altix/sys/compat/linux/linux_misc.h
==============================================================================
--- projects/altix/sys/compat/linux/linux_misc.h	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/compat/linux/linux_misc.h	Tue Mar 29 00:47:00 2011	(r220120)
@@ -37,6 +37,8 @@
 					 * Second arg is a ptr to return the
 					 * signal.
 					 */
+#define	LINUX_PR_GET_KEEPCAPS	7	/* Get drop capabilities on setuid */
+#define	LINUX_PR_SET_KEEPCAPS	8	/* Set drop capabilities on setuid */
 #define	LINUX_PR_SET_NAME	15	/* Set process name. */
 #define	LINUX_PR_GET_NAME	16	/* Get process name. */
 

Modified: projects/altix/sys/compat/linux/linux_socket.c
==============================================================================
--- projects/altix/sys/compat/linux/linux_socket.c	Tue Mar 29 00:36:36 2011	(r220119)
+++ projects/altix/sys/compat/linux/linux_socket.c	Tue Mar 29 00:47:00 2011	(r220120)
@@ -300,6 +300,8 @@ linux_to_bsd_so_sockopt(int opt)
 		return (SO_OOBINLINE);
 	case LINUX_SO_LINGER:
 		return (SO_LINGER);
+	case LINUX_SO_PASSCRED:
+		return (LOCAL_CREDS);
 	case LINUX_SO_PEERCRED:
 		return (LOCAL_PEERCRED);
 	case LINUX_SO_RCVLOWAT:
@@ -433,6 +435,8 @@ linux_to_bsd_cmsg_type(int cmsg_type)
 	switch (cmsg_type) {
 	case LINUX_SCM_RIGHTS:
 		return (SCM_RIGHTS);
+	case LINUX_SCM_CREDENTIALS:
+		return (SCM_CREDS);
 	}
 	return (-1);
 }
@@ -444,6 +448,8 @@ bsd_to_linux_cmsg_type(int cmsg_type)
 	switch (cmsg_type) {
 	case SCM_RIGHTS:
 		return (LINUX_SCM_RIGHTS);
+	case SCM_CREDS:
+		return (LINUX_SCM_CREDENTIALS);
 	}
 	return (-1);
 }
@@ -459,7 +465,16 @@ linux_to_bsd_msghdr(struct msghdr *bhdr,
 	bhdr->msg_iov		= PTRIN(lhdr->msg_iov);
 	bhdr->msg_iovlen	= lhdr->msg_iovlen;
 	bhdr->msg_control	= PTRIN(lhdr->msg_control);
-	bhdr->msg_controllen	= lhdr->msg_controllen;
+
+	/*
+	 * msg_controllen is skipped since BSD and LINUX control messages
+	 * are potentially different sizes (e.g. the cred structure used
+	 * by SCM_CREDS is different between the two operating system).
+	 *
+	 * The caller can set it (if necessary) after converting all the
+	 * control messages.
+	 */
+
 	bhdr->msg_flags		= linux_to_bsd_msg_flags(lhdr->msg_flags);
 	return (0);
 }
@@ -472,7 +487,16 @@ bsd_to_linux_msghdr(const struct msghdr 
 	lhdr->msg_iov		= PTROUT(bhdr->msg_iov);
 	lhdr->msg_iovlen	= bhdr->msg_iovlen;
 	lhdr->msg_control	= PTROUT(bhdr->msg_control);
-	lhdr->msg_controllen	= bhdr->msg_controllen;
+
+	/*
+	 * msg_controllen is skipped since BSD and LINUX control messages
+	 * are potentially different sizes (e.g. the cred structure used
+	 * by SCM_CREDS is different between the two operating system).
+	 *
+	 * The caller can set it (if necessary) after converting all the
+	 * control messages.
+	 */
+
 	/* msg_flags skipped */
 	return (0);
 }
@@ -1092,6 +1116,7 @@ static int
 linux_sendmsg(struct thread *td, struct linux_sendmsg_args *args)
 {
 	struct cmsghdr *cmsg;
+	struct cmsgcred cmcred;
 	struct mbuf *control;
 	struct msghdr msg;
 	struct l_cmsghdr linux_cmsg;
@@ -1099,15 +1124,14 @@ linux_sendmsg(struct thread *td, struct 
 	struct l_msghdr linux_msg;
 	struct iovec *iov;
 	socklen_t datalen;
+	struct sockaddr *sa;
+	sa_family_t sa_family;
 	void *data;
 	int error;
 
 	error = copyin(PTRIN(args->msg), &linux_msg, sizeof(linux_msg));
 	if (error)
 		return (error);
-	error = linux_to_bsd_msghdr(&msg, &linux_msg);
-	if (error)
-		return (error);
 
 	/*
 	 * Some Linux applications (ping) define a non-NULL control data
@@ -1116,8 +1140,12 @@ linux_sendmsg(struct thread *td, struct 
 	 * order to handle this case.  This should be checked, but allows the
 	 * Linux ping to work.
 	 */
-	if (msg.msg_control != NULL && msg.msg_controllen == 0)
-		msg.msg_control = NULL;
+	if (PTRIN(linux_msg.msg_control) != NULL && linux_msg.msg_controllen == 0)
+		linux_msg.msg_control = PTROUT(NULL);
+
+	error = linux_to_bsd_msghdr(&msg, &linux_msg);
+	if (error)
+		return (error);
 
 #ifdef COMPAT_LINUX32
 	error = linux32_copyiniov(PTRIN(msg.msg_iov), msg.msg_iovlen,
@@ -1128,13 +1156,21 @@ linux_sendmsg(struct thread *td, struct 
 	if (error)
 		return (error);
 
-	if (msg.msg_control != NULL) {
+	control = NULL;
+	cmsg = NULL;
+
+	if ((ptr_cmsg = LINUX_CMSG_FIRSTHDR(&linux_msg)) != NULL) {
+		error = kern_getsockname(td, args->s, &sa, &datalen);
+		if (error)
+			goto bad;
+		sa_family = sa->sa_family;
+		free(sa, M_SONAME);
+
 		error = ENOBUFS;
 		cmsg = malloc(CMSG_HDRSZ, M_TEMP, M_WAITOK | M_ZERO);
 		control = m_get(M_WAIT, MT_CONTROL);
 		if (control == NULL)
 			goto bad;
-		ptr_cmsg = LINUX_CMSG_FIRSTHDR(&msg);
 
 		do {
 			error = copyin(ptr_cmsg, &linux_cmsg,
@@ -1147,28 +1183,58 @@ linux_sendmsg(struct thread *td, struct 
 				goto bad;
 
 			/*
-			 * Now we support only SCM_RIGHTS, so return EINVAL
-			 * in any other cmsg_type
+			 * Now we support only SCM_RIGHTS and SCM_CRED,
+			 * so return EINVAL in any other cmsg_type
 			 */
-			if ((cmsg->cmsg_type =
-			    linux_to_bsd_cmsg_type(linux_cmsg.cmsg_type)) == -1)
-				goto bad;
+			cmsg->cmsg_type =
+			    linux_to_bsd_cmsg_type(linux_cmsg.cmsg_type);
 			cmsg->cmsg_level =
 			    linux_to_bsd_sockopt_level(linux_cmsg.cmsg_level);
+			if (cmsg->cmsg_type == -1
+			    || cmsg->cmsg_level != SOL_SOCKET)
+				goto bad;
+
+			/*
+			 * Some applications (e.g. pulseaudio) attempt to
+			 * send ancillary data even if the underlying protocol
+			 * doesn't support it which is not allowed in the
+			 * FreeBSD system call interface.
+			 */
+			if (sa_family != AF_UNIX)
+				continue;
 
+			data = LINUX_CMSG_DATA(ptr_cmsg);
 			datalen = linux_cmsg.cmsg_len - L_CMSG_HDRSZ;
+
+			switch (cmsg->cmsg_type)
+			{
+			case SCM_RIGHTS:
+				break;
+
+			case SCM_CREDS:
+				data = &cmcred;
+				datalen = sizeof(cmcred);
+
+				/*

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


More information about the svn-src-projects mailing list