Auto-size kernel page tables allocation on Marvell systems.
This allows mini dumps to fully work for these platforms. Obtained from: Juniper Networks, Semihalf
This commit is contained in:
parent
8e321b7943
commit
71f00bea66
@ -93,9 +93,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
#define debugf(fmt, args...)
|
#define debugf(fmt, args...)
|
||||||
#endif
|
#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
|
* This is the number of L2 page tables required for covering max
|
||||||
* (hypothetical) memsize of 4GB and all kernel mappings (vectors, msgbuf,
|
* (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;
|
struct bi_mem_region *mr;
|
||||||
void *kmdp;
|
void *kmdp;
|
||||||
u_int l1pagetable;
|
u_int l1pagetable;
|
||||||
int i = 0;
|
int i = 0, j = 0;
|
||||||
|
|
||||||
kmdp = NULL;
|
kmdp = NULL;
|
||||||
lastaddr = 0;
|
lastaddr = 0;
|
||||||
@ -465,13 +462,14 @@ initarm(void *mdp, void *unused __unused)
|
|||||||
if (!(i % (PAGE_SIZE / L2_TABLE_SIZE_REAL))) {
|
if (!(i % (PAGE_SIZE / L2_TABLE_SIZE_REAL))) {
|
||||||
valloc_pages(kernel_pt_table[i],
|
valloc_pages(kernel_pt_table[i],
|
||||||
L2_TABLE_SIZE / PAGE_SIZE);
|
L2_TABLE_SIZE / PAGE_SIZE);
|
||||||
|
j = i;
|
||||||
} else {
|
} else {
|
||||||
kernel_pt_table[i].pv_va = freemempos -
|
kernel_pt_table[i].pv_va = kernel_pt_table[j].pv_va +
|
||||||
(i % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) *
|
L2_TABLE_SIZE_REAL * (i - j);
|
||||||
L2_TABLE_SIZE_REAL;
|
|
||||||
kernel_pt_table[i].pv_pa =
|
kernel_pt_table[i].pv_pa =
|
||||||
kernel_pt_table[i].pv_va - KERNVIRTADDR +
|
kernel_pt_table[i].pv_va - KERNVIRTADDR +
|
||||||
KERNPHYSADDR;
|
KERNPHYSADDR;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -506,7 +504,7 @@ initarm(void *mdp, void *unused __unused)
|
|||||||
l2_start = lastaddr & ~(L1_S_OFFSET);
|
l2_start = lastaddr & ~(L1_S_OFFSET);
|
||||||
for (i = 0 ; i < l2size - 1; i++)
|
for (i = 0 ; i < l2size - 1; i++)
|
||||||
pmap_link_l2pt(l1pagetable, l2_start + i * L1_S_SIZE,
|
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;
|
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 */
|
/* Link and map the vector page */
|
||||||
pmap_link_l2pt(l1pagetable, ARM_VECTORS_HIGH,
|
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,
|
pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH, systempage.pv_pa,
|
||||||
VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
|
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);
|
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
|
||||||
|
|
||||||
dump_avail[0] = KERNPHYSADDR;
|
dump_avail[0] = 0;
|
||||||
dump_avail[1] = KERNPHYSADDR + memsize;
|
dump_avail[1] = memsize;
|
||||||
dump_avail[2] = 0;
|
dump_avail[2] = 0;
|
||||||
dump_avail[3] = 0;
|
dump_avail[3] = 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user