summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandrew <andrew@FreeBSD.org>2014-02-06 20:35:33 +0000
committerandrew <andrew@FreeBSD.org>2014-02-06 20:35:33 +0000
commitc51bf58e25e2cdb22838b0a3aa7fcf2c5a19e056 (patch)
treecb0e9426acd8b46f5718bb809852005b87302eb0
parent86e950728973438e97424fd484e4dc13c491e5a9 (diff)
downloadFreeBSD-src-c51bf58e25e2cdb22838b0a3aa7fcf2c5a19e056.zip
FreeBSD-src-c51bf58e25e2cdb22838b0a3aa7fcf2c5a19e056.tar.gz
Use abp_physaddr for the physical address over KERNPHYSADDR. This helps us
remove the need to load the kernel at a fixed address.
-rw-r--r--sys/arm/arm/machdep.c29
-rw-r--r--sys/arm/at91/at91_machdep.c3
-rw-r--r--sys/arm/econa/econa_machdep.c3
-rw-r--r--sys/arm/include/machdep.h2
-rw-r--r--sys/arm/s3c2xx0/s3c24x0_machdep.c3
-rw-r--r--sys/arm/xscale/ixp425/avila_machdep.c3
6 files changed, 24 insertions, 19 deletions
diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c
index e4b755e..0ae8725 100644
--- a/sys/arm/arm/machdep.c
+++ b/sys/arm/arm/machdep.c
@@ -788,7 +788,7 @@ makectx(struct trapframe *tf, struct pcb *pcb)
* calling pmap_bootstrap.
*/
void
-arm_dump_avail_init(vm_offset_t ramsize, size_t max)
+arm_dump_avail_init(vm_paddr_t physaddr, vm_offset_t ramsize, size_t max)
{
#ifdef LINUX_BOOT_ABI
/*
@@ -814,8 +814,8 @@ arm_dump_avail_init(vm_offset_t ramsize, size_t max)
if (max < 4)
panic("dump_avail too small\n");
- dump_avail[0] = round_page(PHYSADDR);
- dump_avail[1] = trunc_page(PHYSADDR + ramsize);
+ dump_avail[0] = round_page(physaddr);
+ dump_avail[1] = trunc_page(physaddr + ramsize);
dump_avail[2] = 0;
dump_avail[3] = 0;
}
@@ -901,7 +901,7 @@ linux_parse_boot_param(struct arm_boot_params *abp)
board_id = abp->abp_r1;
walker = (struct arm_lbabi_tag *)
- (abp->abp_r2 + KERNVIRTADDR - KERNPHYSADDR);
+ (abp->abp_r2 + KERNVIRTADDR - abp->abp_physaddr);
/* xxx - Need to also look for binary device tree */
if (ATAG_TAG(walker) != ATAG_CORE)
@@ -979,7 +979,7 @@ freebsd_parse_boot_param(struct arm_boot_params *abp)
ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
#endif
- preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
+ preload_addr_relocate = KERNVIRTADDR - abp->abp_physaddr;
return lastaddr;
}
#endif
@@ -1081,15 +1081,15 @@ print_kenv(void)
}
static void
-physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz)
+physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz,
+ vm_offset_t kernload)
{
int i, j, cnt;
- vm_offset_t phys_kernelend, kernload;
+ vm_offset_t phys_kernelend;
uint32_t s, e, sz;
struct mem_region *mp, *mp1;
- phys_kernelend = KERNPHYSADDR + (virtual_avail - KERNVIRTADDR);
- kernload = KERNPHYSADDR;
+ phys_kernelend = kernload + (virtual_avail - KERNVIRTADDR);
/*
* Remove kernel physical address range from avail
@@ -1331,7 +1331,7 @@ initarm(struct arm_boot_params *abp)
/* Define a macro to simplify memory allocation */
#define valloc_pages(var, np) \
alloc_pages((var).pv_va, (np)); \
- (var).pv_pa = (var).pv_va + (KERNPHYSADDR - KERNVIRTADDR);
+ (var).pv_pa = (var).pv_va + (abp->abp_physaddr - KERNVIRTADDR);
#define alloc_pages(var, np) \
(var) = freemempos; \
@@ -1352,7 +1352,7 @@ initarm(struct arm_boot_params *abp)
L2_TABLE_SIZE_REAL * (i - j);
kernel_pt_table[i].pv_pa =
kernel_pt_table[i].pv_va - KERNVIRTADDR +
- KERNPHYSADDR;
+ abp->abp_physaddr;
}
}
@@ -1397,7 +1397,7 @@ initarm(struct arm_boot_params *abp)
pmap_curmaxkvaddr = l2_start + (l2size - 1) * L1_S_SIZE;
/* Map kernel code and data */
- pmap_map_chunk(l1pagetable, KERNVIRTADDR, KERNPHYSADDR,
+ pmap_map_chunk(l1pagetable, KERNVIRTADDR, abp->abp_physaddr,
(((uint32_t)(lastaddr) - KERNVIRTADDR) + PAGE_MASK) & ~PAGE_MASK,
VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
@@ -1501,7 +1501,8 @@ initarm(struct arm_boot_params *abp)
arm_intrnames_init();
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
- arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+ arm_dump_avail_init(abp->abp_physaddr, memsize,
+ sizeof(dump_avail) / sizeof(dump_avail[0]));
pmap_bootstrap(freemempos, &kernel_l1pt);
msgbufp = (void *)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);
@@ -1510,7 +1511,7 @@ initarm(struct arm_boot_params *abp)
/*
* Prepare map of physical memory regions available to vm subsystem.
*/
- physmap_init(availmem_regions, availmem_regions_sz);
+ physmap_init(availmem_regions, availmem_regions_sz, abp->abp_physaddr);
init_param2(physmem);
kdb_init();
diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c
index ad38410..9e73d0c 100644
--- a/sys/arm/at91/at91_machdep.c
+++ b/sys/arm/at91/at91_machdep.c
@@ -630,7 +630,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
- arm_dump_avail_init(memsize, sizeof(dump_avail)/sizeof(dump_avail[0]));
+ arm_dump_avail_init(abp->abp_physaddr, memsize,
+ sizeof(dump_avail)/sizeof(dump_avail[0]));
/* Always use the 256MB of KVA we have available between the kernel and devices */
vm_max_kernel_address = KERNVIRTADDR + (256 << 20);
pmap_bootstrap(freemempos, &kernel_l1pt);
diff --git a/sys/arm/econa/econa_machdep.c b/sys/arm/econa/econa_machdep.c
index 04fd208..8f41494 100644
--- a/sys/arm/econa/econa_machdep.c
+++ b/sys/arm/econa/econa_machdep.c
@@ -322,7 +322,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
- arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+ arm_dump_avail_init(abp->abp_physaddr, memsize,
+ sizeof(dump_avail) / sizeof(dump_avail[0]));
vm_max_kernel_address = KERNVIRTADDR + 3 * memsize;
pmap_bootstrap(freemempos, &kernel_l1pt);
diff --git a/sys/arm/include/machdep.h b/sys/arm/include/machdep.h
index 1ea4d21..0a55849 100644
--- a/sys/arm/include/machdep.h
+++ b/sys/arm/include/machdep.h
@@ -72,6 +72,6 @@ void board_set_serial(uint64_t);
void board_set_revision(uint32_t);
/* Setup standard arrays */
-void arm_dump_avail_init( vm_offset_t memsize, size_t max);
+void arm_dump_avail_init(vm_paddr_t, vm_offset_t, size_t);
#endif /* !_MACHINE_MACHDEP_H_ */
diff --git a/sys/arm/s3c2xx0/s3c24x0_machdep.c b/sys/arm/s3c2xx0/s3c24x0_machdep.c
index e5e4968..84776e8 100644
--- a/sys/arm/s3c2xx0/s3c24x0_machdep.c
+++ b/sys/arm/s3c2xx0/s3c24x0_machdep.c
@@ -384,7 +384,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + 0x100000 * (KERNEL_PT_KERN_NUM - 1);
- arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+ arm_dump_avail_init(abp->abp_physaddr, memsize,
+ sizeof(dump_avail) / sizeof(dump_avail[0]));
vm_max_kernel_address = KERNVIRTADDR + 3 * memsize;
pmap_bootstrap(freemempos, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;
diff --git a/sys/arm/xscale/ixp425/avila_machdep.c b/sys/arm/xscale/ixp425/avila_machdep.c
index 6583cde..300b4a4 100644
--- a/sys/arm/xscale/ixp425/avila_machdep.c
+++ b/sys/arm/xscale/ixp425/avila_machdep.c
@@ -431,7 +431,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + PAGE_SIZE;
- arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+ arm_dump_avail_init(abp->abp_physaddr, memsize,
+ sizeof(dump_avail) / sizeof(dump_avail[0]));
vm_max_kernel_address = 0xe0000000;
pmap_bootstrap(pmap_curmaxkvaddr, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;
OpenPOWER on IntegriCloud