Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
NEMU
提交
b99cef93
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 搜索 >>
提交
b99cef93
编写于
2月 10, 2021
作者:
W
wangkaifan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
mmu,ifetch: fetch instr from golden mem when _SHARE=1
上级
e828daa7
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
54 addition
and
3 deletion
+54
-3
src/isa/riscv64/mmu.c
src/isa/riscv64/mmu.c
+12
-2
src/memory/paddr.c
src/memory/paddr.c
+21
-0
src/memory/vaddr.c
src/memory/vaddr.c
+21
-1
未找到文件。
src/isa/riscv64/mmu.c
浏览文件 @
b99cef93
...
...
@@ -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
;
...
...
src/memory/paddr.c
浏览文件 @
b99cef93
...
...
@@ -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
)
...
...
src/memory/vaddr.c
浏览文件 @
b99cef93
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录