summaryrefslogtreecommitdiffstats
path: root/sys/riscv
diff options
context:
space:
mode:
authorbr <br@FreeBSD.org>2016-02-18 15:28:57 +0000
committerbr <br@FreeBSD.org>2016-02-18 15:28:57 +0000
commit2da7acfc0589db04743d85314ef3725d94355257 (patch)
tree2d641a22de9d48de30aee797640c95b7182142d4 /sys/riscv
parent94a9d119b90ec02be281c7d3cdc4afc367eb6585 (diff)
downloadFreeBSD-src-2da7acfc0589db04743d85314ef3725d94355257.zip
FreeBSD-src-2da7acfc0589db04743d85314ef3725d94355257.tar.gz
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
Diffstat (limited to 'sys/riscv')
-rw-r--r--sys/riscv/include/vmparam.h37
-rw-r--r--sys/riscv/riscv/locore.S1
-rw-r--r--sys/riscv/riscv/pmap.c28
3 files changed, 34 insertions, 32 deletions
diff --git a/sys/riscv/include/vmparam.h b/sys/riscv/include/vmparam.h
index 08d3c3b..4f27615 100644
--- a/sys/riscv/include/vmparam.h
+++ b/sys/riscv/include/vmparam.h
@@ -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)
/*
diff --git a/sys/riscv/riscv/locore.S b/sys/riscv/riscv/locore.S
index 8dc424e..0744167 100644
--- a/sys/riscv/riscv/locore.S
+++ b/sys/riscv/riscv/locore.S
@@ -102,7 +102,6 @@ _start:
/* finish building ring */
la t0, hardstack_end
- sub t0, t0, s11
csrw mscratch, t0
la t0, mentry
diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c
index e4ca19f..ef25b16 100644
--- a/sys/riscv/riscv/pmap.c
+++ b/sys/riscv/riscv/pmap.c
@@ -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;
OpenPOWER on IntegriCloud