Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Mar 2008 18:39:45 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 137734 for review
Message-ID:  <200803141839.m2EIdjKr015569@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=137734

Change 137734 by rwatson@rwatson_cinnamon on 2008/03/14 18:39:45

	Integrate zero-copy BPF branch.

Affected files ...

.. //depot/projects/zcopybpf/src/sys/amd64/acpica/acpi_machdep.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/amd64_mem.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/intr_machdep.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/legacy.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/machdep.c#9 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/mem.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/nexus.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/trap.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/amd64/vm_machdep.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/conf/DEFAULTS#4 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/ia32/ia32_signal.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/include/nexusvar.h#1 branch
.. //depot/projects/zcopybpf/src/sys/amd64/include/specialreg.h#7 integrate
.. //depot/projects/zcopybpf/src/sys/amd64/linux32/linux32_sysvec.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/arm/arm/busdma_machdep.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/arm/arm/nexus.c#3 integrate
.. //depot/projects/zcopybpf/src/sys/arm/arm/trap.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/arm/conf/AVILA#7 integrate
.. //depot/projects/zcopybpf/src/sys/arm/xscale/i8134x/crb_machdep.c#4 integrate
.. //depot/projects/zcopybpf/src/sys/boot/common/dev_net.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/powerpc/uboot/metadata.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/Makefile#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/common/main.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/Makefile#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/api_public.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/console.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/copy.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/devicename.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/disk.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/elf_freebsd.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/glue.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/glue.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/libuboot.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/module.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/net.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/reboot.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/boot/uboot/lib/time.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/compat/freebsd32/freebsd32_proto.h#8 integrate
.. //depot/projects/zcopybpf/src/sys/compat/freebsd32/freebsd32_syscall.h#8 integrate
.. //depot/projects/zcopybpf/src/sys/compat/freebsd32/freebsd32_syscalls.c#8 integrate
.. //depot/projects/zcopybpf/src/sys/compat/freebsd32/freebsd32_sysent.c#8 integrate
.. //depot/projects/zcopybpf/src/sys/compat/freebsd32/syscalls.master#8 integrate
.. //depot/projects/zcopybpf/src/sys/compat/svr4/svr4_sysvec.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/conf/files#21 integrate
.. //depot/projects/zcopybpf/src/sys/conf/options#16 integrate
.. //depot/projects/zcopybpf/src/sys/dev/acpica/acpi.c#11 integrate
.. //depot/projects/zcopybpf/src/sys/dev/acpica/acpivar.h#5 integrate
.. //depot/projects/zcopybpf/src/sys/dev/agp/agp_i810.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/dev/bge/if_bge.c#11 integrate
.. //depot/projects/zcopybpf/src/sys/dev/hwpmc/pmc_events.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/dev/mxge/if_mxge.c#12 integrate
.. //depot/projects/zcopybpf/src/sys/dev/tdfx/tdfx_pci.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/dev/tsec/if_tsec.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/dev/tsec/if_tsec.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/dev/uart/uart.h#4 integrate
.. //depot/projects/zcopybpf/src/sys/dev/uart/uart_dev_ns8250.c#3 integrate
.. //depot/projects/zcopybpf/src/sys/dev/usb/ehci_pci.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/dev/usb/ums.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/dev/usb/usb_quirks.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/dev/usb/usbdevs#15 integrate
.. //depot/projects/zcopybpf/src/sys/dev/wpi/if_wpi.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/fs/fifofs/fifo_vnops.c#10 integrate
.. //depot/projects/zcopybpf/src/sys/fs/procfs/procfs_ctl.c#3 integrate
.. //depot/projects/zcopybpf/src/sys/fs/procfs/procfs_dbregs.c#3 integrate
.. //depot/projects/zcopybpf/src/sys/fs/procfs/procfs_status.c#4 integrate
.. //depot/projects/zcopybpf/src/sys/i386/acpica/acpi_machdep.c#4 integrate
.. //depot/projects/zcopybpf/src/sys/i386/conf/DEFAULTS#4 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/i686_mem.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/intr_machdep.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/k6_mem.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/legacy.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/machdep.c#9 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/nexus.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/sys_machdep.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/trap.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/i386/i386/vm_machdep.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/i386/ibcs2/imgact_coff.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/i386/include/nexusvar.h#1 branch
.. //depot/projects/zcopybpf/src/sys/i386/include/specialreg.h#6 integrate
.. //depot/projects/zcopybpf/src/sys/i386/linux/linux_sysvec.c#4 integrate
.. //depot/projects/zcopybpf/src/sys/i386/svr4/svr4_machdep.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/ia64/conf/DEFAULTS#5 integrate
.. //depot/projects/zcopybpf/src/sys/ia64/ia64/machdep.c#9 integrate
.. //depot/projects/zcopybpf/src/sys/ia64/ia64/nexus.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/ia64/ia64/trap.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/ia64/include/ucontext.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/kern/imgact_elf.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/kern/init_sysent.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_clock.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_condvar.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_exec.c#11 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_fork.c#10 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_intr.c#8 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_kse.c#8 delete
.. //depot/projects/zcopybpf/src/sys/kern/kern_proc.c#9 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_resource.c#8 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_sig.c#11 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_switch.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_sx.c#8 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_synch.c#10 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_thread.c#11 integrate
.. //depot/projects/zcopybpf/src/sys/kern/kern_timeout.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/kern/p1003_1b.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/kern/sched_4bsd.c#11 integrate
.. //depot/projects/zcopybpf/src/sys/kern/sched_ule.c#17 integrate
.. //depot/projects/zcopybpf/src/sys/kern/subr_sleepqueue.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/kern/subr_trap.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/kern/subr_witness.c#10 integrate
.. //depot/projects/zcopybpf/src/sys/kern/sys_process.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/kern/syscalls.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/kern/syscalls.master#8 integrate
.. //depot/projects/zcopybpf/src/sys/kern/systrace_args.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/netgraph/netgraph.h#6 integrate
.. //depot/projects/zcopybpf/src/sys/netgraph/ng_base.c#9 integrate
.. //depot/projects/zcopybpf/src/sys/netgraph/ng_socket.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/netinet/ip_ipsec.c#6 integrate
.. //depot/projects/zcopybpf/src/sys/netinet/libalias/alias.c#3 integrate
.. //depot/projects/zcopybpf/src/sys/netinet/libalias/alias.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/netinet/libalias/alias_old.c#2 delete
.. //depot/projects/zcopybpf/src/sys/netinet6/ip6_ipsec.c#4 integrate
.. //depot/projects/zcopybpf/src/sys/netinet6/ip6_ipsec.h#4 integrate
.. //depot/projects/zcopybpf/src/sys/netinet6/ip6_output.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/netipsec/ipsec_output.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/netipsec/key.c#4 integrate
.. //depot/projects/zcopybpf/src/sys/pc98/conf/DEFAULTS#3 integrate
.. //depot/projects/zcopybpf/src/sys/pc98/include/nexusvar.h#1 branch
.. //depot/projects/zcopybpf/src/sys/pc98/pc98/machdep.c#9 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/aim/trap.c#3 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/aim/vm_machdep.c#3 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/booke/machdep.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/booke/trap.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/booke/vm_machdep.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/conf/DEFAULTS#4 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/include/bootinfo.h#3 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/include/ocpbus.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/mpc85xx/ocpbus.c#2 integrate
.. //depot/projects/zcopybpf/src/sys/powerpc/powerpc/intr_machdep.c#7 integrate
.. //depot/projects/zcopybpf/src/sys/sparc64/conf/DEFAULTS#4 integrate
.. //depot/projects/zcopybpf/src/sys/sparc64/sparc64/trap.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/sys/condvar.h#3 integrate
.. //depot/projects/zcopybpf/src/sys/sys/cpuset.h#2 integrate
.. //depot/projects/zcopybpf/src/sys/sys/disklabel.h#3 integrate
.. //depot/projects/zcopybpf/src/sys/sys/kse.h#2 delete
.. //depot/projects/zcopybpf/src/sys/sys/param.h#15 integrate
.. //depot/projects/zcopybpf/src/sys/sys/proc.h#13 integrate
.. //depot/projects/zcopybpf/src/sys/sys/sched.h#5 integrate
.. //depot/projects/zcopybpf/src/sys/sys/sleepqueue.h#4 integrate
.. //depot/projects/zcopybpf/src/sys/sys/syscall.h#7 integrate
.. //depot/projects/zcopybpf/src/sys/sys/syscall.mk#7 integrate
.. //depot/projects/zcopybpf/src/sys/sys/sysproto.h#7 integrate
.. //depot/projects/zcopybpf/src/sys/sys/systm.h#8 integrate
.. //depot/projects/zcopybpf/src/sys/ufs/ffs/ffs_softdep.c#12 integrate
.. //depot/projects/zcopybpf/src/sys/vm/vm_glue.c#5 integrate
.. //depot/projects/zcopybpf/src/sys/vm/vm_map.c#10 integrate
.. //depot/projects/zcopybpf/src/sys/vm/vm_meter.c#4 integrate

Differences ...

==== //depot/projects/zcopybpf/src/sys/amd64/acpica/acpi_machdep.c#2 (text+ko) ====

@@ -25,14 +25,18 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/acpica/acpi_machdep.c,v 1.17 2005/09/11 18:39:00 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/acpica/acpi_machdep.c,v 1.18 2008/03/13 20:39:02 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
 
 #include <contrib/dev/acpica/acpi.h>
 #include <dev/acpica/acpivar.h>
 
+#include <machine/nexusvar.h>
+
 static int intr_model = ACPI_INTR_PIC;
 
 int
@@ -67,3 +71,43 @@
 {
 	__asm __volatile("sti; hlt");
 }
+
+/*
+ * ACPI nexus(4) driver.
+ */
+static int
+nexus_acpi_probe(device_t dev)
+{
+	int error;
+
+	error = acpi_identify();
+	if (error)
+		return (error);
+
+	return (BUS_PROBE_DEFAULT);
+}
+
+static int
+nexus_acpi_attach(device_t dev)
+{
+
+	nexus_init_resources();
+	bus_generic_probe(dev);
+	if (BUS_ADD_CHILD(dev, 10, "acpi", 0) == NULL)
+		panic("failed to add acpi0 device");
+
+	return (bus_generic_attach(dev));
+}
+
+static device_method_t nexus_acpi_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_probe,		nexus_acpi_probe),
+	DEVMETHOD(device_attach,	nexus_acpi_attach),
+
+	{ 0, 0 }
+};
+
+DEFINE_CLASS_1(nexus, nexus_acpi_driver, nexus_acpi_methods, 1, nexus_driver);
+static devclass_t nexus_devclass;
+
+DRIVER_MODULE(nexus_acpi, root, nexus_acpi_driver, nexus_devclass, 0, 0);

==== //depot/projects/zcopybpf/src/sys/amd64/amd64/amd64_mem.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/amd64_mem.c,v 1.25 2004/08/07 06:21:37 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/amd64_mem.c,v 1.29 2008/03/12 22:09:19 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -47,31 +47,31 @@
 
 static char *mem_owner_bios = "BIOS";
 
-#define MR686_FIXMTRR	(1<<0)
+#define	MR686_FIXMTRR	(1<<0)
 
-#define mrwithin(mr, a) \
-    (((a) >= (mr)->mr_base) && ((a) < ((mr)->mr_base + (mr)->mr_len)))
-#define mroverlap(mra, mrb) \
-    (mrwithin(mra, mrb->mr_base) || mrwithin(mrb, mra->mr_base))
+#define	mrwithin(mr, a)							\
+	(((a) >= (mr)->mr_base) && ((a) < ((mr)->mr_base + (mr)->mr_len)))
+#define	mroverlap(mra, mrb)						\
+	(mrwithin(mra, mrb->mr_base) || mrwithin(mrb, mra->mr_base))
 
-#define mrvalid(base, len) 						\
-    ((!(base & ((1 << 12) - 1))) && 	/* base is multiple of 4k */	\
-     ((len) >= (1 << 12)) && 		/* length is >= 4k */		\
-     powerof2((len)) && 		/* ... and power of two */	\
-     !((base) & ((len) - 1)))		/* range is not discontiuous */
+#define	mrvalid(base, len) 						\
+	((!(base & ((1 << 12) - 1))) &&	/* base is multiple of 4k */	\
+	    ((len) >= (1 << 12)) &&	/* length is >= 4k */		\
+	    powerof2((len)) &&		/* ... and power of two */	\
+	    !((base) & ((len) - 1)))	/* range is not discontiuous */
 
-#define mrcopyflags(curr, new) (((curr) & ~MDF_ATTRMASK) | ((new) & MDF_ATTRMASK))
+#define	mrcopyflags(curr, new)						\
+	(((curr) & ~MDF_ATTRMASK) | ((new) & MDF_ATTRMASK))
 
-static int			mtrrs_disabled;
+static int mtrrs_disabled;
 TUNABLE_INT("machdep.disable_mtrrs", &mtrrs_disabled);
 SYSCTL_INT(_machdep, OID_AUTO, disable_mtrrs, CTLFLAG_RDTUN,
-	&mtrrs_disabled, 0, "Disable amd64 MTRRs.");
+    &mtrrs_disabled, 0, "Disable amd64 MTRRs.");
 
-static void			amd64_mrinit(struct mem_range_softc *sc);
-static int			amd64_mrset(struct mem_range_softc *sc,
-					   struct mem_range_desc *mrd,
-					   int *arg);
-static void			amd64_mrAPinit(struct mem_range_softc *sc);
+static void	amd64_mrinit(struct mem_range_softc *sc);
+static int	amd64_mrset(struct mem_range_softc *sc,
+		    struct mem_range_desc *mrd, int *arg);
+static void	amd64_mrAPinit(struct mem_range_softc *sc);
 
 static struct mem_range_ops amd64_mrops = {
 	amd64_mrinit,
@@ -80,157 +80,159 @@
 };
 
 /* XXX for AP startup hook */
-static u_int64_t		mtrrcap, mtrrdef;
+static u_int64_t mtrrcap, mtrrdef;
+
+/* The bitmask for the PhysBase and PhysMask fields of the variable MTRRs. */
+static u_int64_t mtrr_physmask;
 
-static struct mem_range_desc	*mem_range_match(struct mem_range_softc *sc,
-						 struct mem_range_desc *mrd);
-static void			amd64_mrfetch(struct mem_range_softc *sc);
-static int			amd64_mtrrtype(int flags);
-static int			amd64_mrt2mtrr(int flags, int oldval);
-static int			amd64_mtrrconflict(int flag1, int flag2);
-static void			amd64_mrstore(struct mem_range_softc *sc);
-static void			amd64_mrstoreone(void *arg);
-static struct mem_range_desc	*amd64_mtrrfixsearch(struct mem_range_softc *sc,
-						    u_int64_t addr);
-static int			amd64_mrsetlow(struct mem_range_softc *sc,
-					      struct mem_range_desc *mrd,
-					      int *arg);
-static int			amd64_mrsetvariable(struct mem_range_softc *sc,
-						   struct mem_range_desc *mrd,
-						   int *arg);
+static struct mem_range_desc *mem_range_match(struct mem_range_softc *sc,
+		    struct mem_range_desc *mrd);
+static void	amd64_mrfetch(struct mem_range_softc *sc);
+static int	amd64_mtrrtype(int flags);
+static int	amd64_mrt2mtrr(int flags, int oldval);
+static int	amd64_mtrrconflict(int flag1, int flag2);
+static void	amd64_mrstore(struct mem_range_softc *sc);
+static void	amd64_mrstoreone(void *arg);
+static struct mem_range_desc *amd64_mtrrfixsearch(struct mem_range_softc *sc,
+		    u_int64_t addr);
+static int	amd64_mrsetlow(struct mem_range_softc *sc,
+		    struct mem_range_desc *mrd, int *arg);
+static int	amd64_mrsetvariable(struct mem_range_softc *sc,
+		    struct mem_range_desc *mrd, int *arg);
 
 /* amd64 MTRR type to memory range type conversion */
 static int amd64_mtrrtomrt[] = {
-    MDF_UNCACHEABLE,
-    MDF_WRITECOMBINE,
-    MDF_UNKNOWN,
-    MDF_UNKNOWN,
-    MDF_WRITETHROUGH,
-    MDF_WRITEPROTECT,
-    MDF_WRITEBACK
+	MDF_UNCACHEABLE,
+	MDF_WRITECOMBINE,
+	MDF_UNKNOWN,
+	MDF_UNKNOWN,
+	MDF_WRITETHROUGH,
+	MDF_WRITEPROTECT,
+	MDF_WRITEBACK
 };
 
-#define MTRRTOMRTLEN (sizeof(amd64_mtrrtomrt) / sizeof(amd64_mtrrtomrt[0]))
-
-/*
- * Used in /dev/mem drivers and elsewhere
- */
-MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors");
+#define	MTRRTOMRTLEN (sizeof(amd64_mtrrtomrt) / sizeof(amd64_mtrrtomrt[0]))
 
 static int
 amd64_mtrr2mrt(int val)
 {
+
 	if (val < 0 || val >= MTRRTOMRTLEN)
-		return MDF_UNKNOWN;
-	return amd64_mtrrtomrt[val];
+		return (MDF_UNKNOWN);
+	return (amd64_mtrrtomrt[val]);
 }
 
-/* 
+/*
  * amd64 MTRR conflicts. Writeback and uncachable may overlap.
  */
 static int
 amd64_mtrrconflict(int flag1, int flag2)
 {
+
 	flag1 &= MDF_ATTRMASK;
 	flag2 &= MDF_ATTRMASK;
 	if ((flag1 & MDF_UNKNOWN) || (flag2 & MDF_UNKNOWN))
-		return 1;
+		return (1);
 	if (flag1 == flag2 ||
 	    (flag1 == MDF_WRITEBACK && flag2 == MDF_UNCACHEABLE) ||
 	    (flag2 == MDF_WRITEBACK && flag1 == MDF_UNCACHEABLE))
-		return 0;
-	return 1;
+		return (0);
+	return (1);
 }
 
 /*
  * Look for an exactly-matching range.
  */
 static struct mem_range_desc *
-mem_range_match(struct mem_range_softc *sc, struct mem_range_desc *mrd) 
+mem_range_match(struct mem_range_softc *sc, struct mem_range_desc *mrd)
 {
-    struct mem_range_desc	*cand;
-    int				i;
-	
-    for (i = 0, cand = sc->mr_desc; i < sc->mr_ndesc; i++, cand++)
-	if ((cand->mr_base == mrd->mr_base) &&
-	    (cand->mr_len == mrd->mr_len))
-	    return(cand);
-    return(NULL);
+	struct mem_range_desc *cand;
+	int i;
+
+	for (i = 0, cand = sc->mr_desc; i < sc->mr_ndesc; i++, cand++)
+		if ((cand->mr_base == mrd->mr_base) &&
+		    (cand->mr_len == mrd->mr_len))
+			return (cand);
+	return (NULL);
 }
 
 /*
- * Fetch the current mtrr settings from the current CPU (assumed to all
- * be in sync in the SMP case).  Note that if we are here, we assume
- * that MTRRs are enabled, and we may or may not have fixed MTRRs.
+ * Fetch the current mtrr settings from the current CPU (assumed to
+ * all be in sync in the SMP case).  Note that if we are here, we
+ * assume that MTRRs are enabled, and we may or may not have fixed
+ * MTRRs.
  */
 static void
 amd64_mrfetch(struct mem_range_softc *sc)
 {
-    struct mem_range_desc	*mrd;
-    u_int64_t			msrv;
-    int				i, j, msr;
+	struct mem_range_desc *mrd;
+	u_int64_t msrv;
+	int i, j, msr;
 
-    mrd = sc->mr_desc;
+	mrd = sc->mr_desc;
 
-    /* Get fixed-range MTRRs */
-    if (sc->mr_cap & MR686_FIXMTRR) {
-	msr = MSR_MTRR64kBase;
-	for (i = 0; i < (MTRR_N64K / 8); i++, msr++) {
-	    msrv = rdmsr(msr);
-	    for (j = 0; j < 8; j++, mrd++) {
-		mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-		    amd64_mtrr2mrt(msrv & 0xff) |
-		    MDF_ACTIVE;
-		if (mrd->mr_owner[0] == 0)
-		    strcpy(mrd->mr_owner, mem_owner_bios);
-		msrv = msrv >> 8;
-	    }
+	/* Get fixed-range MTRRs. */
+	if (sc->mr_cap & MR686_FIXMTRR) {
+		msr = MSR_MTRR64kBase;
+		for (i = 0; i < (MTRR_N64K / 8); i++, msr++) {
+			msrv = rdmsr(msr);
+			for (j = 0; j < 8; j++, mrd++) {
+				mrd->mr_flags =
+				    (mrd->mr_flags & ~MDF_ATTRMASK) |
+				    amd64_mtrr2mrt(msrv & 0xff) | MDF_ACTIVE;
+				if (mrd->mr_owner[0] == 0)
+					strcpy(mrd->mr_owner, mem_owner_bios);
+				msrv = msrv >> 8;
+			}
+		}
+		msr = MSR_MTRR16kBase;
+		for (i = 0; i < (MTRR_N16K / 8); i++, msr++) {
+			msrv = rdmsr(msr);
+			for (j = 0; j < 8; j++, mrd++) {
+				mrd->mr_flags =
+				    (mrd->mr_flags & ~MDF_ATTRMASK) |
+				    amd64_mtrr2mrt(msrv & 0xff) | MDF_ACTIVE;
+				if (mrd->mr_owner[0] == 0)
+					strcpy(mrd->mr_owner, mem_owner_bios);
+				msrv = msrv >> 8;
+			}
+		}
+		msr = MSR_MTRR4kBase;
+		for (i = 0; i < (MTRR_N4K / 8); i++, msr++) {
+			msrv = rdmsr(msr);
+			for (j = 0; j < 8; j++, mrd++) {
+				mrd->mr_flags =
+				    (mrd->mr_flags & ~MDF_ATTRMASK) |
+				    amd64_mtrr2mrt(msrv & 0xff) | MDF_ACTIVE;
+				if (mrd->mr_owner[0] == 0)
+					strcpy(mrd->mr_owner, mem_owner_bios);
+				msrv = msrv >> 8;
+			}
+		}
 	}
-	msr = MSR_MTRR16kBase;
-	for (i = 0; i < (MTRR_N16K / 8); i++, msr++) {
-	    msrv = rdmsr(msr);
-	    for (j = 0; j < 8; j++, mrd++) {
+
+	/* Get remainder which must be variable MTRRs. */
+	msr = MSR_MTRRVarBase;
+	for (; (mrd - sc->mr_desc) < sc->mr_ndesc; msr += 2, mrd++) {
+		msrv = rdmsr(msr);
 		mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-		    amd64_mtrr2mrt(msrv & 0xff) |
-		    MDF_ACTIVE;
-		if (mrd->mr_owner[0] == 0)
-		    strcpy(mrd->mr_owner, mem_owner_bios);
-		msrv = msrv >> 8;
-	    }
+		    amd64_mtrr2mrt(msrv & MTRR_PHYSBASE_TYPE);
+		mrd->mr_base = msrv & mtrr_physmask;
+		msrv = rdmsr(msr + 1);
+		mrd->mr_flags = (msrv & MTRR_PHYSMASK_VALID) ?
+		    (mrd->mr_flags | MDF_ACTIVE) :
+		    (mrd->mr_flags & ~MDF_ACTIVE);
+
+		/* Compute the range from the mask. Ick. */
+		mrd->mr_len = (~(msrv & mtrr_physmask) &
+		    (mtrr_physmask | 0xfffL)) + 1;
+		if (!mrvalid(mrd->mr_base, mrd->mr_len))
+			mrd->mr_flags |= MDF_BOGUS;
+
+		/* If unclaimed and active, must be the BIOS. */
+		if ((mrd->mr_flags & MDF_ACTIVE) && (mrd->mr_owner[0] == 0))
+			strcpy(mrd->mr_owner, mem_owner_bios);
 	}
-	msr = MSR_MTRR4kBase;
-	for (i = 0; i < (MTRR_N4K / 8); i++, msr++) {
-	    msrv = rdmsr(msr);
-	    for (j = 0; j < 8; j++, mrd++) {
-		mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-		    amd64_mtrr2mrt(msrv & 0xff) |
-		    MDF_ACTIVE;
-		if (mrd->mr_owner[0] == 0)
-		    strcpy(mrd->mr_owner, mem_owner_bios);
-		msrv = msrv >> 8;
-	    }
-	}
-    }
-
-    /* Get remainder which must be variable MTRRs */
-    msr = MSR_MTRRVarBase;
-    for (; (mrd - sc->mr_desc) < sc->mr_ndesc; msr += 2, mrd++) {
-	msrv = rdmsr(msr);
-	mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-	    amd64_mtrr2mrt(msrv & 0xff);
-	mrd->mr_base = msrv & 0x000000fffffff000L;
-	msrv = rdmsr(msr + 1);
-	mrd->mr_flags = (msrv & 0x800) ? 
-	    (mrd->mr_flags | MDF_ACTIVE) :
-	    (mrd->mr_flags & ~MDF_ACTIVE);
-	/* Compute the range from the mask. Ick. */
-	mrd->mr_len = (~(msrv & 0x000000fffffff000L) & 0x000000ffffffffffL) + 1;
-	if (!mrvalid(mrd->mr_base, mrd->mr_len))
-	    mrd->mr_flags |= MDF_BOGUS;
-	/* If unclaimed and active, must be the BIOS */
-	if ((mrd->mr_flags & MDF_ACTIVE) && (mrd->mr_owner[0] == 0))
-	    strcpy(mrd->mr_owner, mem_owner_bios);
-    }
 }
 
 /*
@@ -239,17 +241,17 @@
 static int
 amd64_mtrrtype(int flags)
 {
-    int		i;
+	int i;
 
-    flags &= MDF_ATTRMASK;
+	flags &= MDF_ATTRMASK;
 
-    for (i = 0; i < MTRRTOMRTLEN; i++) {
-	if (amd64_mtrrtomrt[i] == MDF_UNKNOWN)
-	    continue;
-	if (flags == amd64_mtrrtomrt[i])
-	    return(i);
-    }
-    return(-1);
+	for (i = 0; i < MTRRTOMRTLEN; i++) {
+		if (amd64_mtrrtomrt[i] == MDF_UNKNOWN)
+			continue;
+		if (flags == amd64_mtrrtomrt[i])
+			return (i);
+	}
+	return (-1);
 }
 
 static int
@@ -258,8 +260,8 @@
 	int val;
 
 	if ((val = amd64_mtrrtype(flags)) == -1)
-		return oldval & 0xff;
-	return val & 0xff;
+		return (oldval & 0xff);
+	return (val & 0xff);
 }
 
 /*
@@ -272,105 +274,124 @@
 amd64_mrstore(struct mem_range_softc *sc)
 {
 #ifdef SMP
-    /*
-     * We should use ipi_all_but_self() to call other CPUs into a 
-     * locking gate, then call a target function to do this work.
-     * The "proper" solution involves a generalised locking gate
-     * implementation, not ready yet.
-     */
-    smp_rendezvous(NULL, amd64_mrstoreone, NULL, (void *)sc);
+	/*
+	 * We should use ipi_all_but_self() to call other CPUs into a
+	 * locking gate, then call a target function to do this work.
+	 * The "proper" solution involves a generalised locking gate
+	 * implementation, not ready yet.
+	 */
+	smp_rendezvous(NULL, amd64_mrstoreone, NULL, sc);
 #else
-    disable_intr();				/* disable interrupts */
-    amd64_mrstoreone((void *)sc);
-    enable_intr();
+	disable_intr();				/* disable interrupts */
+	amd64_mrstoreone(sc);
+	enable_intr();
 #endif
 }
 
 /*
  * Update the current CPU's MTRRs with those represented in the
- * descriptor list.  Note that we do this wholesale rather than
- * just stuffing one entry; this is simpler (but slower, of course).
+ * descriptor list.  Note that we do this wholesale rather than just
+ * stuffing one entry; this is simpler (but slower, of course).
  */
 static void
 amd64_mrstoreone(void *arg)
 {
-    struct mem_range_softc 	*sc = (struct mem_range_softc *)arg;
-    struct mem_range_desc	*mrd;
-    u_int64_t			omsrv, msrv;
-    int				i, j, msr;
-    u_int			cr4save;
+	struct mem_range_softc *sc = arg;
+	struct mem_range_desc *mrd;
+	u_int64_t omsrv, msrv;
+	int i, j, msr;
+	u_int cr4save;
+
+	mrd = sc->mr_desc;
+
+	/* Disable PGE. */
+	cr4save = rcr4();
+	if (cr4save & CR4_PGE)
+		load_cr4(cr4save & ~CR4_PGE);
+
+	/* Disable caches (CD = 1, NW = 0). */
+	load_cr0((rcr0() & ~CR0_NW) | CR0_CD);
 
-    mrd = sc->mr_desc;
+	/* Flushes caches and TLBs. */
+	wbinvd();
 
-    cr4save = rcr4();				/* save cr4 */
-    if (cr4save & CR4_PGE)
-	load_cr4(cr4save & ~CR4_PGE);
-    load_cr0((rcr0() & ~CR0_NW) | CR0_CD);	/* disable caches (CD = 1, NW = 0) */
-    wbinvd();					/* flush caches, TLBs */
-    wrmsr(MSR_MTRRdefType, rdmsr(MSR_MTRRdefType) & ~0x800);	/* disable MTRRs (E = 0) */
+	/* Disable MTRRs (E = 0). */
+	wrmsr(MSR_MTRRdefType, rdmsr(MSR_MTRRdefType) & ~MTRR_DEF_ENABLE);
 
-    /* Set fixed-range MTRRs */
-    if (sc->mr_cap & MR686_FIXMTRR) {
-	msr = MSR_MTRR64kBase;
-	for (i = 0; i < (MTRR_N64K / 8); i++, msr++) {
-	    msrv = 0;
-	    omsrv = rdmsr(msr);
-	    for (j = 7; j >= 0; j--) {
-		msrv = msrv << 8;
-		msrv |= amd64_mrt2mtrr((mrd + j)->mr_flags, omsrv >> (j*8));
-	    }
-	    wrmsr(msr, msrv);
-	    mrd += 8;
+	/* Set fixed-range MTRRs. */
+	if (sc->mr_cap & MR686_FIXMTRR) {
+		msr = MSR_MTRR64kBase;
+		for (i = 0; i < (MTRR_N64K / 8); i++, msr++) {
+			msrv = 0;
+			omsrv = rdmsr(msr);
+			for (j = 7; j >= 0; j--) {
+				msrv = msrv << 8;
+				msrv |= amd64_mrt2mtrr((mrd + j)->mr_flags,
+				    omsrv >> (j * 8));
+			}
+			wrmsr(msr, msrv);
+			mrd += 8;
+		}
+		msr = MSR_MTRR16kBase;
+		for (i = 0; i < (MTRR_N16K / 8); i++, msr++) {
+			msrv = 0;
+			omsrv = rdmsr(msr);
+			for (j = 7; j >= 0; j--) {
+				msrv = msrv << 8;
+				msrv |= amd64_mrt2mtrr((mrd + j)->mr_flags,
+				    omsrv >> (j * 8));
+			}
+			wrmsr(msr, msrv);
+			mrd += 8;
+		}
+		msr = MSR_MTRR4kBase;
+		for (i = 0; i < (MTRR_N4K / 8); i++, msr++) {
+			msrv = 0;
+			omsrv = rdmsr(msr);
+			for (j = 7; j >= 0; j--) {
+				msrv = msrv << 8;
+				msrv |= amd64_mrt2mtrr((mrd + j)->mr_flags,
+				    omsrv >> (j * 8));
+			}
+			wrmsr(msr, msrv);
+			mrd += 8;
+		}
 	}
-	msr = MSR_MTRR16kBase;
-	for (i = 0; i < (MTRR_N16K / 8); i++, msr++) {
-	    msrv = 0;
-	    omsrv = rdmsr(msr);
-	    for (j = 7; j >= 0; j--) {
-		msrv = msrv << 8;
-		msrv |= amd64_mrt2mtrr((mrd + j)->mr_flags, omsrv >> (j*8));
-	    }
-	    wrmsr(msr, msrv);
-	    mrd += 8;
+
+	/* Set remainder which must be variable MTRRs. */
+	msr = MSR_MTRRVarBase;
+	for (; (mrd - sc->mr_desc) < sc->mr_ndesc; msr += 2, mrd++) {
+		/* base/type register */
+		omsrv = rdmsr(msr);
+		if (mrd->mr_flags & MDF_ACTIVE) {
+			msrv = mrd->mr_base & mtrr_physmask;
+			msrv |= amd64_mrt2mtrr(mrd->mr_flags, omsrv);
+		} else {
+			msrv = 0;
+		}
+		wrmsr(msr, msrv);
+
+		/* mask/active register */
+		if (mrd->mr_flags & MDF_ACTIVE) {
+			msrv = MTRR_PHYSMASK_VALID |
+			    (~(mrd->mr_len - 1) & mtrr_physmask);
+		} else {
+			msrv = 0;
+		}
+		wrmsr(msr + 1, msrv);
 	}
-	msr = MSR_MTRR4kBase;
-	for (i = 0; i < (MTRR_N4K / 8); i++, msr++) {
-	    msrv = 0;
-	    omsrv = rdmsr(msr);
-	    for (j = 7; j >= 0; j--) {
-		msrv = msrv << 8;
-		msrv |= amd64_mrt2mtrr((mrd + j)->mr_flags, omsrv >> (j*8));
-	    }
-	    wrmsr(msr, msrv);
-	    mrd += 8;
-	}
-    }
+
+	/* Flush caches, TLBs. */
+	wbinvd();
+
+	/* Enable MTRRs. */
+	wrmsr(MSR_MTRRdefType, rdmsr(MSR_MTRRdefType) | MTRR_DEF_ENABLE);
+
+	/* Enable caches (CD = 0, NW = 0). */
+	load_cr0(rcr0() & ~(CR0_CD | CR0_NW));
 
-    /* Set remainder which must be variable MTRRs */
-    msr = MSR_MTRRVarBase;
-    for (; (mrd - sc->mr_desc) < sc->mr_ndesc; msr += 2, mrd++) {
-	/* base/type register */
-	omsrv = rdmsr(msr);
-	if (mrd->mr_flags & MDF_ACTIVE) {
-	    msrv = mrd->mr_base & 0x000000fffffff000L;
-	    msrv |= amd64_mrt2mtrr(mrd->mr_flags, omsrv);
-	} else {
-	    msrv = 0;
-	}
-	wrmsr(msr, msrv);	
-	    
-	/* mask/active register */
-	if (mrd->mr_flags & MDF_ACTIVE) {
-	    msrv = 0x800 | (~(mrd->mr_len - 1) & 0x000000fffffff000L);
-	} else {
-	    msrv = 0;
-	}
-	wrmsr(msr + 1, msrv);
-    }
-    wbinvd();							/* flush caches, TLBs */
-    wrmsr(MSR_MTRRdefType, rdmsr(MSR_MTRRdefType) | 0x800);	/* restore MTRR state */
-    load_cr0(rcr0() & ~(CR0_CD | CR0_NW));  			/* enable caches CD = 0 and NW = 0 */
-    load_cr4(cr4save);						/* restore cr4 */
+	/* Restore PGE. */
+	load_cr4(cr4save);
 }
 
 /*
@@ -379,227 +400,260 @@
 static struct mem_range_desc *
 amd64_mtrrfixsearch(struct mem_range_softc *sc, u_int64_t addr)
 {
-    struct mem_range_desc *mrd;
-    int			i;
-    
-    for (i = 0, mrd = sc->mr_desc; i < (MTRR_N64K + MTRR_N16K + MTRR_N4K); i++, mrd++)
-	if ((addr >= mrd->mr_base) && (addr < (mrd->mr_base + mrd->mr_len)))
-	    return(mrd);
-    return(NULL);
+	struct mem_range_desc *mrd;
+	int i;
+
+	for (i = 0, mrd = sc->mr_desc; i < (MTRR_N64K + MTRR_N16K + MTRR_N4K);
+	     i++, mrd++)
+		if ((addr >= mrd->mr_base) &&
+		    (addr < (mrd->mr_base + mrd->mr_len)))
+			return (mrd);
+	return (NULL);
 }
 
 /*
- * Try to satisfy the given range request by manipulating the fixed MTRRs that
- * cover low memory.
+ * Try to satisfy the given range request by manipulating the fixed
+ * MTRRs that cover low memory.
  *
- * Note that we try to be generous here; we'll bloat the range out to the 
- * next higher/lower boundary to avoid the consumer having to know too much
- * about the mechanisms here.
+ * Note that we try to be generous here; we'll bloat the range out to
+ * the next higher/lower boundary to avoid the consumer having to know
+ * too much about the mechanisms here.
  *
- * XXX note that this will have to be updated when we start supporting "busy" ranges.
+ * XXX note that this will have to be updated when we start supporting
+ * "busy" ranges.
  */
 static int
 amd64_mrsetlow(struct mem_range_softc *sc, struct mem_range_desc *mrd, int *arg)
 {
-    struct mem_range_desc	*first_md, *last_md, *curr_md;
+	struct mem_range_desc *first_md, *last_md, *curr_md;
+
+	/* Range check. */
+	if (((first_md = amd64_mtrrfixsearch(sc, mrd->mr_base)) == NULL) ||
+	    ((last_md = amd64_mtrrfixsearch(sc, mrd->mr_base + mrd->mr_len - 1)) == NULL))
+		return (EINVAL);
 
-    /* range check */
-    if (((first_md = amd64_mtrrfixsearch(sc, mrd->mr_base)) == NULL) ||
-	((last_md = amd64_mtrrfixsearch(sc, mrd->mr_base + mrd->mr_len - 1)) == NULL))
-	return(EINVAL);
+	/* Check that we aren't doing something risky. */
+	if (!(mrd->mr_flags & MDF_FORCE))
+		for (curr_md = first_md; curr_md <= last_md; curr_md++) {
+			if ((curr_md->mr_flags & MDF_ATTRMASK) == MDF_UNKNOWN)
+				return (EACCES);
+		}
 
-    /* check we aren't doing something risky */
-    if (!(mrd->mr_flags & MDF_FORCE))
+	/* Set flags, clear set-by-firmware flag. */
 	for (curr_md = first_md; curr_md <= last_md; curr_md++) {
-	    if ((curr_md->mr_flags & MDF_ATTRMASK) == MDF_UNKNOWN)
-		return (EACCES);
+		curr_md->mr_flags = mrcopyflags(curr_md->mr_flags &
+		    ~MDF_FIRMWARE, mrd->mr_flags);
+		bcopy(mrd->mr_owner, curr_md->mr_owner, sizeof(mrd->mr_owner));
 	}
 
-    /* set flags, clear set-by-firmware flag */
-    for (curr_md = first_md; curr_md <= last_md; curr_md++) {
-	curr_md->mr_flags = mrcopyflags(curr_md->mr_flags & ~MDF_FIRMWARE, mrd->mr_flags);
-	bcopy(mrd->mr_owner, curr_md->mr_owner, sizeof(mrd->mr_owner));
-    }
-
-    return(0);
+	return (0);
 }
 
-
 /*
  * Modify/add a variable MTRR to satisfy the request.
  *
  * XXX needs to be updated to properly support "busy" ranges.
  */
 static int
-amd64_mrsetvariable(struct mem_range_softc *sc, struct mem_range_desc *mrd, int *arg)
+amd64_mrsetvariable(struct mem_range_softc *sc, struct mem_range_desc *mrd,
+    int *arg)
 {
-    struct mem_range_desc	*curr_md, *free_md;
-    int				i;
-    
-    /* 
-     * Scan the currently active variable descriptors, look for 
-     * one we exactly match (straight takeover) and for possible
-     * accidental overlaps.
-     * Keep track of the first empty variable descriptor in case we
-     * can't perform a takeover.
-     */
-    i = (sc->mr_cap & MR686_FIXMTRR) ? MTRR_N64K + MTRR_N16K + MTRR_N4K : 0;
-    curr_md = sc->mr_desc + i;
-    free_md = NULL;
-    for (; i < sc->mr_ndesc; i++, curr_md++) {
-	if (curr_md->mr_flags & MDF_ACTIVE) {
-	    /* exact match? */
-	    if ((curr_md->mr_base == mrd->mr_base) &&
-		(curr_md->mr_len == mrd->mr_len)) {
-		/* whoops, owned by someone */
-		if (curr_md->mr_flags & MDF_BUSY)
-		    return(EBUSY);
-		/* check we aren't doing something risky */
-		if (!(mrd->mr_flags & MDF_FORCE) &&
-		  ((curr_md->mr_flags & MDF_ATTRMASK) == MDF_UNKNOWN))
-		    return (EACCES);
-		/* Ok, just hijack this entry */
-		free_md = curr_md;
-		break;
-	    }
-	    /* non-exact overlap ? */
-	    if (mroverlap(curr_md, mrd)) {
-		/* between conflicting region types? */
-		if (amd64_mtrrconflict(curr_md->mr_flags, mrd->mr_flags))
-		    return(EINVAL);
-	    }
-	} else if (free_md == NULL) {
-	    free_md = curr_md;
+	struct mem_range_desc *curr_md, *free_md;
+	int i;
+
+	/*
+	 * Scan the currently active variable descriptors, look for
+	 * one we exactly match (straight takeover) and for possible
+	 * accidental overlaps.
+	 *
+	 * Keep track of the first empty variable descriptor in case
+	 * we can't perform a takeover.
+	 */
+	i = (sc->mr_cap & MR686_FIXMTRR) ? MTRR_N64K + MTRR_N16K + MTRR_N4K : 0;
+	curr_md = sc->mr_desc + i;
+	free_md = NULL;
+	for (; i < sc->mr_ndesc; i++, curr_md++) {
+		if (curr_md->mr_flags & MDF_ACTIVE) {
+			/* Exact match? */
+			if ((curr_md->mr_base == mrd->mr_base) &&
+			    (curr_md->mr_len == mrd->mr_len)) {
+
+				/* Whoops, owned by someone. */
+				if (curr_md->mr_flags & MDF_BUSY)
+					return (EBUSY);
+
+				/* Check that we aren't doing something risky */
+				if (!(mrd->mr_flags & MDF_FORCE) &&
+				    ((curr_md->mr_flags & MDF_ATTRMASK) ==
+				    MDF_UNKNOWN))
+					return (EACCES);
+
+				/* Ok, just hijack this entry. */
+				free_md = curr_md;
+				break;
+			}
+
+			/* Non-exact overlap? */
+			if (mroverlap(curr_md, mrd)) {
+				/* Between conflicting region types? */
+				if (amd64_mtrrconflict(curr_md->mr_flags,
+				    mrd->mr_flags))
+					return (EINVAL);
+			}
+		} else if (free_md == NULL) {
+			free_md = curr_md;
+		}
 	}
-    }
-    /* got somewhere to put it? */
-    if (free_md == NULL)
-	return(ENOSPC);
+
+	/* Got somewhere to put it? */
+	if (free_md == NULL)
+		return (ENOSPC);
 
-    /* Set up new descriptor */
-    free_md->mr_base = mrd->mr_base;
-    free_md->mr_len = mrd->mr_len;
-    free_md->mr_flags = mrcopyflags(MDF_ACTIVE, mrd->mr_flags);
-    bcopy(mrd->mr_owner, free_md->mr_owner, sizeof(mrd->mr_owner));
-    return(0);
+	/* Set up new descriptor. */
+	free_md->mr_base = mrd->mr_base;
+	free_md->mr_len = mrd->mr_len;

>>> TRUNCATED FOR MAIL (1000 lines) <<<



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