Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
NEMU
提交
2c1e4be1
N
NEMU
项目概览
OpenXiangShan
/
NEMU
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
2c1e4be1
编写于
10月 12, 2019
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
riscv64,mmu: refactor page_walk
上级
5beb8194
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
23 addition
and
34 deletion
+23
-34
src/isa/riscv64/mmu.c
src/isa/riscv64/mmu.c
+23
-34
未找到文件。
src/isa/riscv64/mmu.c
浏览文件 @
2c1e4be1
...
...
@@ -19,42 +19,31 @@ typedef union PageTableEntry {
uint64_t
val
;
}
PTE
;
typedef
union
{
struct
{
uint64_t
pf_off
:
12
;
uint64_t
vpn0
:
9
;
uint64_t
vpn1
:
9
;
uint64_t
vpn2
:
9
;
};
uint64_t
addr
;
}
PageAddr
;
#define PGSHFT 12
#define PGBASE(pn) (pn << PGSHFT)
// Sv39 page walk
static
word_t
page_walk
(
vaddr_t
vaddr
,
bool
is_write
)
{
PageAddr
*
addr
=
(
void
*
)
&
vaddr
;
word_t
pdir_base
=
satp
->
ppn
<<
12
;
PTE
pte2
;
pte2
.
val
=
paddr_read
(
pdir_base
+
addr
->
vpn2
*
8
,
8
);
if
(
!
pte2
.
valid
)
{
panic
(
"pc = "
FMT_WORD
", vaddr = "
FMT_WORD
", pdir_base = "
FMT_WORD
", pte2 = "
FMT_WORD
,
cpu
.
pc
,
vaddr
,
pdir_base
,
pte2
.
val
);
}
word_t
pt_base1
=
pte2
.
ppn
<<
12
;
PTE
pte1
;
pte1
.
val
=
paddr_read
(
pt_base1
+
addr
->
vpn1
*
8
,
8
);
if
(
!
pte1
.
valid
)
{
panic
(
"pc = "
FMT_WORD
", vaddr = "
FMT_WORD
", pt_base1 = "
FMT_WORD
", pte1 = "
FMT_WORD
,
cpu
.
pc
,
vaddr
,
pt_base1
,
pte1
.
val
);
}
#define PTW_LEVEL 3
#define PTE_SIZE 8
#define VPNMASK 0x1ff
static
inline
uintptr_t
VPNiSHFT
(
int
i
)
{
return
(
PGSHFT
)
+
9
*
i
;
}
static
inline
uintptr_t
VPNi
(
vaddr_t
va
,
int
i
)
{
return
(
va
>>
VPNiSHFT
(
i
))
&
VPNMASK
;
}
word_t
pt_base0
=
pte1
.
ppn
<<
12
;
PTE
pte0
;
pte0
.
val
=
paddr_read
(
pt_base0
+
addr
->
vpn0
*
8
,
8
);
if
(
!
pte0
.
valid
)
{
panic
(
"pc = "
FMT_WORD
", vaddr = "
FMT_WORD
", pt_base0 = "
FMT_WORD
", pte0 = "
FMT_WORD
,
cpu
.
pc
,
vaddr
,
pt_base0
,
pte0
.
val
);
static
word_t
page_walk
(
vaddr_t
vaddr
,
bool
is_write
)
{
word_t
pg_base
=
PGBASE
(
satp
->
ppn
);
PTE
pte
;
int
level
;
for
(
level
=
PTW_LEVEL
-
1
;
level
>=
0
;
level
--
)
{
pte
.
val
=
paddr_read
(
pg_base
+
VPNi
(
vaddr
,
level
)
*
PTE_SIZE
,
PTE_SIZE
);
if
(
!
pte
.
valid
)
{
panic
(
"level %d: pc = "
FMT_WORD
", vaddr = "
FMT_WORD
", pg_base = "
FMT_WORD
", pte = "
FMT_WORD
,
level
,
cpu
.
pc
,
vaddr
,
pg_base
,
pte
.
val
);
}
pg_base
=
PGBASE
(
pte
.
ppn
);
}
//if (!pte.access || (pte.dirty == 0 && is_write)) {
...
...
@@ -63,7 +52,7 @@ static word_t page_walk(vaddr_t vaddr, bool is_write) {
// paddr_write(pt_base + addr->pt_idx * 4, pte.val, 4);
//}
return
p
te0
.
ppn
<<
12
;
return
p
g_base
;
}
static
inline
paddr_t
page_translate
(
vaddr_t
addr
,
bool
is_write
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录