Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
NEMU
提交
5beb8194
N
NEMU
项目概览
OpenXiangShan
/
NEMU
大约 1 年 前同步成功
通知
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,发现更多精彩内容 >>
提交
5beb8194
编写于
10月 11, 2019
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'riscv64-sv39' into 'rv64'
Riscv64 sv39 See merge request projectn/nemu!17
上级
7bd56bb6
803f67e5
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
40 addition
and
27 deletion
+40
-27
src/isa/riscv64/clint.c
src/isa/riscv64/clint.c
+1
-1
src/isa/riscv64/mmu.c
src/isa/riscv64/mmu.c
+39
-26
未找到文件。
src/isa/riscv64/clint.c
浏览文件 @
5beb8194
...
...
@@ -2,7 +2,7 @@
#include "device/alarm.h"
#include "device/map.h"
#define CLINT_MMIO 0x2000000
#define CLINT_MMIO 0x
a
2000000
#define CLINT_MTIMECMP (0x4000 / sizeof(clint_base[0]))
#define CLINT_MTIME (0xBFF8 / sizeof(clint_base[0]))
...
...
src/isa/riscv64/mmu.c
浏览文件 @
5beb8194
...
...
@@ -2,7 +2,6 @@
#include "memory/memory.h"
#include "csr.h"
/* the 32bit Page Table Entry(second level page table) data structure */
typedef
union
PageTableEntry
{
struct
{
uint32_t
valid
:
1
;
...
...
@@ -14,57 +13,71 @@ typedef union PageTableEntry {
uint32_t
access
:
1
;
uint32_t
dirty
:
1
;
uint32_t
rsw
:
2
;
uint32_t
ppn
:
22
;
uint64_t
ppn
:
44
;
uint32_t
pad
:
10
;
};
uint
32
_t
val
;
uint
64
_t
val
;
}
PTE
;
typedef
union
{
struct
{
uint32_t
pf_off
:
12
;
uint32_t
pt_idx
:
10
;
uint32_t
pdir_idx
:
10
;
uint64_t
pf_off
:
12
;
uint64_t
vpn0
:
9
;
uint64_t
vpn1
:
9
;
uint64_t
vpn2
:
9
;
};
uint
32
_t
addr
;
uint
64
_t
addr
;
}
PageAddr
;
static
paddr_t
page_walk
(
vaddr_t
vaddr
,
bool
is_write
)
{
// Sv39 page walk
static
word_t
page_walk
(
vaddr_t
vaddr
,
bool
is_write
)
{
PageAddr
*
addr
=
(
void
*
)
&
vaddr
;
paddr
_t
pdir_base
=
satp
->
ppn
<<
12
;
word
_t
pdir_base
=
satp
->
ppn
<<
12
;
PTE
pde
;
pde
.
val
=
paddr_read
(
pdir_base
+
addr
->
pdir_idx
*
4
,
4
);
if
(
!
pde
.
valid
)
{
panic
(
"pc = %lx, vaddr = %lx, pdir_base = %x, pde = %x"
,
cpu
.
pc
,
vaddr
,
pdir_base
,
pde
.
val
);
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
);
}
paddr_t
pt_base
=
pde
.
ppn
<<
12
;
PTE
pte
;
pte
.
val
=
paddr_read
(
pt_base
+
addr
->
pt_idx
*
4
,
4
);
if
(
!
pte
.
valid
)
{
panic
(
"pc = %lx, vaddr = %lx, pt_base = %x, pte = %x"
,
cpu
.
pc
,
vaddr
,
pt_base
,
pte
.
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
);
}
if
(
!
pte
.
access
||
(
pte
.
dirty
==
0
&&
is_write
))
{
pte
.
access
=
1
;
pte
.
dirty
|=
is_write
;
paddr_write
(
pt_base
+
addr
->
pt_idx
*
4
,
pte
.
val
,
4
);
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
);
}
return
pte
.
ppn
<<
12
;
//if (!pte.access || (pte.dirty == 0 && is_write)) {
// pte.access = 1;
// pte.dirty |= is_write;
// paddr_write(pt_base + addr->pt_idx * 4, pte.val, 4);
//}
return
pte0
.
ppn
<<
12
;
}
static
inline
paddr_t
page_translate
(
vaddr_t
addr
,
bool
is_write
)
{
printf
(
"There's page translate
\n
"
);
return
page_walk
(
addr
,
is_write
)
|
(
addr
&
PAGE_MASK
);
}
word_t
isa_vaddr_read
(
vaddr_t
addr
,
int
len
)
{
paddr_t
paddr
=
(
satp
->
mode
?
page_translate
(
addr
,
false
)
:
addr
);
assert
(
satp
->
mode
==
0
||
satp
->
mode
==
4
);
paddr_t
paddr
=
(
satp
->
mode
==
4
?
page_translate
(
addr
,
false
)
:
addr
);
return
paddr_read
(
paddr
,
len
);
}
void
isa_vaddr_write
(
vaddr_t
addr
,
word_t
data
,
int
len
)
{
paddr_t
paddr
=
(
satp
->
mode
?
page_translate
(
addr
,
true
)
:
addr
);
assert
(
satp
->
mode
==
0
||
satp
->
mode
==
4
);
paddr_t
paddr
=
(
satp
->
mode
==
4
?
page_translate
(
addr
,
true
)
:
addr
);
paddr_write
(
paddr
,
data
,
len
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录