From 885ee22f9a800fcec7f577794cd149710920c1fe Mon Sep 17 00:00:00 2001 From: Zihao Yu Date: Fri, 6 Mar 2020 13:57:38 +0800 Subject: [PATCH] *-nemu: refactor phyiscal address space for vme --- am/src/nemu/common/trm.c | 4 ++-- am/src/nemu/include/nemu.h | 8 +++++++- am/src/nemu/isa/mips/boot/loader.ld | 2 ++ am/src/nemu/isa/riscv/boot/loader.ld | 2 ++ am/src/nemu/isa/riscv/boot/loader64.ld | 2 ++ am/src/nemu/isa/riscv/vme.c | 9 ++++----- am/src/nemu/isa/x86/boot/loader.ld | 2 ++ am/src/nemu/isa/x86/vme.c | 3 +-- am/src/nemu/ldscript/section.ld | 3 ++- 9 files changed, 24 insertions(+), 11 deletions(-) diff --git a/am/src/nemu/common/trm.c b/am/src/nemu/common/trm.c index 385626c3..50086ce7 100644 --- a/am/src/nemu/common/trm.c +++ b/am/src/nemu/common/trm.c @@ -1,13 +1,13 @@ #include +#include #include // common part of TMR extern char _heap_start; -extern char _heap_end; int main(const char *args); -_Area _heap = RANGE(&_heap_start, &_heap_end); +_Area _heap = RANGE(&_heap_start, &_pmem_end); void _trm_init() { extern const char __am_mainargs; diff --git a/am/src/nemu/include/nemu.h b/am/src/nemu/include/nemu.h index 671eafe6..f10e7864 100644 --- a/am/src/nemu/include/nemu.h +++ b/am/src/nemu/include/nemu.h @@ -33,10 +33,16 @@ # define FB_ADDR 0xa0000000 #endif -#define PMEM_SIZE (128 * 1024 * 1024) #define PGSIZE 4096 #define MMIO_BASE 0xa0000000 #define MMIO_SIZE 0x10000000 +extern char _pmem_start, _pmem_end; + +#define NEMU_PADDR_SPACE \ + RANGE(&_pmem_start, &_pmem_end), \ + RANGE(0xa0000000, 0xa0000000 + 0x80000), /* vmem */ \ + RANGE(0xa1000000, 0xa1000000 + 0x1000) /* serial, rtc, screen, keyboard */ + #endif diff --git a/am/src/nemu/isa/mips/boot/loader.ld b/am/src/nemu/isa/mips/boot/loader.ld index def85875..721df3c2 100644 --- a/am/src/nemu/isa/mips/boot/loader.ld +++ b/am/src/nemu/isa/mips/boot/loader.ld @@ -1,3 +1,5 @@ +pmem_base = 0x80000000; + MEMORY { ram (rwxa) : ORIGIN = 0x80100000, LENGTH = 128M } diff --git a/am/src/nemu/isa/riscv/boot/loader.ld b/am/src/nemu/isa/riscv/boot/loader.ld index def85875..721df3c2 100644 --- a/am/src/nemu/isa/riscv/boot/loader.ld +++ b/am/src/nemu/isa/riscv/boot/loader.ld @@ -1,3 +1,5 @@ +pmem_base = 0x80000000; + MEMORY { ram (rwxa) : ORIGIN = 0x80100000, LENGTH = 128M } diff --git a/am/src/nemu/isa/riscv/boot/loader64.ld b/am/src/nemu/isa/riscv/boot/loader64.ld index f6399388..dd97bafa 100644 --- a/am/src/nemu/isa/riscv/boot/loader64.ld +++ b/am/src/nemu/isa/riscv/boot/loader64.ld @@ -1,3 +1,5 @@ +pmem_base = 0x80000000; + MEMORY { ram (rwxa) : ORIGIN = 0x80000000, LENGTH = 128M } diff --git a/am/src/nemu/isa/riscv/vme.c b/am/src/nemu/isa/riscv/vme.c index 896922b6..b91b83fd 100644 --- a/am/src/nemu/isa/riscv/vme.c +++ b/am/src/nemu/isa/riscv/vme.c @@ -7,9 +7,7 @@ static void (*pgfree_usr)(void*) = NULL; static int vme_enable = 0; static const _Area segments[] = { // Kernel memory mappings - RANGE(0x80000000, 0x80000000 + PMEM_SIZE), - RANGE(0xa1000000, 0xa1000000 + 0x1000), // serial, rtc, screen, keyboard - RANGE(0xa0000000, 0xa0000000 + 0x80000), // vmem + NEMU_PADDR_SPACE, #if __riscv_xlen == 64 RANGE(0xa2000000, 0xa2000000 + 0x10000), // clint #endif @@ -85,10 +83,11 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) { PTE *pg_base = as->ptr; PTE *pte; int level; - for (level = PTW_CONFIG.ptw_level - 1; level >= 0; level --) { + for (level = PTW_CONFIG.ptw_level - 1; ; level --) { pte = &pg_base[VPNi(PTW_CONFIG, (uintptr_t)va, level)]; pg_base = (PTE *)PTE_ADDR(*pte); - if (level != 0 && !(*pte & PTE_V)) { + if (level == 0) break; + if (!(*pte & PTE_V)) { pg_base = pgalloc_usr(PGSIZE); *pte = PTE_V | (PN(pg_base) << 10); } diff --git a/am/src/nemu/isa/x86/boot/loader.ld b/am/src/nemu/isa/x86/boot/loader.ld index e1cc601d..171a68ea 100644 --- a/am/src/nemu/isa/x86/boot/loader.ld +++ b/am/src/nemu/isa/x86/boot/loader.ld @@ -1,3 +1,5 @@ +pmem_base = 0x0; + MEMORY { ram (rwxa) : ORIGIN = 0x100000, LENGTH = 128M } diff --git a/am/src/nemu/isa/x86/vme.c b/am/src/nemu/isa/x86/vme.c index 9762a054..f27761f8 100644 --- a/am/src/nemu/isa/x86/vme.c +++ b/am/src/nemu/isa/x86/vme.c @@ -25,8 +25,7 @@ static void (*pgfree_usr)(void*) = NULL; static int vme_enable = 0; static _Area segments[] = { // Kernel memory mappings - RANGE(0, PMEM_SIZE), - RANGE(MMIO_BASE, MMIO_BASE + MMIO_SIZE), + NEMU_PADDR_SPACE, }; #define USER_SPACE RANGE(0x40000000, 0xc0000000) diff --git a/am/src/nemu/ldscript/section.ld b/am/src/nemu/ldscript/section.ld index 623506c9..d059a043 100644 --- a/am/src/nemu/ldscript/section.ld +++ b/am/src/nemu/ldscript/section.ld @@ -28,5 +28,6 @@ SECTIONS { end = .; _end = .; _heap_start = ALIGN(0x1000); - _heap_end = ORIGIN(ram) + LENGTH(ram); + _pmem_start = pmem_base; + _pmem_end = _pmem_start + LENGTH(ram); }