diff options
author | raj <raj@FreeBSD.org> | 2008-11-06 16:25:12 +0000 |
---|---|---|
committer | raj <raj@FreeBSD.org> | 2008-11-06 16:25:12 +0000 |
commit | bce91d33d17007416fed099102606eac35c99e0a (patch) | |
tree | 8ffb9eeb38c783db369928883eeb66c5d14d4bfe /sys/arm | |
parent | 032a270ba544a5cb29900526c3413bac480cde6d (diff) | |
download | FreeBSD-src-bce91d33d17007416fed099102606eac35c99e0a.zip FreeBSD-src-bce91d33d17007416fed099102606eac35c99e0a.tar.gz |
Auto-size kernel page tables allocation on Marvell systems.
This allows mini dumps to fully work for these platforms.
Obtained from: Juniper Networks, Semihalf
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/mv/mv_machdep.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c index fa5ddbd..5b3ea90 100644 --- a/sys/arm/mv/mv_machdep.c +++ b/sys/arm/mv/mv_machdep.c @@ -93,9 +93,6 @@ __FBSDID("$FreeBSD$"); #define debugf(fmt, args...) #endif -#define KERNEL_PT_SYS 0 /* Page table for mapping proc0 zero page */ -#define KERNEL_PT_KERN 1 - /* * This is the number of L2 page tables required for covering max * (hypothetical) memsize of 4GB and all kernel mappings (vectors, msgbuf, @@ -366,7 +363,7 @@ initarm(void *mdp, void *unused __unused) struct bi_mem_region *mr; void *kmdp; u_int l1pagetable; - int i = 0; + int i = 0, j = 0; kmdp = NULL; lastaddr = 0; @@ -465,13 +462,14 @@ initarm(void *mdp, void *unused __unused) if (!(i % (PAGE_SIZE / L2_TABLE_SIZE_REAL))) { valloc_pages(kernel_pt_table[i], L2_TABLE_SIZE / PAGE_SIZE); + j = i; } else { - kernel_pt_table[i].pv_va = freemempos - - (i % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * - L2_TABLE_SIZE_REAL; + kernel_pt_table[i].pv_va = kernel_pt_table[j].pv_va + + L2_TABLE_SIZE_REAL * (i - j); kernel_pt_table[i].pv_pa = kernel_pt_table[i].pv_va - KERNVIRTADDR + KERNPHYSADDR; + } } /* @@ -506,7 +504,7 @@ initarm(void *mdp, void *unused __unused) l2_start = lastaddr & ~(L1_S_OFFSET); for (i = 0 ; i < l2size - 1; i++) pmap_link_l2pt(l1pagetable, l2_start + i * L1_S_SIZE, - &kernel_pt_table[KERNEL_PT_KERN + i]); + &kernel_pt_table[i]); pmap_curmaxkvaddr = l2_start + (l2size - 1) * L1_S_SIZE; @@ -532,7 +530,7 @@ initarm(void *mdp, void *unused __unused) /* Link and map the vector page */ pmap_link_l2pt(l1pagetable, ARM_VECTORS_HIGH, - &kernel_pt_table[KERNEL_PT_SYS]); + &kernel_pt_table[l2size - 1]); pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH, systempage.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); @@ -603,8 +601,8 @@ initarm(void *mdp, void *unused __unused) arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); - dump_avail[0] = KERNPHYSADDR; - dump_avail[1] = KERNPHYSADDR + memsize; + dump_avail[0] = 0; + dump_avail[1] = memsize; dump_avail[2] = 0; dump_avail[3] = 0; |