svn commit: r214457 - in head/sys: amd64/amd64 conf i386/i386
x86/x86
John Baldwin
jhb at freebsd.org
Thu Oct 28 16:57:48 UTC 2010
On Thursday, October 28, 2010 12:31:39 pm Attilio Rao wrote:
> Author: attilio
> Date: Thu Oct 28 16:31:39 2010
> New Revision: 214457
> URL: http://svn.freebsd.org/changeset/base/214457
>
> Log:
> Merge nexus.c from amd64 and i386 to x86 subtree.
>
> Sponsored by: Sandvine Incorporated
> Tested by: gianni
>
> Added:
> head/sys/x86/x86/nexus.c
> - copied, changed from r214446, head/sys/i386/i386/nexus.c
> Deleted:
> head/sys/amd64/amd64/nexus.c
> head/sys/i386/i386/nexus.c
> Modified:
> head/sys/conf/files.amd64
> head/sys/conf/files.i386
> head/sys/conf/files.pc98
>
==============================================================================
> --- head/sys/conf/files.pc98 Thu Oct 28 16:23:25 2010 (r214456)
> +++ head/sys/conf/files.pc98 Thu Oct 28 16:31:39 2010 (r214457)
> @@ -156,7 +156,6 @@ i386/i386/mp_clock.c optional smp
> i386/i386/mp_machdep.c optional smp
> i386/i386/mp_watchdog.c optional mp_watchdog smp
> i386/i386/mpboot.s optional smp
> -i386/i386/nexus.c standard
> i386/i386/perfmon.c optional perfmon
> i386/i386/pmap.c standard
> i386/i386/ptrace_machdep.c standard
> @@ -259,3 +258,4 @@ x86/x86/mca.c standard
> x86/x86/mptable.c optional apic
> x86/x86/mptable_pci.c optional apic pci
> x86/x86/msi.c optional apic pci
> +x86/x86/nexus.c standard
>
> Copied and modified: head/sys/x86/x86/nexus.c (from r214446,
head/sys/i386/i386/nexus.c)
>
==============================================================================
> --- head/sys/i386/i386/nexus.c Thu Oct 28 07:58:06 2010 (r214446, copy
source)
> +++ head/sys/x86/x86/nexus.c Thu Oct 28 16:31:39 2010 (r214457)
> @@ -41,13 +41,20 @@ __FBSDID("$FreeBSD$");
> * and I/O memory address space.
> */
>
> +#ifdef __amd64__
> +#define DEV_APIC
> +#else
> #include "opt_apic.h"
> +#endif
> #include "opt_isa.h"
>
> #include <sys/param.h>
> #include <sys/systm.h>
> #include <sys/bus.h>
> #include <sys/kernel.h>
> +#ifdef __amd64__
> +#include <sys/linker.h>
> +#endif
> #include <sys/malloc.h>
> #include <sys/module.h>
> #include <machine/bus.h>
> @@ -60,6 +67,10 @@ __FBSDID("$FreeBSD$");
> #include <vm/pmap.h>
> #include <machine/pmap.h>
>
> +#ifdef __amd64__
> +#include <machine/metadata.h>
> +#include <machine/pc/bios.h>
> +#endif
> #include <machine/nexusvar.h>
> #include <machine/resource.h>
>
> @@ -77,6 +88,14 @@ __FBSDID("$FreeBSD$");
> #endif
> #include <sys/rtprio.h>
>
> +#ifdef __amd64__
> +#define RMAN_BUS_SPACE_IO AMD64_BUS_SPACE_IO
> +#define RMAN_BUS_SPACE_MEM AMD64_BUS_SPACE_MEM
> +#else
> +#define RMAN_BUS_SPACE_IO I386_BUS_SPACE_IO
> +#define RMAN_BUS_SPACE_MEM I386_BUS_SPACE_MEM
> +#endif
> +
Perhaps we should be using X86_BUS_SPACE_* instead?
> @@ -649,6 +668,42 @@ ram_probe(device_t dev)
> return (0);
> }
>
> +#ifdef __amd64__
> +static int
> +ram_attach(device_t dev)
> +{
> + struct bios_smap *smapbase, *smap, *smapend;
> + struct resource *res;
> + caddr_t kmdp;
> + uint32_t smapsize;
> + int error, rid;
> +
> + /* Retrieve the system memory map from the loader. */
> + kmdp = preload_search_by_type("elf kernel");
> + if (kmdp == NULL)
> + kmdp = preload_search_by_type("elf64 kernel");
> + smapbase = (struct bios_smap *)preload_search_info(kmdp,
> + MODINFO_METADATA | MODINFOMD_SMAP);
> + smapsize = *((u_int32_t *)smapbase - 1);
> + smapend = (struct bios_smap *)((uintptr_t)smapbase + smapsize);
> +
> + rid = 0;
> + for (smap = smapbase; smap < smapend; smap++) {
> + if (smap->type != SMAP_TYPE_MEMORY || smap->length == 0)
> + continue;
> + error = bus_set_resource(dev, SYS_RES_MEMORY, rid, smap->base,
> + smap->length);
> + if (error)
> + panic("ram_attach: resource %d failed set with %d", rid,
> + error);
> + res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 0);
> + if (res == NULL)
> + panic("ram_attach: resource %d failed to attach", rid);
> + rid++;
> + }
> + return (0);
> +}
> +#else
> static int
> ram_attach(device_t dev)
> {
> @@ -688,6 +743,7 @@ ram_attach(device_t dev)
> }
> return (0);
> }
> +#endif
It would be better to merge these two routines. The loader now passes the
smap to i386 kernels as well, so ram_attach() should probably be changed to
try the amd64 approach first and if that fails fall back to using the
phys_avail[] array instead.
--
John Baldwin
More information about the svn-src-all
mailing list