*-nemu: refactor phyiscal address space for vme
This commit is contained in:
parent
dcf9972777
commit
885ee22f9a
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
pmem_base = 0x80000000;
|
||||
|
||||
MEMORY {
|
||||
ram (rwxa) : ORIGIN = 0x80100000, LENGTH = 128M
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
pmem_base = 0x80000000;
|
||||
|
||||
MEMORY {
|
||||
ram (rwxa) : ORIGIN = 0x80100000, LENGTH = 128M
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
pmem_base = 0x80000000;
|
||||
|
||||
MEMORY {
|
||||
ram (rwxa) : ORIGIN = 0x80000000, LENGTH = 128M
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
pmem_base = 0x0;
|
||||
|
||||
MEMORY {
|
||||
ram (rwxa) : ORIGIN = 0x100000, LENGTH = 128M
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue