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-head mailing list