PERFORCE change 149474 for review
Rafal Jaworowski
raj at FreeBSD.org
Tue Sep 9 13:18:58 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=149474
Change 149474 by raj at raj_mimi on 2008/09/09 13:18:50
Dynamically calculate the number of required L2 tables in initarm().
This lets the mv_machdep.c better handle varying sizes of system DRAM.
Obtained from: Marvell, Semihalf
Affected files ...
.. //depot/projects/arm/src/sys/arm/mv/mv_machdep.c#3 edit
Differences ...
==== //depot/projects/arm/src/sys/arm/mv/mv_machdep.c#3 (text+ko) ====
@@ -89,8 +89,12 @@
#define KERNEL_PT_SYS 0 /* Page table for mapping proc0 zero page */
#define KERNEL_PT_KERN 1
-/* This should be evenly divisable by PAGE_SIZE / L2_TABLE_SIZE_REAL (or 4) */
-#define NUM_KERNEL_PTS 8
+/*
+ * This is the number of L2 page tables required for covering max
+ * (hypothetical) memsize of 4GB and all kernel mappings (vectors, msgbuf,
+ * stacks etc.), uprounded to be divisible by 4.
+ */
+#define KERNEL_PT_MAX 78
/* Define various stack sizes in pages */
#define IRQ_STACK_SIZE 1
@@ -104,7 +108,7 @@
extern const struct pmap_devmap *pmap_devmap_bootstrap_table;
extern vm_offset_t pmap_bootstrap_lastaddr;
-struct pv_addr kernel_pt_table[NUM_KERNEL_PTS];
+struct pv_addr kernel_pt_table[KERNEL_PT_MAX];
extern void *_end;
extern int *end;
@@ -136,7 +140,7 @@
vm_offset_t freemempos;
vm_offset_t l2_start;
vm_offset_t lastaddr;
- uint32_t memsize;
+ uint32_t memsize, l2size;
boothowto = RB_VERBOSE | RB_SINGLE;
@@ -150,6 +154,21 @@
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
+ memsize = platform_ramsize();
+
+ /* Calculate number of L2 tables needed for mapping vm_page_array */
+ l2size = (memsize / PAGE_SIZE) * sizeof(struct vm_page);
+ l2size = (l2size >> L1_S_SHIFT) + 1;
+
+ /*
+ * Add one table for end of kernel map, one for stacks, msgbuf and
+ * L1 and L2 tables map and one for vectors map.
+ */
+ l2size += 3;
+
+ /* Make it divisible by 4 */
+ l2size = (l2size + 3) & ~3;
+
#define KERNEL_TEXT_BASE (KERNBASE)
freemempos = (lastaddr + PAGE_MASK) & ~PAGE_MASK;
@@ -167,7 +186,7 @@
freemempos += PAGE_SIZE;
valloc_pages(kernel_l1pt, L1_TABLE_SIZE / PAGE_SIZE);
- for (i = 0; i < NUM_KERNEL_PTS; ++i) {
+ for (i = 0; i < l2size; ++i) {
if (!(i % (PAGE_SIZE / L2_TABLE_SIZE_REAL))) {
valloc_pages(kernel_pt_table[i],
L2_TABLE_SIZE / PAGE_SIZE);
@@ -210,11 +229,11 @@
* and kernel structures
*/
l2_start = lastaddr & ~(L1_S_OFFSET);
- for (i = 0 ; i < NUM_KERNEL_PTS - 1; i++)
+ for (i = 0 ; i < l2size - 1; i++)
pmap_link_l2pt(l1pagetable, l2_start + i * L1_S_SIZE,
&kernel_pt_table[KERNEL_PT_KERN + i]);
- pmap_curmaxkvaddr = l2_start + NUM_KERNEL_PTS * L1_S_SIZE;
+ pmap_curmaxkvaddr = l2_start + (l2size - 1) * L1_S_SIZE;
/* Map kernel code and data */
pmap_map_chunk(l1pagetable, KERNVIRTADDR, KERNPHYSADDR,
@@ -228,7 +247,7 @@
pmap_map_chunk(l1pagetable, kernel_pt_table[0].pv_va,
kernel_pt_table[0].pv_pa,
- L2_TABLE_SIZE_REAL * NUM_KERNEL_PTS,
+ L2_TABLE_SIZE_REAL * l2size,
VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
/* Map allocated stacks and msgbuf */
@@ -249,7 +268,6 @@
cpu_tlb_flushID();
cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL * 2));
cninit();
- memsize = platform_ramsize();
physmem = memsize / PAGE_SIZE;
/*
More information about the p4-projects
mailing list