*-nemu: refactor phyiscal address space for vme

This commit is contained in:
Zihao Yu 2020-03-06 13:57:38 +08:00
parent dcf9972777
commit 885ee22f9a
9 changed files with 24 additions and 11 deletions

View File

@ -1,13 +1,13 @@
#include <am.h>
#include <nemu.h>
#include <klib-macros.h>
// 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;

View File

@ -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

View File

@ -1,3 +1,5 @@
pmem_base = 0x80000000;
MEMORY {
ram (rwxa) : ORIGIN = 0x80100000, LENGTH = 128M
}

View File

@ -1,3 +1,5 @@
pmem_base = 0x80000000;
MEMORY {
ram (rwxa) : ORIGIN = 0x80100000, LENGTH = 128M
}

View File

@ -1,3 +1,5 @@
pmem_base = 0x80000000;
MEMORY {
ram (rwxa) : ORIGIN = 0x80000000, LENGTH = 128M
}

View File

@ -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);
}

View File

@ -1,3 +1,5 @@
pmem_base = 0x0;
MEMORY {
ram (rwxa) : ORIGIN = 0x100000, LENGTH = 128M
}

View File

@ -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)

View File

@ -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);
}