Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Dec 2012 21:26:37 +0000 (UTC)
From:      Brooks Davis <brooks@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r244564 - in projects/mtree: bin/date contrib/gdb/gdb contrib/mknod contrib/mtree etc etc/periodic/daily lib/libnetbsd lib/libnetgraph lib/libstand/amd64 sbin/hastd sbin/ifconfig share/...
Message-ID:  <201212212126.qBLLQbF0041413@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: brooks
Date: Fri Dec 21 21:26:36 2012
New Revision: 244564
URL: http://svnweb.freebsd.org/changeset/base/244564

Log:
  MFH at r244563 looping back the commit of libnetbsd and NetBSD's mtree.

Added:
  projects/mtree/lib/libstand/amd64/
     - copied from r244563, head/lib/libstand/amd64/
  projects/mtree/sys/arm/arm/cpufunc_asm_arm11x6.S
     - copied unchanged from r244563, head/sys/arm/arm/cpufunc_asm_arm11x6.S
  projects/mtree/sys/boot/ficl64/
     - copied from r244563, head/sys/boot/ficl64/
  projects/mtree/sys/kern/subr_busdma_bufalloc.c
     - copied unchanged from r244563, head/sys/kern/subr_busdma_bufalloc.c
  projects/mtree/sys/sys/busdma_bufalloc.h
     - copied unchanged from r244563, head/sys/sys/busdma_bufalloc.h
  projects/mtree/tools/regression/usr.bin/printf/regress.zero.out
     - copied unchanged from r244563, head/tools/regression/usr.bin/printf/regress.zero.out
Replaced:
  projects/mtree/contrib/mknod/
     - copied from r244563, head/contrib/mknod/
  projects/mtree/contrib/mtree/
     - copied from r244563, head/contrib/mtree/
  projects/mtree/lib/libnetbsd/
     - copied from r244563, head/lib/libnetbsd/
  projects/mtree/usr.sbin/nmtree/
     - copied from r244563, head/usr.sbin/nmtree/
Deleted:
  projects/mtree/sys/boot/userboot/libstand/amd64/
Modified:
  projects/mtree/bin/date/netdate.c
  projects/mtree/contrib/gdb/gdb/dwarf2read.c
  projects/mtree/contrib/gdb/gdb/gdbtypes.c
  projects/mtree/contrib/gdb/gdb/gdbtypes.h
  projects/mtree/contrib/gdb/gdb/hpread.c
  projects/mtree/contrib/gdb/gdb/parse.c
  projects/mtree/contrib/gdb/gdb/stabsread.c
  projects/mtree/etc/newsyslog.conf
  projects/mtree/etc/periodic/daily/Makefile
  projects/mtree/lib/libnetgraph/sock.c
  projects/mtree/sbin/hastd/parse.y
  projects/mtree/sbin/ifconfig/af_nd6.c
  projects/mtree/sbin/ifconfig/ifconfig.c
  projects/mtree/share/man/man4/arcmsr.4
  projects/mtree/share/misc/committers-src.dot
  projects/mtree/share/mk/bsd.lib.mk
  projects/mtree/share/mk/bsd.own.mk
  projects/mtree/sys/arm/arm/busdma_machdep-v6.c
  projects/mtree/sys/arm/arm/busdma_machdep.c
  projects/mtree/sys/arm/arm/cpufunc.c
  projects/mtree/sys/arm/arm/elf_trampoline.c
  projects/mtree/sys/arm/arm/identcpu.c
  projects/mtree/sys/arm/arm/locore.S
  projects/mtree/sys/arm/arm/pmap-v6.c
  projects/mtree/sys/arm/arm/pmap.c
  projects/mtree/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
  projects/mtree/sys/arm/broadcom/bcm2835/files.bcm2835
  projects/mtree/sys/arm/conf/PANDABOARD
  projects/mtree/sys/arm/conf/RPI-B
  projects/mtree/sys/arm/conf/VERSATILEPB
  projects/mtree/sys/arm/include/armreg.h
  projects/mtree/sys/arm/include/cpuconf.h
  projects/mtree/sys/arm/include/cpufunc.h
  projects/mtree/sys/arm/include/intr.h
  projects/mtree/sys/arm/include/pmap.h
  projects/mtree/sys/arm/include/vm.h
  projects/mtree/sys/arm/versatile/files.versatile
  projects/mtree/sys/boot/ficl/Makefile
  projects/mtree/sys/boot/userboot/libstand/Makefile
  projects/mtree/sys/cam/scsi/scsi_enc_ses.c
  projects/mtree/sys/conf/files
  projects/mtree/sys/conf/files.arm
  projects/mtree/sys/conf/options.arm
  projects/mtree/sys/dev/arcmsr/arcmsr.c
  projects/mtree/sys/dev/arcmsr/arcmsr.h
  projects/mtree/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
  projects/mtree/sys/dev/atkbdc/psm.c
  projects/mtree/sys/dev/cxgbe/t4_l2t.c
  projects/mtree/sys/dev/ixgbe/ixgbe.c
  projects/mtree/sys/dev/ixgbe/ixgbe.h
  projects/mtree/sys/dev/mii/brgphy.c
  projects/mtree/sys/dev/mii/miidevs
  projects/mtree/sys/dev/netmap/ixgbe_netmap.h
  projects/mtree/sys/dev/nvme/nvme.c
  projects/mtree/sys/dev/nvme/nvme_ctrlr.c
  projects/mtree/sys/dev/nvme/nvme_private.h
  projects/mtree/sys/dev/nvme/nvme_test.c
  projects/mtree/sys/dev/usb/serial/usb_serial.c
  projects/mtree/sys/dev/usb/serial/usb_serial.h
  projects/mtree/sys/dev/usb/storage/umass.c
  projects/mtree/sys/dev/usb/storage/ustorage_fs.c
  projects/mtree/sys/dev/usb/usb_busdma.c
  projects/mtree/sys/dev/usb/usb_msctest.c
  projects/mtree/sys/dev/usb/usb_transfer.c
  projects/mtree/sys/dev/usb/usbdi.h
  projects/mtree/sys/dev/usb/wlan/if_uath.c
  projects/mtree/sys/dev/usb/wlan/if_uathvar.h
  projects/mtree/sys/dev/usb/wlan/if_upgt.c
  projects/mtree/sys/dev/usb/wlan/if_upgtvar.h
  projects/mtree/sys/dev/usb/wlan/if_urtw.c
  projects/mtree/sys/dev/usb/wlan/if_urtwvar.h
  projects/mtree/sys/fs/ext2fs/ext2_dinode.h
  projects/mtree/sys/fs/ext2fs/ext2_inode_cnv.c
  projects/mtree/sys/fs/ext2fs/ext2_vfsops.c
  projects/mtree/sys/fs/ext2fs/ext2fs.h
  projects/mtree/sys/kern/kern_descrip.c
  projects/mtree/sys/kern/kern_jail.c
  projects/mtree/sys/kern/kern_sig.c
  projects/mtree/sys/kern/subr_smp.c
  projects/mtree/sys/kern/subr_syscall.c
  projects/mtree/sys/kern/vfs_bio.c
  projects/mtree/sys/kern/vfs_mount.c
  projects/mtree/sys/kern/vfs_subr.c
  projects/mtree/sys/mips/include/param.h
  projects/mtree/sys/netinet6/ip6_output.c
  projects/mtree/sys/sys/ktr.h
  projects/mtree/sys/tools/vnode_if.awk
  projects/mtree/sys/ufs/ffs/ffs_softdep.c
  projects/mtree/sys/vm/uma_int.h
  projects/mtree/tools/build/mk/OptionalObsoleteFiles.inc
  projects/mtree/tools/regression/usr.bin/printf/regress.sh
  projects/mtree/usr.bin/grep/grep.c
  projects/mtree/usr.bin/grep/grep.h
  projects/mtree/usr.bin/grep/util.c
  projects/mtree/usr.bin/printf/printf.c
  projects/mtree/usr.bin/sort/sort.c
  projects/mtree/usr.sbin/acpi/acpidump/acpi.c
  projects/mtree/usr.sbin/acpi/acpidump/acpidump.8
  projects/mtree/usr.sbin/bsdconfig/bsdconfig
  projects/mtree/usr.sbin/bsdconfig/console/saver
  projects/mtree/usr.sbin/bsdconfig/examples/bsdconfigrc
  projects/mtree/usr.sbin/bsdconfig/mouse/flags
  projects/mtree/usr.sbin/bsdconfig/networking/share/device.subr
  projects/mtree/usr.sbin/bsdconfig/networking/share/hostname.subr
  projects/mtree/usr.sbin/bsdconfig/networking/share/ipaddr.subr
  projects/mtree/usr.sbin/bsdconfig/networking/share/media.subr
  projects/mtree/usr.sbin/bsdconfig/networking/share/netmask.subr
  projects/mtree/usr.sbin/bsdconfig/networking/share/resolv.subr
  projects/mtree/usr.sbin/bsdconfig/networking/share/routing.subr
  projects/mtree/usr.sbin/bsdconfig/share/common.subr
  projects/mtree/usr.sbin/bsdconfig/share/dialog.subr
  projects/mtree/usr.sbin/bsdconfig/share/mustberoot.subr
  projects/mtree/usr.sbin/bsdconfig/startup/misc
  projects/mtree/usr.sbin/bsdconfig/startup/share/rcconf.subr
  projects/mtree/usr.sbin/bsdconfig/startup/share/rcedit.subr
  projects/mtree/usr.sbin/bsdconfig/usermgmt/groupdel
  projects/mtree/usr.sbin/bsdconfig/usermgmt/groupedit
  projects/mtree/usr.sbin/bsdconfig/usermgmt/groupinput
  projects/mtree/usr.sbin/bsdconfig/usermgmt/share/group_input.subr
  projects/mtree/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
  projects/mtree/usr.sbin/bsdconfig/usermgmt/userdel
  projects/mtree/usr.sbin/bsdconfig/usermgmt/useredit
  projects/mtree/usr.sbin/bsdconfig/usermgmt/userinput
  projects/mtree/usr.sbin/bsdconfig/usermgmt/usermgmt
  projects/mtree/usr.sbin/mountd/mountd.c
  projects/mtree/usr.sbin/mptable/mptable.c
  projects/mtree/usr.sbin/mtest/mtest.c
  projects/mtree/usr.sbin/nfsd/nfsd.c
  projects/mtree/usr.sbin/pkg/pkg.c
  projects/mtree/usr.sbin/rpcbind/rpcbind.c
  projects/mtree/usr.sbin/syslogd/syslogd.c
  projects/mtree/usr.sbin/ypserv/yp_main.c
Directory Properties:
  projects/mtree/   (props changed)
  projects/mtree/contrib/gdb/   (props changed)
  projects/mtree/sbin/   (props changed)
  projects/mtree/share/man/man4/   (props changed)
  projects/mtree/sys/   (props changed)
  projects/mtree/sys/boot/   (props changed)
  projects/mtree/sys/conf/   (props changed)

Modified: projects/mtree/bin/date/netdate.c
==============================================================================
--- projects/mtree/bin/date/netdate.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/bin/date/netdate.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -85,7 +85,7 @@ netsettime(time_t tval)
 	dest.sin_addr.s_addr = htonl((u_long)INADDR_ANY);
 	s = socket(AF_INET, SOCK_DGRAM, 0);
 	if (s < 0) {
-		if (errno != EPROTONOSUPPORT)
+		if (errno != EAFNOSUPPORT)
 			warn("timed");
 		return (retval = 2);
 	}

Modified: projects/mtree/contrib/gdb/gdb/dwarf2read.c
==============================================================================
--- projects/mtree/contrib/gdb/gdb/dwarf2read.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/contrib/gdb/gdb/dwarf2read.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -834,6 +834,8 @@ static void read_tag_const_type (struct 
 
 static void read_tag_volatile_type (struct die_info *, struct dwarf2_cu *);
 
+static void read_tag_restrict_type (struct die_info *, struct dwarf2_cu *);
+
 static void read_tag_string_type (struct die_info *, struct dwarf2_cu *);
 
 static void read_subroutine_type (struct die_info *, struct dwarf2_cu *);
@@ -3729,7 +3731,8 @@ read_tag_const_type (struct die_info *di
     }
 
   base_type = die_type (die, cu);
-  die->type = make_cv_type (1, TYPE_VOLATILE (base_type), base_type, 0);
+  die->type = make_cvr_type (1, TYPE_VOLATILE (base_type),
+                             TYPE_RESTRICT (base_type), base_type, 0);
 }
 
 static void
@@ -3743,7 +3746,23 @@ read_tag_volatile_type (struct die_info 
     }
 
   base_type = die_type (die, cu);
-  die->type = make_cv_type (TYPE_CONST (base_type), 1, base_type, 0);
+  die->type = make_cvr_type (TYPE_CONST (base_type), 1,
+                             TYPE_RESTRICT (base_type), base_type, 0);
+}
+
+static void
+read_tag_restrict_type (struct die_info *die, struct dwarf2_cu *cu)
+{
+  struct type *base_type;
+
+  if (die->type)
+    {
+      return;
+    }
+
+  base_type = die_type (die, cu);
+  die->type = make_cvr_type (TYPE_CONST (base_type), TYPE_VOLATILE (base_type),
+                             1, base_type, 0);
 }
 
 /* Extract all information from a DW_TAG_string_type DIE and add to
@@ -6086,6 +6105,9 @@ read_type_die (struct die_info *die, str
     case DW_TAG_volatile_type:
       read_tag_volatile_type (die, cu);
       break;
+    case DW_TAG_restrict_type:
+      read_tag_restrict_type (die, cu);
+      break;
     case DW_TAG_string_type:
       read_tag_string_type (die, cu);
       break;

Modified: projects/mtree/contrib/gdb/gdb/gdbtypes.c
==============================================================================
--- projects/mtree/contrib/gdb/gdb/gdbtypes.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/contrib/gdb/gdb/gdbtypes.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -502,7 +502,8 @@ make_type_with_address_space (struct typ
    We allocate new memory if needed.  */
 
 struct type *
-make_cv_type (int cnst, int voltl, struct type *type, struct type **typeptr)
+make_cvr_type (int cnst, int voltl, int restrct, struct type *type,
+               struct type **typeptr)
 {
   struct type *ntype;	/* New type */
   struct type *tmp_type = type;	/* tmp type */
@@ -517,6 +518,9 @@ make_cv_type (int cnst, int voltl, struc
   if (voltl)
     new_flags |= TYPE_FLAG_VOLATILE;
 
+  if (restrct)
+    new_flags |= TYPE_FLAG_RESTRICT;
+
   if (typeptr && *typeptr != NULL)
     {
       /* Objfile is per-core-type.  This const-qualified type had best
@@ -1371,7 +1375,7 @@ struct type *
 check_typedef (struct type *type)
 {
   struct type *orig_type = type;
-  int is_const, is_volatile;
+  int is_const, is_volatile, is_restrict;
 
   while (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
     {
@@ -1407,6 +1411,7 @@ check_typedef (struct type *type)
 
   is_const = TYPE_CONST (type);
   is_volatile = TYPE_VOLATILE (type);
+  is_restrict = TYPE_RESTRICT (type);
 
   /* If this is a struct/class/union with no fields, then check whether a
      full definition exists somewhere else.  This is for systems where a
@@ -1424,7 +1429,7 @@ check_typedef (struct type *type)
 	}
       newtype = lookup_transparent_type (name);
       if (newtype)
-	make_cv_type (is_const, is_volatile, newtype, &type);
+	make_cvr_type (is_const, is_volatile, is_restrict, newtype, &type);
     }
   /* Otherwise, rely on the stub flag being set for opaque/stubbed types */
   else if (TYPE_STUB (type) && !currently_reading_symtab)
@@ -1442,7 +1447,8 @@ check_typedef (struct type *type)
 	}
       sym = lookup_symbol (name, 0, STRUCT_DOMAIN, 0, (struct symtab **) NULL);
       if (sym)
-	make_cv_type (is_const, is_volatile, SYMBOL_TYPE (sym), &type);
+	make_cvr_type (is_const, is_volatile, is_restrict, SYMBOL_TYPE (sym),
+                       &type);
     }
 
   if (TYPE_TARGET_STUB (type))

Modified: projects/mtree/contrib/gdb/gdb/gdbtypes.h
==============================================================================
--- projects/mtree/contrib/gdb/gdb/gdbtypes.h	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/contrib/gdb/gdb/gdbtypes.h	Fri Dec 21 21:26:36 2012	(r244564)
@@ -273,6 +273,13 @@ enum type_code
 #define TYPE_ADDRESS_CLASS_ALL(t) (TYPE_INSTANCE_FLAGS(t) \
 				   & TYPE_FLAG_ADDRESS_CLASS_ALL)
 
+/* Restrict type.  If this is set, the corresponding type has a
+ * restrict modifier.
+ */
+
+#define TYPE_FLAG_RESTRICT (1 << 17)
+#define TYPE_RESTRICT(t)	(TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_RESTRICT)
+
 /*  Array bound type.  */
 enum array_bound_type
 {
@@ -1099,7 +1106,8 @@ extern struct type *lookup_reference_typ
 
 extern struct type *make_reference_type (struct type *, struct type **);
 
-extern struct type *make_cv_type (int, int, struct type *, struct type **);
+extern struct type *make_cvr_type (int, int, int, struct type *,
+                                   struct type **);
 
 extern void replace_type (struct type *, struct type *);
 

Modified: projects/mtree/contrib/gdb/gdb/hpread.c
==============================================================================
--- projects/mtree/contrib/gdb/gdb/hpread.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/contrib/gdb/gdb/hpread.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -4939,8 +4939,9 @@ hpread_type_lookup (dnttpointer hp_type,
        * "m_void" modifiers?  Is static_flag really needed here?
        * (m_static used for methods of classes, elsewhere).
        */
-      tmp_type = make_cv_type (dn_bufp->dmodifier.m_const,
+      tmp_type = make_cvr_type (dn_bufp->dmodifier.m_const,
 			       dn_bufp->dmodifier.m_volatile,
+                               0,
 		      hpread_type_lookup (dn_bufp->dmodifier.type, objfile),
 			       0);
       return tmp_type;

Modified: projects/mtree/contrib/gdb/gdb/parse.c
==============================================================================
--- projects/mtree/contrib/gdb/gdb/parse.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/contrib/gdb/gdb/parse.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -1167,13 +1167,15 @@ follow_types (struct type *follow_type)
       case tp_end:
 	done = 1;
 	if (make_const)
-	  follow_type = make_cv_type (make_const, 
-				      TYPE_VOLATILE (follow_type), 
-				      follow_type, 0);
+	  follow_type = make_cvr_type (make_const,
+				       TYPE_VOLATILE (follow_type),
+				       TYPE_RESTRICT (follow_type),
+				       follow_type, 0);
 	if (make_volatile)
-	  follow_type = make_cv_type (TYPE_CONST (follow_type), 
-				      make_volatile, 
-				      follow_type, 0);
+	  follow_type = make_cvr_type (TYPE_CONST (follow_type),
+				       make_volatile,
+				       TYPE_RESTRICT (follow_type),
+				       follow_type, 0);
 	if (make_addr_space)
 	  follow_type = make_type_with_address_space (follow_type, 
 						      make_addr_space);
@@ -1192,13 +1194,15 @@ follow_types (struct type *follow_type)
       case tp_pointer:
 	follow_type = lookup_pointer_type (follow_type);
 	if (make_const)
-	  follow_type = make_cv_type (make_const, 
-				      TYPE_VOLATILE (follow_type), 
-				      follow_type, 0);
+	  follow_type = make_cvr_type (make_const,
+				       TYPE_VOLATILE (follow_type),
+				       TYPE_RESTRICT (follow_type),
+				       follow_type, 0);
 	if (make_volatile)
-	  follow_type = make_cv_type (TYPE_CONST (follow_type), 
-				      make_volatile, 
-				      follow_type, 0);
+	  follow_type = make_cvr_type (TYPE_CONST (follow_type),
+				       make_volatile,
+				       TYPE_RESTRICT (follow_type),
+				       follow_type, 0);
 	if (make_addr_space)
 	  follow_type = make_type_with_address_space (follow_type, 
 						      make_addr_space);
@@ -1208,13 +1212,15 @@ follow_types (struct type *follow_type)
       case tp_reference:
 	follow_type = lookup_reference_type (follow_type);
 	if (make_const)
-	  follow_type = make_cv_type (make_const, 
-				      TYPE_VOLATILE (follow_type), 
-				      follow_type, 0);
+	  follow_type = make_cvr_type (make_const,
+				       TYPE_VOLATILE (follow_type),
+				       TYPE_RESTRICT (follow_type),
+				       follow_type, 0);
 	if (make_volatile)
-	  follow_type = make_cv_type (TYPE_CONST (follow_type), 
-				      make_volatile, 
-				      follow_type, 0);
+	  follow_type = make_cvr_type (TYPE_CONST (follow_type),
+				       make_volatile,
+				       TYPE_RESTRICT (follow_type),
+				       follow_type, 0);
 	if (make_addr_space)
 	  follow_type = make_type_with_address_space (follow_type, 
 						      make_addr_space);

Modified: projects/mtree/contrib/gdb/gdb/stabsread.c
==============================================================================
--- projects/mtree/contrib/gdb/gdb/stabsread.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/contrib/gdb/gdb/stabsread.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -1750,13 +1750,13 @@ again:
 
     case 'k':			/* Const qualifier on some type (Sun) */
       type = read_type (pp, objfile);
-      type = make_cv_type (1, TYPE_VOLATILE (type), type,
+      type = make_cvr_type (1, TYPE_VOLATILE (type), TYPE_RESTRICT(type), type,
 			   dbx_lookup_type (typenums));
       break;
 
     case 'B':			/* Volatile qual on some type (Sun) */
       type = read_type (pp, objfile);
-      type = make_cv_type (TYPE_CONST (type), 1, type,
+      type = make_cvr_type (TYPE_CONST (type), 1, TYPE_RESTRICT(type), type,
 			   dbx_lookup_type (typenums));
       break;
 

Modified: projects/mtree/etc/newsyslog.conf
==============================================================================
--- projects/mtree/etc/newsyslog.conf	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/etc/newsyslog.conf	Fri Dec 21 21:26:36 2012	(r244564)
@@ -33,7 +33,7 @@
 /var/log/pflog				600  3	   100	*     JB    /var/run/pflogd.pid
 /var/log/ppp.log	root:network	640  3	   100	*     JC
 /var/log/security			600  10	   100	*     JC
-/var/log/sendmail.st			640  10	   *	168   B
+/var/log/sendmail.st			640  10	   *	168   BN
 /var/log/utx.log			644  3	   *	@01T05 B
 /var/log/weekly.log			640  5	   *	$W6D0 JN
 /var/log/xferlog			600  7	   100	*     JC

Modified: projects/mtree/etc/periodic/daily/Makefile
==============================================================================
--- projects/mtree/etc/periodic/daily/Makefile	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/etc/periodic/daily/Makefile	Fri Dec 21 21:26:36 2012	(r244564)
@@ -6,7 +6,6 @@ FILES=	100.clean-disks \
 	110.clean-tmps \
 	120.clean-preserve \
 	200.backup-passwd \
-	220.backup-pkgdb \
 	330.news \
 	400.status-disks \
 	405.status-ata-raid \
@@ -41,7 +40,8 @@ FILES+=	480.status-ntpd
 .endif
 
 .if ${MK_PKGTOOLS} != "no"
-FILES+=	490.status-pkg-changes
+FILES+=	220.backup-pkgdb \
+	490.status-pkg-changes
 .endif
 
 .if ${MK_RCMDS} != "no"

Modified: projects/mtree/lib/libnetgraph/sock.c
==============================================================================
--- projects/mtree/lib/libnetgraph/sock.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/lib/libnetgraph/sock.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -71,10 +71,10 @@ NgMkSockNode(const char *name, int *csp,
 		name = NULL;
 
 	/* Create control socket; this also creates the netgraph node.
-	   If we get an EPROTONOSUPPORT then the socket node type is
+	   If we get an EAFNOSUPPORT then the socket node type is
 	   not loaded, so load it and try again. */
 	if ((cs = socket(AF_NETGRAPH, SOCK_DGRAM, NG_CONTROL)) < 0) {
-		if (errno == EPROTONOSUPPORT) {
+		if (errno == EAFNOSUPPORT) {
 			if (kldload(NG_SOCKET_KLD) < 0) {
 				errnosv = errno;
 				if (_gNgDebugLevel >= 1)

Modified: projects/mtree/sbin/hastd/parse.y
==============================================================================
--- projects/mtree/sbin/hastd/parse.y	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/sbin/hastd/parse.y	Fri Dec 21 21:26:36 2012	(r244564)
@@ -769,7 +769,7 @@ family_supported(int family)
 	int sock;
 
 	sock = socket(family, SOCK_STREAM, 0);
-	if (sock == -1 && errno == EPROTONOSUPPORT)
+	if (sock == -1 && errno == EAFNOSUPPORT)
 		return (false);
 	if (sock >= 0)
 		(void)close(sock);

Modified: projects/mtree/sbin/ifconfig/af_nd6.c
==============================================================================
--- projects/mtree/sbin/ifconfig/af_nd6.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/sbin/ifconfig/af_nd6.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -148,7 +148,7 @@ nd6_status(int s)
 	memset(&nd, 0, sizeof(nd));
 	strncpy(nd.ifname, ifr.ifr_name, sizeof(nd.ifname));
 	if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
-		if (errno != EPROTONOSUPPORT)
+		if (errno != EAFNOSUPPORT)
 			warn("socket(AF_INET6, SOCK_DGRAM)");
 		return;
 	}

Modified: projects/mtree/sbin/ifconfig/ifconfig.c
==============================================================================
--- projects/mtree/sbin/ifconfig/ifconfig.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/sbin/ifconfig/ifconfig.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -520,7 +520,7 @@ top:
 		AF_LOCAL : afp->af_af;
 
 	if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0 &&
-	    (uafp != NULL || errno != EPROTONOSUPPORT ||
+	    (uafp != NULL || errno != EAFNOSUPPORT ||
 	     (s = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0))
 		err(1, "socket(family %u,SOCK_DGRAM", ifr.ifr_addr.sa_family);
 

Modified: projects/mtree/share/man/man4/arcmsr.4
==============================================================================
--- projects/mtree/share/man/man4/arcmsr.4	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/share/man/man4/arcmsr.4	Fri Dec 21 21:26:36 2012	(r244564)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 3, 2012
+.Dd December 18, 2012
 .Dt ARCMSR 4
 .Os
 .Sh NAME
@@ -100,6 +100,8 @@ ARC-1212
 .It
 ARC-1213
 .It
+ARC-1214
+.It
 ARC-1220
 .It
 ARC-1222

Modified: projects/mtree/share/misc/committers-src.dot
==============================================================================
--- projects/mtree/share/misc/committers-src.dot	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/share/misc/committers-src.dot	Fri Dec 21 21:26:36 2012	(r244564)
@@ -194,6 +194,7 @@ le [label="Lukas Ertl\nle@FreeBSD.org\n2
 lstewart [label="Lawrence Stewart\nlstewart@FreeBSD.org\n2008/10/06"]
 marcel [label="Marcel Moolenaar\nmarcel@FreeBSD.org\n1999/07/03"]
 marius [label="Marius Strobl\nmarius@FreeBSD.org\n2004/04/17"]
+markj [label="Mark Johnston\nmarkj@FreeBSD.org\n2012/12/18"]
 markm [label="Mark Murray\nmarkm@FreeBSD.org\n199?/??/??"]
 markus [label="Markus Brueffer\nmarkus@FreeBSD.org\n2006/06/01"]
 matteo [label="Matteo Riondato\nmatteo@FreeBSD.org\n2006/01/18"]
@@ -378,6 +379,7 @@ eivind -> rwatson
 
 emaste -> rstone
 emaste -> dteske
+emaste -> markj
 
 emax -> markus
 
@@ -573,6 +575,8 @@ rrs -> brucec
 rrs -> jchandra
 rrs -> tuexen
 
+rstone -> markj
+
 ru -> ceri
 ru -> cjc
 ru -> eik

Modified: projects/mtree/share/mk/bsd.lib.mk
==============================================================================
--- projects/mtree/share/mk/bsd.lib.mk	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/share/mk/bsd.lib.mk	Fri Dec 21 21:26:36 2012	(r244564)
@@ -282,7 +282,7 @@ _libinstall:
 	    ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
 .if defined(DEBUG_FLAGS)
 	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
-	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
+	    ${_INSTALLFLAGS} \
 	    ${SHLIB_NAME}.symbols ${DESTDIR}${SHLIBDIR}
 .endif
 .if defined(SHLIB_LINK)

Modified: projects/mtree/share/mk/bsd.own.mk
==============================================================================
--- projects/mtree/share/mk/bsd.own.mk	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/share/mk/bsd.own.mk	Fri Dec 21 21:26:36 2012	(r244564)
@@ -322,9 +322,6 @@ __DEFAULT_YES_OPTIONS = \
     BOOT \
     BSD_CPIO \
     BSNMP \
-    SOURCELESS \
-    SOURCELESS_HOST \
-    SOURCELESS_UCODE \
     BZIP2 \
     CALENDAR \
     CAPSICUM \
@@ -401,10 +398,13 @@ __DEFAULT_YES_OPTIONS = \
     SENDMAIL \
     SETUID_LOGIN \
     SHAREDOCS \
+    SOURCELESS \
+    SOURCELESS_HOST \
+    SOURCELESS_UCODE \
     SSP \
-    SYSINSTALL \
     SYMVER \
     SYSCONS \
+    SYSINSTALL \
     TCSH \
     TELNET \
     TEXTPROC \
@@ -417,14 +417,14 @@ __DEFAULT_YES_OPTIONS = \
     ZONEINFO
 
 __DEFAULT_NO_OPTIONS = \
-    BMAKE \
-    BSD_GREP \
     BIND_IDN \
     BIND_LARGE_FILE \
     BIND_LIBS \
     BIND_SIGCHASE \
     BIND_XML \
+    BMAKE \
     BSDCONFIG \
+    BSD_GREP \
     CLANG_EXTRAS \
     CTF \
     HESIOD \

Modified: projects/mtree/sys/arm/arm/busdma_machdep-v6.c
==============================================================================
--- projects/mtree/sys/arm/arm/busdma_machdep-v6.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/sys/arm/arm/busdma_machdep-v6.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -1,4 +1,5 @@
 /*-
+ * Copyright (c) 2012 Ian Lepore
  * Copyright (c) 2010 Mark Tinguely
  * Copyright (c) 2004 Olivier Houchard
  * Copyright (c) 2002 Peter Grehan
@@ -40,6 +41,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/malloc.h>
 #include <sys/bus.h>
+#include <sys/busdma_bufalloc.h>
 #include <sys/interrupt.h>
 #include <sys/kernel.h>
 #include <sys/ktr.h>
@@ -53,6 +55,8 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm.h>
 #include <vm/vm_page.h>
 #include <vm/vm_map.h>
+#include <vm/vm_extern.h>
+#include <vm/vm_kern.h>
 
 #include <machine/atomic.h>
 #include <machine/bus.h>
@@ -83,7 +87,6 @@ struct bus_dma_tag {
 	int		  map_count;
 	bus_dma_lock_t	 *lockfunc;
 	void		 *lockfuncarg;
-	bus_dma_segment_t *segments;
 	struct bounce_zone *bounce_zone;
 	/*
 	 * DMA range for this tag.  If the page doesn't fall within
@@ -93,6 +96,14 @@ struct bus_dma_tag {
 	 */
 	struct arm32_dma_range	*ranges;
 	int			_nranges;
+	/*
+	 * Most tags need one or two segments, and can use the local tagsegs
+	 * array.  For tags with a larger limit, we'll allocate a bigger array
+	 * on first use.
+	 */
+	bus_dma_segment_t	*segments;
+	bus_dma_segment_t	tagsegs[2];
+
 
 };
 
@@ -150,6 +161,8 @@ struct bus_dmamap {
 	pmap_t		       pmap;
 	bus_dmamap_callback_t *callback;
 	void		      *callback_arg;
+	int		      flags;
+#define DMAMAP_COHERENT		(1 << 0)
 	STAILQ_ENTRY(bus_dmamap) links;
 	STAILQ_HEAD(,sync_list)	slist;
 };
@@ -169,6 +182,38 @@ int run_filter(bus_dma_tag_t dmat, bus_a
 static int _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map,
     void *buf, bus_size_t buflen, int flags);
 
+static busdma_bufalloc_t coherent_allocator;	/* Cache of coherent buffers */
+static busdma_bufalloc_t standard_allocator;	/* Cache of standard buffers */
+static void
+busdma_init(void *dummy)
+{
+
+	/* Create a cache of buffers in standard (cacheable) memory. */
+	standard_allocator = busdma_bufalloc_create("buffer", 
+	    arm_dcache_align,	/* minimum_alignment */
+	    NULL,		/* uma_alloc func */ 
+	    NULL,		/* uma_free func */
+	    0);			/* uma_zcreate_flags */
+
+	/*
+	 * Create a cache of buffers in uncacheable memory, to implement the
+	 * BUS_DMA_COHERENT (and potentially BUS_DMA_NOCACHE) flag.
+	 */
+	coherent_allocator = busdma_bufalloc_create("coherent",
+	    arm_dcache_align,	/* minimum_alignment */
+	    busdma_bufalloc_alloc_uncacheable, 
+	    busdma_bufalloc_free_uncacheable, 
+	    0);			/* uma_zcreate_flags */
+}
+
+/*
+ * This init historically used SI_SUB_VM, but now the init code requires
+ * malloc(9) using M_DEVBUF memory, which is set up later than SI_SUB_VM, by
+ * SI_SUB_KMEM and SI_ORDER_SECOND, so we'll go right after that by using
+ * SI_SUB_KMEM and SI_ORDER_THIRD.
+ */
+SYSINIT(busdma, SI_SUB_KMEM, SI_ORDER_THIRD, busdma_init, NULL);
+
 static __inline int
 _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr)
 {
@@ -322,7 +367,18 @@ bus_dma_tag_create(bus_dma_tag_t parent,
 		newtag->lockfunc = dflt_lock;
 		newtag->lockfuncarg = NULL;
 	}
-	newtag->segments = NULL;
+	/*
+	 * If all the segments we need fit into the local tagsegs array, set the
+	 * pointer now.  Otherwise NULL the pointer and an array of segments
+	 * will be allocated later, on first use.  We don't pre-allocate now
+	 * because some tags exist just to pass contraints to children in the
+	 * device hierarchy, and they tend to use BUS_SPACE_UNRESTRICTED and we
+	 * sure don't want to try to allocate an array for that.
+	 */
+	if (newtag->nsegments <= nitems(newtag->tagsegs))
+		newtag->segments = newtag->tagsegs;
+	else
+		newtag->segments = NULL;
 
 	/* Take into account any restrictions imposed by our parent tag */
 	if (parent != NULL) {
@@ -411,7 +467,8 @@ bus_dma_tag_destroy(bus_dma_tag_t dmat)
 			parent = dmat->parent;
 			atomic_subtract_int(&dmat->ref_count, 1);
 			if (dmat->ref_count == 0) {
-				if (dmat->segments != NULL)
+				if (dmat->segments != NULL &&
+				    dmat->segments != dmat->tagsegs)
 					free(dmat->segments, M_DEVBUF);
 				free(dmat, M_DEVBUF);
 				/*
@@ -545,7 +602,10 @@ int
 bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
 		 bus_dmamap_t *mapp)
 {
-	int mflags, len;
+	busdma_bufalloc_t ba;
+	struct busdma_bufzone *bufzone;
+	vm_memattr_t memattr;
+	int mflags;
 
 	if (flags & BUS_DMA_NOWAIT)
 		mflags = M_NOWAIT;
@@ -579,34 +639,54 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, voi
 
 	if (flags & BUS_DMA_ZERO)
 		mflags |= M_ZERO;
+	if (flags & BUS_DMA_COHERENT) {
+		memattr = VM_MEMATTR_UNCACHEABLE;
+		ba = coherent_allocator;
+		(*mapp)->flags |= DMAMAP_COHERENT;
+	} else {
+		memattr = VM_MEMATTR_DEFAULT;
+		ba = standard_allocator;
+		(*mapp)->flags = 0;
+	}
+#ifdef notyet
+	/* All buffers we allocate are cache-aligned. */
+	map->flags |= DMAMAP_CACHE_ALIGNED;
+#endif
 
-	/* 
-	 * XXX:
-	 * (dmat->alignment < dmat->maxsize) is just a quick hack; the exact
-	 * alignment guarantees of malloc need to be nailed down, and the
-	 * code below should be rewritten to take that into account.
-	 *
-	 * In the meantime, we'll warn the user if malloc gets it wrong.
-	 *
-	 * allocate at least a cache line. This should help avoid cache
-	 * corruption.
+	/*
+	 * Try to find a bufzone in the allocator that holds a cache of buffers
+	 * of the right size for this request.  If the buffer is too big to be
+	 * held in the allocator cache, this returns NULL.
+	 */
+	bufzone = busdma_bufalloc_findzone(ba, dmat->maxsize);
+
+	/*
+	 * Allocate the buffer from the uma(9) allocator if...
+	 *  - It's small enough to be in the allocator (bufzone not NULL).
+	 *  - The alignment constraint isn't larger than the allocation size
+	 *    (the allocator aligns buffers to their size boundaries).
+	 *  - There's no need to handle lowaddr/highaddr exclusion zones.
+	 * else allocate non-contiguous pages if...
+	 *  - The page count that could get allocated doesn't exceed nsegments.
+	 *  - The alignment constraint isn't larger than a page boundary.
+	 *  - There are no boundary-crossing constraints.
+	 * else allocate a block of contiguous pages because one or more of the
+	 * constraints is something that only the contig allocator can fulfill.
 	 */
-	len = max(dmat->maxsize, arm_dcache_align);
-        if (len <= PAGE_SIZE &&
-	   (dmat->alignment < len) &&
-	   !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr)) {
-		*vaddr = malloc(len, M_DEVBUF, mflags);
+	if (bufzone != NULL && dmat->alignment <= bufzone->size &&
+	    !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr)) {
+		*vaddr = uma_zalloc(bufzone->umazone, mflags);
+	} else if (dmat->nsegments >= btoc(dmat->maxsize) &&
+	    dmat->alignment <= PAGE_SIZE && dmat->boundary == 0) {
+		*vaddr = (void *)kmem_alloc_attr(kernel_map, dmat->maxsize,
+		    mflags, 0, dmat->lowaddr, memattr);
 	} else {
-		/*
-		 * XXX Use Contigmalloc until it is merged into this facility
-		 *     and handles multi-seg allocations.  Nobody is doing
-		 *     multi-seg allocations yet though.
-		 * XXX Certain AGP hardware does.
-		 */
-		*vaddr = contigmalloc(len, M_DEVBUF, mflags,
-		    0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul,
-		    dmat->boundary);
+		*vaddr = (void *)kmem_alloc_contig(kernel_map, dmat->maxsize,
+		    mflags, 0, dmat->lowaddr, dmat->alignment, dmat->boundary,
+		    memattr);
 	}
+
+
 	if (*vaddr == NULL) {
 		CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d",
 		    __func__, dmat, dmat->flags, ENOMEM);
@@ -630,19 +710,24 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, voi
 void
 bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
 {
-	int len;
+	struct busdma_bufzone *bufzone;
+	busdma_bufalloc_t ba;
+
+	if (map->flags & DMAMAP_COHERENT)
+		ba = coherent_allocator;
+	else
+		ba = standard_allocator;
+
+	/* Be careful not to access map from here on. */
+
+	bufzone = busdma_bufalloc_findzone(ba, dmat->maxsize);
+
+	if (bufzone != NULL && dmat->alignment <= bufzone->size &&
+	    !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr))
+		uma_zfree(bufzone->umazone, vaddr);
+	else
+		kmem_free(kernel_map, (vm_offset_t)vaddr, dmat->maxsize);
 
-#ifdef mftnotyet
-	pmap_change_attr((vm_offset_t)vaddr, dmat->maxsize, ARM_WRITE_BACK);
-#endif
-	len = max(dmat->maxsize, arm_dcache_align);
-        if (len <= PAGE_SIZE &&
-	   (dmat->alignment < len) &&
-	   !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr))
-		free(vaddr, M_DEVBUF);
-	else {
-		contigfree(vaddr, len, M_DEVBUF);
-	}
 	dmat->map_count--;
 	free(map, M_DEVBUF);
 	CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, dmat->flags);
@@ -1177,6 +1262,8 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus
 			dmat->bounce_zone->total_bounced++;
 		}
 	}
+	if (map->flags & DMAMAP_COHERENT)
+		return;
 
 	sl = STAILQ_FIRST(&map->slist);
 	while (sl) {

Modified: projects/mtree/sys/arm/arm/busdma_machdep.c
==============================================================================
--- projects/mtree/sys/arm/arm/busdma_machdep.c	Fri Dec 21 21:03:34 2012	(r244563)
+++ projects/mtree/sys/arm/arm/busdma_machdep.c	Fri Dec 21 21:26:36 2012	(r244564)
@@ -1,4 +1,5 @@
 /*-
+ * Copyright (c) 2012 Ian Lepore
  * Copyright (c) 2004 Olivier Houchard
  * Copyright (c) 2002 Peter Grehan
  * Copyright (c) 1997, 1998 Justin T. Gibbs.
@@ -32,7 +33,23 @@
 __FBSDID("$FreeBSD$");
 
 /*
- * ARM bus dma support routines
+ * ARM bus dma support routines.
+ *
+ * XXX Things to investigate / fix some day...
+ *  - What is the earliest that this API can be called?  Could there be any
+ *    fallout from changing the SYSINIT() order from SI_SUB_VM to SI_SUB_KMEM?
+ *  - The manpage mentions the BUS_DMA_NOWAIT flag only in the context of the
+ *    bus_dmamap_load() function.  This code has historically (and still does)
+ *    honor it in bus_dmamem_alloc().  If we got rid of that we could lose some
+ *    error checking because some resource management calls would become WAITOK
+ *    and thus "cannot fail."
+ *  - The decisions made by _bus_dma_can_bounce() should be made once, at tag
+ *    creation time, and the result stored in the tag.
+ *  - It should be possible to take some shortcuts when mapping a buffer we know
+ *    came from the uma(9) allocators based on what we know about such buffers
+ *    (aligned, contiguous, etc).
+ *  - The allocation of bounce pages could probably be cleaned up, then we could
+ *    retire arm_remap_nocache().
  */
 
 #define _ARM32_BUS_DMA_PRIVATE
@@ -40,6 +57,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/malloc.h>
 #include <sys/bus.h>
+#include <sys/busdma_bufalloc.h>
 #include <sys/interrupt.h>
 #include <sys/lock.h>
 #include <sys/proc.h>
@@ -50,7 +68,10 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
 
+#include <vm/uma.h>
 #include <vm/vm.h>
+#include <vm/vm_extern.h>
+#include <vm/vm_kern.h>
 #include <vm/vm_page.h>
 #include <vm/vm_map.h>
 
@@ -81,7 +102,6 @@ struct bus_dma_tag {
 	int			map_count;
 	bus_dma_lock_t		*lockfunc;
 	void			*lockfuncarg;
-	bus_dma_segment_t	*segments;
 	/*
 	 * DMA range for this tag.  If the page doesn't fall within
 	 * one of these ranges, an error is returned.  The caller
@@ -91,6 +111,13 @@ struct bus_dma_tag {
 	struct arm32_dma_range	*ranges;
 	int			_nranges;
 	struct bounce_zone *bounce_zone;
+	/*
+	 * Most tags need one or two segments, and can use the local tagsegs
+	 * array.  For tags with a larger limit, we'll allocate a bigger array
+	 * on first use.
+	 */
+	bus_dma_segment_t	*segments;
+	bus_dma_segment_t	tagsegs[2];
 };
 
 struct bounce_page {
@@ -134,7 +161,7 @@ SYSCTL_INT(_hw_busdma, OID_AUTO, total_b
 #define DMAMAP_LINEAR		0x1
 #define DMAMAP_MBUF		0x2
 #define DMAMAP_UIO		0x4
-#define DMAMAP_ALLOCATED	0x10
+#define DMAMAP_CACHE_ALIGNED	0x10
 #define DMAMAP_TYPE_MASK	(DMAMAP_LINEAR|DMAMAP_MBUF|DMAMAP_UIO)
 #define DMAMAP_COHERENT		0x8
 struct bus_dmamap {
@@ -144,9 +171,6 @@ struct bus_dmamap {
         bus_dma_tag_t	dmat;
 	int		flags;
 	void 		*buffer;
-	void		*origbuffer;
-	void		*allocbuffer;
-	TAILQ_ENTRY(bus_dmamap)	freelist;
 	int		len;
 	STAILQ_ENTRY(bus_dmamap) links;
 	bus_dmamap_callback_t *callback;
@@ -157,12 +181,6 @@ struct bus_dmamap {
 static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist;
 static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist;
 
-static TAILQ_HEAD(,bus_dmamap) dmamap_freelist =
-	TAILQ_HEAD_INITIALIZER(dmamap_freelist);
-
-#define BUSDMA_STATIC_MAPS	500
-static struct bus_dmamap map_pool[BUSDMA_STATIC_MAPS];
-
 static struct mtx busdma_mtx;
 
 MTX_SYSINIT(busdma_mtx, &busdma_mtx, "busdma lock", MTX_DEF);
@@ -180,6 +198,91 @@ static void free_bounce_page(bus_dma_tag
 bus_dma_tag_t arm_root_dma_tag;
 
 /*
+ * ----------------------------------------------------------------------------
+ * Begin block of code useful to transplant to other implementations.
+ */
+
+static uma_zone_t dmamap_zone;	/* Cache of struct bus_dmamap items */
+
+static busdma_bufalloc_t coherent_allocator;	/* Cache of coherent buffers */
+static busdma_bufalloc_t standard_allocator;	/* Cache of standard buffers */
+
+/*
+ * This is the ctor function passed to uma_zcreate() for the pool of dma maps.
+ * It'll need platform-specific changes if this code is copied.
+ */
+static int
+dmamap_ctor(void *mem, int size, void *arg, int flags)
+{
+	bus_dmamap_t map;
+	bus_dma_tag_t dmat;
+
+	map = (bus_dmamap_t)mem;
+	dmat = (bus_dma_tag_t)arg;
+
+	dmat->map_count++;
+
+	map->dmat = dmat;
+	map->flags = 0;
+	STAILQ_INIT(&map->bpages);
+
+	return (0);
+}
+
+/*
+ * This is the dtor function passed to uma_zcreate() for the pool of dma maps.
+ * It may need platform-specific changes if this code is copied              .
+ */
+static void 
+dmamap_dtor(void *mem, int size, void *arg)
+{
+	bus_dmamap_t map;
+
+	map = (bus_dmamap_t)mem;
+
+	map->dmat->map_count--;
+}
+
+static void
+busdma_init(void *dummy)
+{
+
+	/* Create a cache of maps for bus_dmamap_create(). */
+	dmamap_zone = uma_zcreate("dma maps", sizeof(struct bus_dmamap),
+	    dmamap_ctor, dmamap_dtor, NULL, NULL, UMA_ALIGN_PTR, 0);
+
+	/* Create a cache of buffers in standard (cacheable) memory. */
+	standard_allocator = busdma_bufalloc_create("buffer", 
+	    arm_dcache_align,	/* minimum_alignment */
+	    NULL,		/* uma_alloc func */ 
+	    NULL,		/* uma_free func */
+	    0);			/* uma_zcreate_flags */
+
+	/*
+	 * Create a cache of buffers in uncacheable memory, to implement the
+	 * BUS_DMA_COHERENT (and potentially BUS_DMA_NOCACHE) flag.
+	 */
+	coherent_allocator = busdma_bufalloc_create("coherent",
+	    arm_dcache_align,	/* minimum_alignment */
+	    busdma_bufalloc_alloc_uncacheable, 
+	    busdma_bufalloc_free_uncacheable, 
+	    0);			/* uma_zcreate_flags */
+}
+
+/*
+ * This init historically used SI_SUB_VM, but now the init code requires
+ * malloc(9) using M_DEVBUF memory, which is set up later than SI_SUB_VM, by
+ * SI_SUB_KMEM and SI_ORDER_SECOND, so we'll go right after that by using
+ * SI_SUB_KMEM and SI_ORDER_THIRD.
+ */
+SYSINIT(busdma, SI_SUB_KMEM, SI_ORDER_THIRD, busdma_init, NULL);
+
+/*
+ * End block of code useful to transplant to other implementations.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
  * Return true if a match is made.
  *
  * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'.
@@ -206,30 +309,26 @@ run_filter(bus_dma_tag_t dmat, bus_addr_
 	return (retval);
 }
 
-static void
-arm_dmamap_freelist_init(void *dummy)
-{
-	int i;
-
-	for (i = 0; i < BUSDMA_STATIC_MAPS; i++)
-		TAILQ_INSERT_HEAD(&dmamap_freelist, &map_pool[i], freelist);
-}
-
-SYSINIT(busdma, SI_SUB_VM, SI_ORDER_ANY, arm_dmamap_freelist_init, NULL);
-
 /*
- * Check to see if the specified page is in an allowed DMA range.
+ * This routine checks the exclusion zone constraints from a tag against the
+ * physical RAM available on the machine.  If a tag specifies an exclusion zone
+ * but there's no RAM in that zone, then we avoid allocating resources to bounce
+ * a request, and we can use any memory allocator (as opposed to needing
+ * kmem_alloc_contig() just because it can allocate pages in an address range).
+ *
+ * Most tags have BUS_SPACE_MAXADDR or BUS_SPACE_MAXADDR_32BIT (they are the
+ * same value on 32-bit architectures) as their lowaddr constraint, and we can't
+ * possibly have RAM at an address higher than the highest address we can
+ * express, so we take a fast out.
  */
-
-static __inline int
-bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,
-    bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, vm_offset_t *lastaddrp, int *segp);
-
 static __inline int
 _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr)
 {
 	int i;
+
+	if (lowaddr >= BUS_SPACE_MAXADDR)
+		return (0);
+
 	for (i = 0; phys_avail[i] && phys_avail[i + 1]; i += 2) {
 		if ((lowaddr >= phys_avail[i] && lowaddr <= phys_avail[i + 1])
 		    || (lowaddr < phys_avail[i] &&
@@ -294,38 +393,6 @@ dflt_lock(void *arg, bus_dma_lock_op_t o
 #endif
 }
 
-static __inline bus_dmamap_t
-_busdma_alloc_dmamap(void)
-{
-	bus_dmamap_t map;
-
-	mtx_lock(&busdma_mtx);
-	map = TAILQ_FIRST(&dmamap_freelist);
-	if (map)
-		TAILQ_REMOVE(&dmamap_freelist, map, freelist);
-	mtx_unlock(&busdma_mtx);
-	if (!map) {
-		map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT | M_ZERO);
-		if (map)
-			map->flags = DMAMAP_ALLOCATED;
-	} else
-		map->flags = 0;
-	STAILQ_INIT(&map->bpages);
-	return (map);
-}
-
-static __inline void
-_busdma_free_dmamap(bus_dmamap_t map)
-{
-	if (map->flags & DMAMAP_ALLOCATED)
-		free(map, M_DEVBUF);
-	else {
-		mtx_lock(&busdma_mtx);
-		TAILQ_INSERT_HEAD(&dmamap_freelist, map, freelist);
-		mtx_unlock(&busdma_mtx);
-	}
-}
-
 /*
  * Allocate a device specific dma_tag.
  */
@@ -354,7 +421,7 @@ bus_dma_tag_create(bus_dma_tag_t parent,
 	}
 
 	newtag->parent = parent;
-	newtag->alignment = alignment;
+	newtag->alignment = alignment ? alignment : 1;
 	newtag->boundary = boundary;
 	newtag->lowaddr = trunc_page((vm_offset_t)lowaddr) + (PAGE_SIZE - 1);
 	newtag->highaddr = trunc_page((vm_offset_t)highaddr) + (PAGE_SIZE - 1);
@@ -375,9 +442,19 @@ bus_dma_tag_create(bus_dma_tag_t parent,
 		newtag->lockfunc = dflt_lock;
 		newtag->lockfuncarg = NULL;
 	}
-	newtag->segments = NULL;
-
-        /*
+	/*
+	 * If all the segments we need fit into the local tagsegs array, set the
+	 * pointer now.  Otherwise NULL the pointer and an array of segments
+	 * will be allocated later, on first use.  We don't pre-allocate now
+	 * because some tags exist just to pass contraints to children in the
+	 * device hierarchy, and they tend to use BUS_SPACE_UNRESTRICTED and we
+	 * sure don't want to try to allocate an array for that.
+	 */

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212212126.qBLLQbF0041413>