提交 b99cef93 编写于 作者: W wangkaifan

mmu,ifetch: fetch instr from golden mem when _SHARE=1

上级 e828daa7
......@@ -86,6 +86,10 @@ void inter_read_goldenmem(paddr_t addr, void *data, uint64_t len) {
*(uint64_t*)data = inter_pmem_read(addr, len);
}
word_t read_goldenmem(paddr_t addr, uint64_t len) {
return inter_pmem_read(addr, len);
}
static paddr_t ptw(vaddr_t vaddr, int type) {
word_t pg_base = PGBASE(satp->ppn);
......@@ -95,9 +99,11 @@ static paddr_t ptw(vaddr_t vaddr, int type) {
for (level = PTW_LEVEL - 1; level >= 0;) {
p_pte = pg_base + VPNi(vaddr, level) * PTE_SIZE;
// pte.val = paddr_read(p_pte, PTE_SIZE);
assert(goldenMem != NULL);
#if _SHARE
inter_read_goldenmem(p_pte, &pte.val, PTE_SIZE);
#else
pte.val = paddr_read(p_pte, PTE_SIZE);
#endif
pg_base = PGBASE(pte.ppn);
if (!pte.v) {
......@@ -272,7 +278,11 @@ bool ptw_is_safe(vaddr_t vaddr) {
int level;
for (level = PTW_LEVEL - 1; level >= 0;) {
p_pte = pg_base + VPNi(vaddr, level) * PTE_SIZE;
#if _SHARE
inter_read_goldenmem(p_pte, &pte.val, PTE_SIZE);
#else
pte.val = paddr_read(p_pte, PTE_SIZE);
#endif
if(!is_sfence_safe(p_pte, rsize)){
// printf("[Warning] pte at %lx is not sfence safe, accessed by pc %lx\n", p_pte, cpu.pc);
return false;
......
......@@ -218,6 +218,26 @@ int check_store_commit(uint64_t *addr, uint64_t *data, uint8_t *mask) {
word_t vaddr_mmu_read(vaddr_t addr, int len, int type);
void vaddr_mmu_write(vaddr_t addr, word_t data, int len);
#if _SHARE
#define def_vaddr_template(bytes) \
word_t concat(vaddr_ifetch, bytes) (vaddr_t addr) { \
int ret = isa_vaddr_check(addr, MEM_TYPE_IFETCH, bytes); \
if (ret == MEM_RET_OK) { extern word_t read_goldenmem(paddr_t addr, uint64_t len); return read_goldenmem(addr, bytes); } \
else if (ret == MEM_RET_NEED_TRANSLATE) return vaddr_mmu_read(addr, bytes, MEM_TYPE_IFETCH); \
return 0; \
} \
word_t concat(vaddr_read, bytes) (vaddr_t addr) { \
int ret = isa_vaddr_check(addr, MEM_TYPE_READ, bytes); \
if (ret == MEM_RET_OK) return paddr_read(addr, bytes); \
else if (ret == MEM_RET_NEED_TRANSLATE) return vaddr_mmu_read(addr, bytes, MEM_TYPE_READ); \
return 0; \
} \
void concat(vaddr_write, bytes) (vaddr_t addr, word_t data) { \
int ret = isa_vaddr_check(addr, MEM_TYPE_WRITE, bytes); \
if (ret == MEM_RET_OK) paddr_write(addr, data, bytes); \
else if (ret == MEM_RET_NEED_TRANSLATE) vaddr_mmu_write(addr, data, bytes); \
}
#else
#define def_vaddr_template(bytes) \
word_t concat(vaddr_ifetch, bytes) (vaddr_t addr) { \
int ret = isa_vaddr_check(addr, MEM_TYPE_IFETCH, bytes); \
......@@ -236,6 +256,7 @@ void concat(vaddr_write, bytes) (vaddr_t addr, word_t data) { \
if (ret == MEM_RET_OK) paddr_write(addr, data, bytes); \
else if (ret == MEM_RET_NEED_TRANSLATE) vaddr_mmu_write(addr, data, bytes); \
}
#endif
def_vaddr_template(1)
def_vaddr_template(2)
......
......@@ -2,7 +2,9 @@
#include <memory/paddr.h>
#include <memory/vaddr.h>
static word_t vaddr_read_cross_page(vaddr_t addr, int type, int len) {
extern word_t read_goldenmem(paddr_t addr, uint64_t len);
word_t vaddr_read_cross_page(vaddr_t addr, int type, int len) {
word_t data = 0;
int i;
for (i = 0; i < len; i ++, addr ++) {
......@@ -10,7 +12,16 @@ static word_t vaddr_read_cross_page(vaddr_t addr, int type, int len) {
int ret = mmu_ret & PAGE_MASK;
if (ret != MEM_RET_OK) return 0;
paddr_t paddr = (mmu_ret & ~PAGE_MASK) | (addr & PAGE_MASK);
#if _SHARE
word_t byte = (type == MEM_TYPE_IFETCH ? paddr_read : paddr_read)(paddr, 1);
#else
word_t byte;
if (type == MEM_TYPE_IFETCH) {
byte = read_goldenmem(paddr, 1);
} else {
byte = paddr_read(paddr, 1);
}
#endif
data |= byte << (i << 3);
}
return data;
......@@ -33,7 +44,16 @@ word_t vaddr_mmu_read(vaddr_t addr, int len, int type) {
int ret = pg_base & PAGE_MASK;
if (ret == MEM_RET_OK) {
addr = pg_base | (addr & PAGE_MASK);
#if _SHARE
if (type == MEM_TYPE_IFETCH) {
extern word_t read_goldenmem(paddr_t addr, uint64_t len);
return read_goldenmem(addr, len);
} else {
return paddr_read(addr, len);
}
#else
return paddr_read(addr, len);
#endif
} else if (len != 1 && ret == MEM_RET_CROSS_PAGE) {
return vaddr_read_cross_page(addr, type, len);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册