Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
NEMU
提交
98701fe9
N
NEMU
项目概览
OpenXiangShan
/
NEMU
9 个月 前同步成功
通知
7
Star
171
Fork
67
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
NEMU
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
98701fe9
编写于
11月 02, 2020
作者:
L
LinJiawei
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'xs' into xs-fpu
上级
b4bf1c03
c23548d6
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
56 addition
and
4 deletion
+56
-4
include/isa.h
include/isa.h
+3
-0
include/isa/riscv64.h
include/isa/riscv64.h
+3
-1
src/isa/riscv64/difftest/difftest.h
src/isa/riscv64/difftest/difftest.h
+1
-0
src/isa/riscv64/difftest/ref.c
src/isa/riscv64/difftest/ref.c
+10
-0
src/isa/riscv64/exec/amo.h
src/isa/riscv64/exec/amo.h
+11
-0
src/isa/riscv64/mmu.c
src/isa/riscv64/mmu.c
+19
-2
src/isa/riscv64/reg.c
src/isa/riscv64/reg.c
+1
-1
src/monitor/difftest/ref.c
src/monitor/difftest/ref.c
+8
-0
未找到文件。
include/isa.h
浏览文件 @
98701fe9
...
...
@@ -14,6 +14,7 @@ void init_isa();
// reg
extern
CPU_state
cpu
;
extern
rtlreg_t
csr_array
[
4096
];
void
isa_reg_display
();
word_t
isa_reg_str2val
(
const
char
*
name
,
bool
*
success
);
...
...
@@ -41,6 +42,8 @@ void isa_difftest_setregs(const void *r);
void
isa_difftest_raise_intr
(
word_t
NO
);
void
isa_difftest_get_mastatus
(
void
*
s
);
void
isa_difftest_set_mastatus
(
const
void
*
s
);
void
isa_difftest_get_csr
(
void
*
c
);
void
isa_difftest_set_csr
(
const
void
*
c
);
vaddr_t
isa_disambiguate_exec
(
void
*
disambiguate_para
);
bool
isa_difftest_microarchitectural_pf_check
(
vaddr_t
addr
);
...
...
include/isa/riscv64.h
浏览文件 @
98701fe9
...
...
@@ -12,11 +12,13 @@
#define riscv64_PMEM_BASE 0x80000000
// #define ENABLE_DISAMBIGUATE
//
#define FORCE_RAISE_PF
#define FORCE_RAISE_PF
// reg
struct
DisambiguationState
{
uint64_t
exceptionNo
;
uint64_t
mtval
;
uint64_t
stval
;
};
typedef
struct
{
...
...
src/isa/riscv64/difftest/difftest.h
浏览文件 @
98701fe9
...
...
@@ -9,6 +9,7 @@ void isa_difftest_setregs_hook(void);
struct
SyncState
{
uint64_t
lrscValid
;
uint64_t
lrscAddr
;
};
#endif
src/isa/riscv64/difftest/ref.c
浏览文件 @
98701fe9
...
...
@@ -63,12 +63,22 @@ void isa_difftest_setregs(const void *r) {
void
isa_difftest_get_mastatus
(
void
*
s
)
{
struct
SyncState
ms
;
ms
.
lrscValid
=
cpu
.
lr_valid
;
ms
.
lrscAddr
=
cpu
.
lr_addr
;
memcpy
(
s
,
&
ms
,
sizeof
(
struct
SyncState
));
}
void
isa_difftest_set_mastatus
(
const
void
*
s
)
{
struct
SyncState
*
ms
=
(
struct
SyncState
*
)
s
;
cpu
.
lr_valid
=
ms
->
lrscValid
;
cpu
.
lr_addr
=
ms
->
lrscAddr
;
}
void
isa_difftest_set_csr
(
const
void
*
c
)
{
memcpy
(
csr_array
,
c
,
4096
*
sizeof
(
rtlreg_t
));
}
void
isa_difftest_get_csr
(
void
*
c
)
{
memcpy
(
c
,
csr_array
,
4096
*
sizeof
(
rtlreg_t
));
}
void
isa_difftest_raise_intr
(
word_t
NO
)
{
...
...
src/isa/riscv64/exec/amo.h
浏览文件 @
98701fe9
...
...
@@ -13,6 +13,17 @@ static inline make_EHelper(lr) {
static
inline
make_EHelper
(
sc
)
{
// should check overlapping instead of equality
// printf("sc: cpu.lr_addr %lx (%lx) addr %lx\n", cpu.lr_addr, cpu.lr_valid, *dsrc1);
// Even if scInvalid, SPF (if raised) also needs to be reported
{
int
ret
=
isa_vaddr_check
(
*
dsrc1
,
MEM_TYPE_WRITE
,
s
->
width
);
if
(
ret
==
MEM_RET_OK
);
// pass
else
if
(
ret
==
MEM_RET_NEED_TRANSLATE
)
if
(
isa_mmu_translate
(
*
dsrc1
,
MEM_TYPE_WRITE
,
s
->
width
)
==
MEM_RET_FAIL
)
return_on_mem_ex
();
}
if
(
cpu
.
lr_addr
==
*
dsrc1
&&
cpu
.
lr_valid
)
{
rtl_sm
(
s
,
dsrc1
,
0
,
dsrc2
,
s
->
width
);
return_on_mem_ex
();
...
...
src/isa/riscv64/mmu.c
浏览文件 @
98701fe9
...
...
@@ -104,12 +104,14 @@ static paddr_t ptw(vaddr_t vaddr, int type) {
pg_base
=
(
pg_base
&
~
pg_mask
)
|
(
vaddr
&
pg_mask
&
~
PGMASK
);
}
#if !_SHARE
bool
is_write
=
(
type
==
MEM_TYPE_WRITE
);
if
(
!
pte
.
a
||
(
!
pte
.
d
&&
is_write
))
{
pte
.
a
=
true
;
pte
.
d
|=
is_write
;
paddr_write
(
p_pte
,
pte
.
val
,
PTE_SIZE
);
}
#endif
return
pg_base
|
MEM_RET_OK
;
}
...
...
@@ -119,8 +121,23 @@ int force_raise_pf(vaddr_t vaddr, int type){
if
(
cpu
.
need_disambiguate
){
if
(
ifetch
&&
cpu
.
disambiguation_state
.
exceptionNo
==
EX_IPF
){
if
(
cpu
.
mode
==
MODE_M
)
mtval
->
val
=
vaddr
;
stval
->
val
=
vaddr
;
if
(
cpu
.
mode
==
MODE_M
)
{
mtval
->
val
=
cpu
.
disambiguation_state
.
mtval
;
if
(
vaddr
!=
cpu
.
disambiguation_state
.
mtval
){
printf
(
"[WRANING] nemu mtval %lx does not match core mtval %lx
\n
"
,
vaddr
,
cpu
.
disambiguation_state
.
mtval
);
}
}
else
{
stval
->
val
=
cpu
.
disambiguation_state
.
stval
;
if
(
vaddr
!=
cpu
.
disambiguation_state
.
stval
){
printf
(
"[WRANING] nemu stval %lx does not match core stval %lx
\n
"
,
vaddr
,
cpu
.
disambiguation_state
.
stval
);
}
}
cpu
.
mem_exception
=
EX_IPF
;
printf
(
"force raise IPF
\n
"
);
return
MEM_RET_FAIL
;
...
...
src/isa/riscv64/reg.c
浏览文件 @
98701fe9
...
...
@@ -60,7 +60,7 @@ rtlreg_t isa_reg_str2val(const char *s, bool *success) {
return
0
;
}
static
word
_t
csr_array
[
4096
]
=
{};
rtlreg
_t
csr_array
[
4096
]
=
{};
#define CSRS_DEF(name, addr) \
concat(name, _t)* const name = (void *)&csr_array[addr];
...
...
src/monitor/difftest/ref.c
浏览文件 @
98701fe9
...
...
@@ -29,6 +29,14 @@ void difftest_set_mastatus(const void *s){
isa_difftest_set_mastatus
(
s
);
}
void
difftest_get_csr
(
void
*
c
){
isa_difftest_get_csr
(
c
);
}
void
difftest_set_csr
(
const
void
*
c
){
isa_difftest_set_csr
(
c
);
}
vaddr_t
disambiguate_exec
(
void
*
disambiguate_para
){
return
isa_disambiguate_exec
(
disambiguate_para
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录