Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
nexus-am
提交
8630e9cb
N
nexus-am
项目概览
OpenXiangShan
/
nexus-am
大约 1 年 前同步成功
通知
2
Star
21
Fork
25
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
nexus-am
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8630e9cb
编写于
5月 04, 2022
作者:
W
William Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
tests,riscv: update sv39 test
上级
8ed70b7f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
67 addition
and
18 deletion
+67
-18
tests/amtest/src/tests/pmp.c
tests/amtest/src/tests/pmp.c
+8
-12
tests/amtest/src/tests/sv39.c
tests/amtest/src/tests/sv39.c
+59
-6
未找到文件。
tests/amtest/src/tests/pmp.c
浏览文件 @
8630e9cb
...
...
@@ -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
tests/amtest/src/tests/sv39.c
浏览文件 @
8630e9cb
#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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录