PERFORCE change 137734 for review
Robert Watson
rwatson at FreeBSD.org
Fri Mar 14 18:39:46 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=137734
Change 137734 by rwatson at 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) <<<
More information about the p4-projects
mailing list