Increase kernel and user VA space.

This allows us to boot with more than 128MB of physical memory.

Sponsored by:	DARPA, AFRL
Sponsored by:	HEIF5
This commit is contained in:
Ruslan Bukin 2016-02-18 15:28:57 +00:00
parent a4ed9e4f78
commit 229f3f0d9c
3 changed files with 34 additions and 32 deletions

View File

@ -43,19 +43,19 @@
* Virtual memory related constants, all in bytes
*/
#ifndef MAXTSIZ
#define MAXTSIZ (32*1024*1024) /* max text size */
#define MAXTSIZ (1*1024*1024*1024) /* max text size */
#endif
#ifndef DFLDSIZ
#define DFLDSIZ (128*1024*1024) /* initial data size limit */
#endif
#ifndef MAXDSIZ
#define MAXDSIZ (128*1024*1024) /* max data size */
#define MAXDSIZ (1*1024*1024*1024) /* max data size */
#endif
#ifndef DFLSSIZ
#define DFLSSIZ (2*1024*1024) /* initial stack size limit */
#define DFLSSIZ (128*1024*1024) /* initial stack size limit */
#endif
#ifndef MAXSSIZ
#define MAXSSIZ (8*1024*1024) /* max stack size */
#define MAXSSIZ (1*1024*1024*1024) /* max stack size */
#endif
#ifndef SGROWSIZ
#define SGROWSIZ (128*1024) /* amount to grow stack */
@ -128,12 +128,12 @@
* We limit the size of the two spaces to 39 bits each.
*
* Upper region: 0xffffffffffffffff
* 0xffffffffc0000000
* 0xffffff8000000000
*
* Hole: 0xffffffffbfffffff
* 0x0000000080000000
* Hole: 0xffffff7fffffffff
* 0x0000008000000000
*
* Lower region: 0x000000007fffffff
* Lower region: 0x0000007fffffffff
* 0x0000000000000000
*
* We use the upper region for the kernel, and the lower region for userland.
@ -152,19 +152,20 @@
#define VM_MIN_ADDRESS (0x0000000000000000UL)
#define VM_MAX_ADDRESS (0xffffffffffffffffUL)
/* 256 MiB of kernel addresses */
#define VM_MIN_KERNEL_ADDRESS (0xffffffffc0000000UL)
#define VM_MAX_KERNEL_ADDRESS (0xffffffffcfffffffUL)
/* 32 GiB of kernel addresses */
#define VM_MIN_KERNEL_ADDRESS (0xffffff8000000000UL)
#define VM_MAX_KERNEL_ADDRESS (0xffffff8800000000UL)
/* Direct Map for 512 MiB of PA: 0x0 - 0x1fffffff */
#define DMAP_MIN_ADDRESS (0xffffffffd0000000UL)
#define DMAP_MAX_ADDRESS (0xffffffffefffffffUL)
/* Direct Map for 128 GiB of PA: 0x0 - 0x1fffffffff */
#define DMAP_MIN_ADDRESS (0xffffffc000000000UL)
#define DMAP_MAX_ADDRESS (0xffffffdfffffffffUL)
#define DMAP_MIN_PHYSADDR (0x0000000000000000UL)
#define DMAP_MAX_PHYSADDR (DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS)
/* True if pa is in the dmap range */
#define PHYS_IN_DMAP(pa) ((pa) <= DMAP_MAX_PHYSADDR)
#define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \
(pa) <= DMAP_MAX_PHYSADDR)
/* True if va is in the dmap range */
#define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \
(va) <= DMAP_MAX_ADDRESS)
@ -186,13 +187,15 @@
})
#define VM_MIN_USER_ADDRESS (0x0000000000000000UL)
#define VM_MAX_USER_ADDRESS (0x0000000080000000UL)
#define VM_MAX_USER_ADDRESS (0x0000008000000000UL)
#define VM_MINUSER_ADDRESS (VM_MIN_USER_ADDRESS)
#define VM_MAXUSER_ADDRESS (VM_MAX_USER_ADDRESS)
#define KERNBASE (VM_MIN_KERNEL_ADDRESS)
#define USRSTACK (VM_MAX_USER_ADDRESS)
#define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE)
#define USRSTACK SHAREDPAGE
#define KERNENTRY (0x200)
/*

View File

@ -102,7 +102,6 @@ _start:
/* finish building ring */
la t0, hardstack_end
sub t0, t0, s11
csrw mscratch, t0
la t0, mentry

View File

@ -445,31 +445,33 @@ pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
}
static void
pmap_bootstrap_dmap(vm_offset_t l2pt)
pmap_bootstrap_dmap(vm_offset_t l1pt, vm_paddr_t kernstart)
{
vm_offset_t va;
vm_paddr_t pa;
pd_entry_t *l2;
u_int l2_slot;
pd_entry_t *l1;
u_int l1_slot;
pt_entry_t entry;
u_int pn;
pa = kernstart & ~L1_OFFSET;
va = DMAP_MIN_ADDRESS;
l2 = (pd_entry_t *)l2pt;
l2_slot = pmap_l2_index(DMAP_MIN_ADDRESS);
l1 = (pd_entry_t *)l1pt;
l1_slot = pmap_l1_index(DMAP_MIN_ADDRESS);
for (pa = 0; va < DMAP_MAX_ADDRESS; pa += L2_SIZE, va += L2_SIZE, l2_slot++) {
KASSERT(l2_slot < Ln_ENTRIES, ("Invalid L2 index"));
for (; va < DMAP_MAX_ADDRESS;
pa += L1_SIZE, va += L1_SIZE, l1_slot++) {
KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
/* superpages */
pn = ((pa >> L2_SHIFT) & Ln_ADDR_MASK);
pn = ((pa >> L1_SHIFT) & Ln_ADDR_MASK);
entry = (PTE_VALID | (PTE_TYPE_SRWX << PTE_TYPE_S));
entry |= (pn << PTE_PPN1_S);
entry |= (pn << PTE_PPN2_S);
pmap_load_store(&l2[l2_slot], entry);
pmap_load_store(&l1[l1_slot], entry);
}
cpu_dcache_wb_range((vm_offset_t)l2, PAGE_SIZE);
cpu_dcache_wb_range((vm_offset_t)l1, PAGE_SIZE);
cpu_tlb_flushID();
}
@ -485,7 +487,6 @@ pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
vm_offset_t va, freemempos;
vm_offset_t dpcpu, msgbufpv;
vm_paddr_t pa, min_pa;
vm_offset_t l2pt;
int i;
kern_delta = KERNBASE - kernstart;
@ -520,8 +521,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
}
/* Create a direct map region early so we can use it for pa -> va */
l2pt = (l1pt + PAGE_SIZE);
pmap_bootstrap_dmap(l2pt);
pmap_bootstrap_dmap(l1pt, min_pa);
va = KERNBASE;
pa = KERNBASE - kern_delta;