提交 8630e9cb 编写于 作者: W William Wang

tests,riscv: update sv39 test

上级 8ed70b7f
......@@ -11,20 +11,13 @@
#define EXCEPTION_STORE_ACCESS_FAULT 7
uint64_t right_store_access_fault_addr = 0;
uint64_t access_fault_to_be_reported = 0;
_Context* store_access_fault_handler(_Event* ev, _Context *c) {
// printf("store access fault triggered\n");
uint64_t stval = csr_read(stval);
if (right_store_access_fault_addr == stval) {
// printf("store access fault hit addr %x\n", right_store_access_fault_addr);
printf("store access fault triggered\n");
if (access_fault_to_be_reported) {
_halt(0);
} else {
// printf("store access fault addr mismatch: right %x, wrong %x, pc %x\n",
// right_store_access_fault_addr,
// stval,
// c->sepc
// );
_halt(1); // something went wrong
}
return c;
......@@ -47,14 +40,17 @@ void pmp_test() {
*c = 1; // should trigger a fault
#endif
#elif defined(__ARCH_RISCV64_XS_SOUTHLAKE) || defined(__ARCH_RISCV64_XS_SOUTHLAKE_FLASH)
right_store_access_fault_addr = 0;
access_fault_to_be_reported = 0;
int *b = (int *)(0x2030000000UL);
*b = 1; // should not trigger a fault
right_store_access_fault_addr = 0x2010000040UL;
access_fault_to_be_reported = 1;
volatile int *a = (int *)(0x2010000040UL);
*a = 1; // should trigger a fault
printf("Store access fault not triggered\n");
_halt(1);
#else
// invalid arch
printf("invalid arch\n");
_halt(1);
#endif
}
\ No newline at end of file
#include <amtest.h>
#include <pmp.h>
#include <xsextra.h>
/*
* RISC-V 64 SV39 Virutal Memory test
*/
#define EXCEPTION_LOAD_PAGE_FAULT 13
#define EXCEPTION_STORE_PAGE_FAULT 15
#if defined(__ARCH_RISCV64_NOOP) || defined(__ARCH_RISCV32_NOOP) || defined(__ARCH_RISCV64_XS)
static char *sv39_alloc_base = (char *)(0xc0000000UL);
#elif defined(__ARCH_RISCV64_XS_SOUTHLAKE) || defined(__ARCH_RISCV64_XS_SOUTHLAKE_FLASH)
......@@ -12,6 +17,33 @@ static char *sv39_alloc_base = (char *)(0x2040000000UL);
// invalid arch
#endif
uint64_t page_fault_to_be_reported = 0;
inline int inst_is_compressed(uint64_t addr){
uint8_t byte = *(uint8_t*)addr;
return (byte | 0x3) != 0x3;
}
_Context* store_page_fault_handler(_Event* ev, _Context *c) {
printf("store page fault triggered\n");
if(!page_fault_to_be_reported){
_halt(1); // something went wrong
}
page_fault_to_be_reported = 0;
c->sepc = inst_is_compressed(c->sepc) ? c->sepc + 2: c->sepc + 4;
return c;
}
_Context* load_page_fault_handler(_Event* ev, _Context *c) {
printf("load page fault triggered\n");
if(!page_fault_to_be_reported){
_halt(1); // something went wrong
}
page_fault_to_be_reported = 0;
c->sepc = inst_is_compressed(c->sepc) ? c->sepc + 2: c->sepc + 4;
return c;
}
static uintptr_t sv39_alloced_size = 0;
void* sv39_pgalloc(size_t pg_size) {
assert(pg_size == 0x1000);
......@@ -20,11 +52,14 @@ void* sv39_pgalloc(size_t pg_size) {
sv39_alloced_size += pg_size;
return ret;
}
void sv39_pgfree(void *ptr) {
return ;
}
extern _AddressSpace kas;
#include <riscv.h>
void sv39_test() {
printf("start sv39 test\n");
_vme_init(sv39_pgalloc, sv39_pgfree);
......@@ -38,8 +73,8 @@ void sv39_test() {
char *r_ptr = (char *)(0x900000000UL);
char *fault_ptr = (char *)(0xb00000000UL);
#elif defined(__ARCH_RISCV64_XS_SOUTHLAKE) || defined(__ARCH_RISCV64_XS_SOUTHLAKE_FLASH)
_map(&kas, (void *)0x2100000000UL, (void *)0x2000020000, PTE_R | PTE_A | PTE_D);
_map(&kas, (void *)0x2200000000UL, (void *)0x2000020000, PTE_W | PTE_R | PTE_A | PTE_D);
_map(&kas, (void *)0x2100000000UL, (void *)0x2000020000, PTE_W | PTE_R | PTE_A | PTE_D);
_map(&kas, (void *)0x2200000000UL, (void *)0x2000020000, PTE_R | PTE_A | PTE_D);
_map(&kas, (void *)0x2300000000UL, (void *)0x2000020000, PTE_A | PTE_D);
printf("memory map done\n");
char *w_ptr = (char *)(0x2100000000UL);
......@@ -47,11 +82,29 @@ void sv39_test() {
char *fault_ptr = (char *)(0x2300000000UL);
#else
// invalid arch
_halt(1);
#endif
register_handler(EXCEPTION_STORE_PAGE_FAULT, &store_page_fault_handler);
register_handler(EXCEPTION_LOAD_PAGE_FAULT, &load_page_fault_handler);
printf("test sv39 data write\n");
*w_ptr = 'a';
printf("sv39 data written\n");
printf("test sv39 data read\n");
assert(*r_ptr == 'a');
printf("triggering fault\n");
*fault_ptr = 'b';
printf("should not reach here!\n");
printf("test sv39 store page fault\n");
page_fault_to_be_reported = 1;
*fault_ptr = 'b'; // store: not compressed
if(page_fault_to_be_reported){
_halt(1);
}
printf("test sv39 load page fault\n");
page_fault_to_be_reported = 1;
*w_ptr = *fault_ptr;
if(page_fault_to_be_reported){
_halt(1);
}
_halt(0);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册