Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
nexus-am
提交
595efbdf
N
nexus-am
项目概览
OpenXiangShan
/
nexus-am
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
595efbdf
编写于
10月 11, 2019
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'riscv64-nemu-sv39' into 'rv64'
Riscv64 nemu sv39 See merge request projectn/nexus-am!19
上级
bf1f2f2f
a7baaf98
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
35 addition
and
58 deletion
+35
-58
am/include/riscv64.h
am/include/riscv64.h
+11
-21
am/src/riscv64/nemu/cte.c
am/src/riscv64/nemu/cte.c
+1
-1
am/src/riscv64/nemu/vme.c
am/src/riscv64/nemu/vme.c
+23
-36
未找到文件。
am/include/riscv64.h
浏览文件 @
595efbdf
...
...
@@ -29,33 +29,23 @@ static inline void outd(uintptr_t addr, uint64_t data) { *(volatile uint64_t *)a
#define PTE_X 0x08
#define PTE_U 0x10
// unmodified for cputest
// Page directory and page table constants
#define NR_PDE 1024 // # directory entries per page directory
#define NR_PTE 1024 // # PTEs per page table
#define NR_PTE 512 // # PTEs per page table
#define PGSHFT 12 // log2(PGSIZE)
#define PTXSHFT 12 // Offset of PTX in a linear address
#define PDXSHFT 22 // Offset of PDX in a linear address
// +--------10------+-------10-------+---------12----------+
// | Page Directory | Page Table | Offset within Page |
// | Index | Index | |
// +----------------+----------------+---------------------+
// \--- PDX(va) --/ \--- PTX(va) --/\------ OFF(va) ------/
typedef
uint32_t
PTE
;
typedef
uint32_t
PDE
;
#define PDX(va) (((uint64_t)(va) >> PDXSHFT) & 0x3ff)
#define PTX(va) (((uint64_t)(va) >> PTXSHFT) & 0x3ff)
#define OFF(va) ((uint64_t)(va) & 0xfff)
#define VPN0SHFT 12 // Offset of VPN0 in a virtual address
#define VPN1SHFT 21 // Offset of VPN1 in a virtual address
#define VPN2SHFT 30 // Offset of VPN2 in a virtual address
typedef
uintptr_t
PTE
;
#define PN(addr) ((uint64_t)(addr) >> PGSHFT)
#define VPN2(va) (((uint64_t)(va) >> VPN2SHFT) & 0x1ff)
#define VPN1(va) (((uint64_t)(va) >> VPN1SHFT) & 0x1ff)
#define VPN0(va) (((uint64_t)(va) >> VPN0SHFT) & 0x1ff)
#define OFF(va) ((uint64_t)(va) & (PGSIZE - 1))
// Address in page table or page directory entry
#define PTE_ADDR(pte) (((uint64_t)(pte) & ~0x3ff) << 2)
// construct virtual address from indexes and offset
#define PGADDR(d, t, o) ((uint64_t)((d) << PDXSHFT | (t) << PTXSHFT | (o)))
#endif
#endif
am/src/riscv64/nemu/cte.c
浏览文件 @
595efbdf
...
...
@@ -4,7 +4,7 @@
#include <riscv64.h>
#include <klib.h>
#define CLINT_MMIO 0x2000000
#define CLINT_MMIO 0x
a
2000000
#define CLINT_MTIMECMP (CLINT_MMIO + 0x4000)
#define CLINT_MTIME (CLINT_MMIO + 0xbff8)
#define TIME_INC 0x800
...
...
am/src/riscv64/nemu/vme.c
浏览文件 @
595efbdf
// unmodified for cputest
#include <riscv64.h>
#include <nemu.h>
#include <klib.h>
#define PG_ALIGN __attribute((aligned(PGSIZE)))
static
PDE
kpdirs
[
NR_PDE
]
PG_ALIGN
=
{};
static
PTE
kptabs
[(
PMEM_SIZE
+
MMIO_SIZE
)
/
PGSIZE
]
PG_ALIGN
=
{};
static
_AddressSpace
kas
;
// Kernel address space
static
void
*
(
*
pgalloc_usr
)(
size_t
)
=
NULL
;
static
void
(
*
pgfree_usr
)(
void
*
)
=
NULL
;
static
int
vme_enable
=
0
;
...
...
@@ -20,50 +17,37 @@ static _Area segments[] = { // Kernel memory mappings
#define NR_KSEG_MAP (sizeof(segments) / sizeof(segments[0]))
static
inline
void
set_satp
(
void
*
pdir
)
{
asm
volatile
(
"csrw satp, %0"
:
:
"r"
(
0x80000000
|
((
uintptr_t
)
pdir
>>
12
)));
uintptr_t
mode
=
4ull
<<
60
;
asm
volatile
(
"csrw satp, %0"
:
:
"r"
(
mode
|
PN
(
pdir
)));
}
int
_vme_init
(
void
*
(
*
pgalloc_f
)(
size_t
),
void
(
*
pgfree_f
)(
void
*
))
{
pgalloc_usr
=
pgalloc_f
;
pgfree_usr
=
pgfree_f
;
// make all PDEs invalid
int
i
;
for
(
i
=
0
;
i
<
NR_PDE
;
i
++
)
{
kpdirs
[
i
]
=
0
;
}
kas
.
ptr
=
pgalloc_f
(
1
);
// make all PTEs invalid
memset
(
kas
.
ptr
,
0
,
PGSIZE
);
PTE
*
ptab
=
kptabs
;
int
i
;
for
(
i
=
0
;
i
<
NR_KSEG_MAP
;
i
++
)
{
uint32_t
pdir_idx
=
(
uintptr_t
)
segments
[
i
].
start
/
(
PGSIZE
*
NR_PTE
);
uint32_t
pdir_idx_end
=
(
uintptr_t
)
segments
[
i
].
end
/
(
PGSIZE
*
NR_PTE
);
for
(;
pdir_idx
<
pdir_idx_end
;
pdir_idx
++
)
{
// fill PDE
kpdirs
[
pdir_idx
]
=
((
uintptr_t
)
ptab
>>
PGSHFT
<<
10
)
|
PTE_V
;
// fill PTE
PTE
pte
=
(
PGADDR
(
pdir_idx
,
0
,
0
)
>>
PGSHFT
<<
10
)
|
PTE_V
|
PTE_R
|
PTE_W
|
PTE_X
;
PTE
pte_end
=
(
PGADDR
(
pdir_idx
+
1
,
0
,
0
)
>>
PGSHFT
<<
10
)
|
PTE_V
|
PTE_R
|
PTE_W
|
PTE_X
;
for
(;
pte
<
pte_end
;
pte
+=
(
1
<<
10
))
{
*
ptab
=
pte
;
ptab
++
;
}
void
*
va
=
segments
[
i
].
start
;
for
(;
va
<
segments
[
i
].
end
;
va
+=
PGSIZE
)
{
_map
(
&
kas
,
va
,
va
,
0
);
}
}
set_satp
(
k
pdirs
);
set_satp
(
k
as
.
ptr
);
vme_enable
=
1
;
return
0
;
}
int
_protect
(
_AddressSpace
*
as
)
{
P
DE
*
updir
=
(
PDE
*
)(
pgalloc_usr
(
1
));
P
TE
*
updir
=
(
PTE
*
)(
pgalloc_usr
(
1
));
as
->
ptr
=
updir
;
// map kernel space
for
(
int
i
=
0
;
i
<
NR_PDE
;
i
++
)
{
updir
[
i
]
=
kpdirs
[
i
];
}
memcpy
(
updir
,
kas
.
ptr
,
PGSIZE
);
return
0
;
}
...
...
@@ -84,14 +68,17 @@ void __am_switch(_Context *c) {
}
int
_map
(
_AddressSpace
*
as
,
void
*
va
,
void
*
pa
,
int
prot
)
{
PDE
*
pt
=
(
PDE
*
)
as
->
ptr
;
PDE
*
pde
=
&
pt
[
PDX
(
va
)];
if
(
!
(
*
pde
&
PTE_V
))
{
*
pde
=
PTE_V
|
((
uint64_t
)
pgalloc_usr
(
1
)
>>
PGSHFT
<<
10
);
PTE
*
pte2
=
&
((
PTE
*
)
as
->
ptr
)[
VPN2
(
va
)];
if
(
!
(
*
pte2
&
PTE_V
))
{
*
pte2
=
PTE_V
|
(
PN
(
pgalloc_usr
(
1
))
<<
10
);
}
PTE
*
pte1
=
&
((
PTE
*
)
PTE_ADDR
(
*
pte2
))[
VPN1
(
va
)];
if
(
!
(
*
pte1
&
PTE_V
))
{
*
pte1
=
PTE_V
|
(
PN
(
pgalloc_usr
(
1
))
<<
10
);
}
PTE
*
pte
=
&
((
PTE
*
)
PTE_ADDR
(
*
pde
))[
PTX
(
va
)];
if
(
!
(
*
pte
&
PTE_V
))
{
*
pte
=
PTE_V
|
PTE_R
|
PTE_W
|
PTE_X
|
((
uint64_t
)
pa
>>
PGSHFT
<<
10
);
PTE
*
pte
0
=
&
((
PTE
*
)
PTE_ADDR
(
*
pte1
))[
VPN0
(
va
)];
if
(
!
(
*
pte
0
&
PTE_V
))
{
*
pte
0
=
PTE_V
|
PTE_R
|
PTE_W
|
PTE_X
|
(
PN
(
pa
)
<<
10
);
}
return
0
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录