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>