Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
nexus-am
提交
3f2d7d7c
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,发现更多精彩内容 >>
未验证
提交
3f2d7d7c
编写于
2月 05, 2023
作者:
B
bugGenerator
提交者:
GitHub
2月 05, 2023
浏览文件
操作
浏览文件
下载
差异文件
tests: add riscv64 ppn access fault test (#29)
上级
7a156413
1e2b038e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
103 addition
and
1 deletion
+103
-1
am/am.h
am/am.h
+3
-0
am/src/nemu/isa/riscv/vme.c
am/src/nemu/isa/riscv/vme.c
+31
-0
tests/amtest/src/main.c
tests/amtest/src/main.c
+1
-0
tests/amtest/src/tests/sv39.c
tests/amtest/src/tests/sv39.c
+68
-1
未找到文件。
am/am.h
浏览文件 @
3f2d7d7c
...
...
@@ -86,6 +86,9 @@ void _unprotect(_AddressSpace *as);
void
_map
(
_AddressSpace
*
as
,
void
*
va
,
void
*
pa
,
int
prot
);
_Context
*
_ucontext
(
_AddressSpace
*
as
,
_Area
kstack
,
void
*
entry
);
// a fault map for xiangshan testing access fault
void
_map_fault
(
_AddressSpace
*
as
,
void
*
va
,
void
*
pa
,
int
prot
);
// hugepage map for xiangshan testing
void
_map_rv_hugepage
(
_AddressSpace
*
as
,
void
*
va
,
void
*
pa
,
int
prot
,
int
pagetable_level
);
...
...
am/src/nemu/isa/riscv/vme.c
浏览文件 @
3f2d7d7c
...
...
@@ -172,6 +172,37 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) {
}
}
/*
* A wrong map to test access fault, high bits of ppn is not zero
* Only available for sv39 and paddr = 36! (ppnlen can not be changed)
*/
void
_map_fault
(
_AddressSpace
*
as
,
void
*
va
,
void
*
pa
,
int
prot
)
{
assert
((
uintptr_t
)
va
%
PGSIZE
==
0
);
assert
((
uintptr_t
)
pa
%
PGSIZE
==
0
);
PTE
*
pg_base
=
as
->
ptr
;
PTE
*
pte
;
int
level
;
uintptr_t
max
=
1
;
for
(
int
i
=
0
;
i
<
20
;
i
++
){
max
*=
2
;
}
uintptr_t
randnum
=
rand
()
%
(
max
-
1
);
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
)
break
;
if
(
!
(
*
pte
&
PTE_V
))
{
pg_base
=
new_page
();
*
pte
=
PTE_V
|
(
PN
(
pg_base
)
<<
10
);
}
}
if
(
!
(
*
pte
&
PTE_V
))
{
*
pte
=
PTE_V
|
prot
|
(
PN
(
pa
)
<<
10
)
|
(
randnum
<<
34
);
}
}
/*
* map va to pa with prot permission with page table root as
* pagetable_level indicates page table level to be used
...
...
tests/amtest/src/main.c
浏览文件 @
3f2d7d7c
...
...
@@ -38,6 +38,7 @@ int main(const char *args) {
CASE
(
'c'
,
pmp_test
,
CTE
(
simple_trap
));
CASE
(
's'
,
sv39_test
,
IOE
,
CTE
(
simple_trap
));
CASE
(
'f'
,
sv39_hp_atom_test
,
IOE
,
CTE
(
simple_trap
));
CASE
(
'g'
,
sv39_ppn_af_test
,
IOE
,
CTE
(
simple_trap
))
CASE
(
'b'
,
cache_test
);
CASE
(
'r'
,
rtc_accuracy_test
);
case
'H'
:
...
...
tests/amtest/src/tests/sv39.c
浏览文件 @
3f2d7d7c
...
...
@@ -27,7 +27,7 @@ volatile uint64_t store_access_fault_to_be_reported = 0;
inline
int
inst_is_compressed
(
uint64_t
addr
){
uint8_t
byte
=
*
(
uint8_t
*
)
addr
;
return
(
byte
&
0x3
)
!=
0x3
;
return
(
byte
&
0x3
)
!=
0x3
;
}
_Context
*
store_page_fault_handler
(
_Event
*
ev
,
_Context
*
c
)
{
...
...
@@ -135,6 +135,73 @@ void sv39_test() {
_halt
(
0
);
}
/*
* RISC-V 64 SV39 raise access fault when high 20 bits of ppn is not zero
*/
void
sv39_ppn_af_test
()
{
printf
(
"start sv39 test
\n
"
);
_vme_init
(
sv39_pgalloc
,
sv39_pgfree
);
printf
(
"sv39 setup done
\n
"
);
#if defined(__ARCH_RISCV64_NOOP) || defined(__ARCH_RISCV32_NOOP) || defined(__ARCH_RISCV64_XS)
_map
(
&
kas
,
(
void
*
)
0x900000000UL
,
(
void
*
)
0x80020000
,
PTE_W
|
PTE_R
|
PTE_A
|
PTE_D
);
_map
(
&
kas
,
(
void
*
)
0xa00000000UL
,
(
void
*
)
0x80020000
,
PTE_W
|
PTE_R
|
PTE_A
|
PTE_D
);
uint64_t
addr
=
0xb00000000UL
;
for
(
int
i
=
0
;
i
<
100
;
i
++
)
{
_map_fault
(
&
kas
,
(
void
*
)(
addr
+
0x1000
*
i
),
(
void
*
)
0x80020000
,
PTE_W
|
PTE_R
|
PTE_A
|
PTE_D
);
}
printf
(
"memory map done
\n
"
);
char
*
w_ptr
=
(
char
*
)(
0xa00000000UL
);
char
*
r_ptr
=
(
char
*
)(
0x900000000UL
);
char
*
fault_ptr
[
100
]
=
{
0
};
for
(
int
i
=
0
;
i
<
100
;
i
++
)
{
fault_ptr
[
i
]
=
(
char
*
)(
addr
+
0x1000
*
i
);
}
#elif defined(__ARCH_RISCV64_XS_SOUTHLAKE) || defined(__ARCH_RISCV64_XS_SOUTHLAKE_FLASH)
_map
(
&
kas
,
(
void
*
)
0x2100000000UL
,
(
void
*
)
0x2000020000
,
PTE_W
|
PTE_R
|
PTE_A
|
PTE_D
);
_map
(
&
kas
,
(
void
*
)
0x2200000000UL
,
(
void
*
)
0x2000020000
,
PTE_W
|
PTE_R
|
PTE_A
|
PTE_D
);
uint64_t
addr
=
0x2300000000UL
;
for
(
int
i
=
0
;
i
<
100
;
i
++
)
{
_map_fault
(
&
kas
,
(
void
*
)(
addr
+
0x1000
*
i
),
(
void
*
)
0x2000020000
,
PTE_W
|
PTE_R
|
PTE_A
|
PTE_D
);
}
printf
(
"memory map done
\n
"
);
char
*
w_ptr
=
(
char
*
)(
0x2100000000UL
);
char
*
r_ptr
=
(
char
*
)(
0x2200000000UL
);
char
*
fault_ptr
[
100
]
=
{
0
};
for
(
int
i
=
0
;
i
<
100
;
i
++
)
{
fault_ptr
[
i
]
=
(
char
*
)(
addr
+
0x1000
*
i
);
}}
#else
// invalid arch
_halt
(
1
);
#endif
irq_handler_reg
(
EXCEPTION_STORE_ACCESS_FAULT
,
&
store_access_fault_handler
);
irq_handler_reg
(
EXCEPTION_LOAD_ACCESS_FAULT
,
&
load_access_fault_handler
);
asm
volatile
(
"sfence.vma"
);
printf
(
"test sv39 data write
\n
"
);
*
w_ptr
=
'a'
;
printf
(
"test sv39 data read
\n
"
);
assert
(
*
r_ptr
==
'a'
);
for
(
int
i
=
0
;
i
<
100
;
i
++
)
{
printf
(
"test sv39 store access fault %d
\n
"
,
i
);
store_access_fault_to_be_reported
=
1
;
*
fault_ptr
[
i
]
=
'b'
;
if
(
store_access_fault_to_be_reported
){
_halt
(
1
);
}
printf
(
"test sv39 load access fault %d
\n
"
,
i
);
load_access_fault_to_be_reported
=
1
;
*
w_ptr
=
*
fault_ptr
[
i
];
if
(
load_access_fault_to_be_reported
){
_halt
(
1
);
}
}
_halt
(
0
);
}
/*
* RISC-V 64 SV39 Hugepage + Hugepage Atom Inst test
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录