Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
nexus-am
提交
817223fa
N
nexus-am
项目概览
OpenXiangShan
/
nexus-am
10 个月 前同步成功
通知
0
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,体验更适合开发者的 AI 搜索 >>
提交
817223fa
编写于
3月 07, 2020
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
riscv64-nemu: reuse more code from riscv32-nemu
上级
45374f11
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
65 addition
and
94 deletion
+65
-94
am/arch/riscv64-nemu.mk
am/arch/riscv64-nemu.mk
+3
-1
am/include/arch/riscv64-nemu.h
am/include/arch/riscv64-nemu.h
+1
-20
am/src/nemu/isa/riscv/cte.c
am/src/nemu/isa/riscv/cte.c
+14
-1
am/src/nemu/isa/riscv/cte64.c
am/src/nemu/isa/riscv/cte64.c
+20
-72
am/src/nemu/isa/riscv/mtime.S
am/src/nemu/isa/riscv/mtime.S
+27
-0
未找到文件。
am/arch/riscv64-nemu.mk
浏览文件 @
817223fa
...
@@ -2,8 +2,10 @@ include $(AM_HOME)/am/arch/isa/riscv64.mk
...
@@ -2,8 +2,10 @@ include $(AM_HOME)/am/arch/isa/riscv64.mk
include
$(AM_HOME)/am/arch/platform/nemu.mk
include
$(AM_HOME)/am/arch/platform/nemu.mk
AM_SRCS
+=
nemu/isa/riscv/trm.c
\
AM_SRCS
+=
nemu/isa/riscv/trm.c
\
nemu/isa/riscv/cte
64
.c
\
nemu/isa/riscv/cte.c
\
nemu/isa/riscv/trap.S
\
nemu/isa/riscv/trap.S
\
nemu/isa/riscv/cte64.c
\
nemu/isa/riscv/mtime.S
\
nemu/isa/riscv/vme.c
\
nemu/isa/riscv/vme.c
\
nemu/isa/riscv/boot/start.S
nemu/isa/riscv/boot/start.S
...
...
am/include/arch/riscv64-nemu.h
浏览文件 @
817223fa
#ifndef __ARCH_H__
#include "riscv32-nemu.h"
#define __ARCH_H__
struct
_Context
{
union
{
void
*
pdir
;
uint64_t
gpr
[
32
];
};
uint64_t
mcause
;
uint64_t
mstatus
;
uint64_t
mepc
;
};
#define GPR1 gpr[17] // a7
#define GPR2 gpr[10] // a0
#define GPR3 gpr[11] // a1
#define GPR4 gpr[12] // a2
#define GPRx gpr[10] // a0
#endif
am/src/nemu/isa/riscv/cte.c
浏览文件 @
817223fa
...
@@ -7,13 +7,21 @@ static _Context* (*user_handler)(_Event, _Context*) = NULL;
...
@@ -7,13 +7,21 @@ static _Context* (*user_handler)(_Event, _Context*) = NULL;
void
__am_get_cur_as
(
_Context
*
c
);
void
__am_get_cur_as
(
_Context
*
c
);
void
__am_switch
(
_Context
*
c
);
void
__am_switch
(
_Context
*
c
);
#define INTR_BIT (1ul << (sizeof(uintptr_t) * 8 - 1))
_Context
*
__am_irq_handle
(
_Context
*
c
)
{
_Context
*
__am_irq_handle
(
_Context
*
c
)
{
__am_get_cur_as
(
c
);
__am_get_cur_as
(
c
);
if
(
user_handler
)
{
if
(
user_handler
)
{
_Event
ev
=
{
0
};
_Event
ev
=
{
0
};
switch
(
c
->
scause
)
{
switch
(
c
->
scause
)
{
case
0x80000005
:
ev
.
event
=
_EVENT_IRQ_TIMER
;
break
;
#if __riscv_xlen == 64
// SSIP, which is set at mtime.S
case
0x1
|
INTR_BIT
:
asm
volatile
(
"csrwi sip, 0"
);
#else
case
0x5
|
INTR_BIT
:
#endif
ev
.
event
=
_EVENT_IRQ_TIMER
;
break
;
case
9
:
case
9
:
ev
.
event
=
(
c
->
GPR1
==
-
1
)
?
_EVENT_YIELD
:
_EVENT_SYSCALL
;
ev
.
event
=
(
c
->
GPR1
==
-
1
)
?
_EVENT_YIELD
:
_EVENT_SYSCALL
;
c
->
sepc
+=
4
;
c
->
sepc
+=
4
;
...
@@ -41,6 +49,11 @@ int _cte_init(_Context*(*handler)(_Event, _Context*)) {
...
@@ -41,6 +49,11 @@ int _cte_init(_Context*(*handler)(_Event, _Context*)) {
// register event handler
// register event handler
user_handler
=
handler
;
user_handler
=
handler
;
#if __riscv_xlen == 64
extern
void
__am_init_cte64
();
__am_init_cte64
();
#endif
return
0
;
return
0
;
}
}
...
...
am/src/nemu/isa/riscv/cte64.c
浏览文件 @
817223fa
#include <am.h>
#include <riscv.h>
#include <nemu.h>
#include <klib.h>
#define CLINT_MMIO 0xa2000000
#define CLINT_MMIO 0xa2000000
#define CLINT_MTIMECMP (CLINT_MMIO + 0x4000)
#define CLINT_MTIMECMP (CLINT_MMIO + 0x4000)
#define CLINT_MTIME (CLINT_MMIO + 0xbff8)
#define TIME_INC 0x800
#define TIME_INC 0x800
static
inline
void
inc_mtimecmp
(
uint64_t
this
)
{
outd
(
CLINT_MTIMECMP
,
this
+
TIME_INC
);
}
static
_Context
*
(
*
user_handler
)(
_Event
,
_Context
*
)
=
NULL
;
void
__am_get_cur_as
(
_Context
*
c
);
void
__am_switch
(
_Context
*
c
);
#define INTR_BIT (1ULL << 63)
_Context
*
__am_irq_handle
(
_Context
*
c
)
{
__am_get_cur_as
(
c
);
_Context
*
next
=
c
;
extern
void
__am_timervec
(
void
);
if
(
user_handler
)
{
_Event
ev
=
{
0
};
switch
(
c
->
cause
)
{
case
(
0x7
|
INTR_BIT
):
inc_mtimecmp
(
ind
(
CLINT_MTIME
));
ev
.
event
=
_EVENT_IRQ_TIMER
;
break
;
case
9
:
ev
.
event
=
(
c
->
GPR1
==
-
1
)
?
_EVENT_YIELD
:
_EVENT_SYSCALL
;
c
->
epc
+=
4
;
break
;
default:
ev
.
event
=
_EVENT_ERROR
;
break
;
}
next
=
user_handler
(
ev
,
c
);
static
void
init_timer
()
{
if
(
next
==
NULL
)
{
static
struct
{
next
=
c
;
uintptr_t
mtimecmp
;
}
uintptr_t
time_inc
;
}
uintptr_t
temp
[
3
];
}
handle
;
__am_switch
(
next
);
handle
.
mtimecmp
=
CLINT_MTIMECMP
;
handle
.
time_inc
=
TIME_INC
;
return
next
;
asm
volatile
(
"csrw mscratch, %0"
:
:
"r"
(
&
handle
));
}
extern
void
__am_asm_trap
(
void
);
int
_cte_init
(
_Context
*
(
*
handler
)(
_Event
,
_Context
*
))
{
// initialize exception entry
asm
volatile
(
"csrw stvec, %0"
:
:
"r"
(
__am_asm_trap
));
//
register event handler
//
set M-mode exception entry to handle machine timer interrupt
user_handler
=
handler
;
asm
volatile
(
"csrw mtvec, %0"
:
:
"r"
(
__am_timervec
))
;
// set machine timer interrupt
// set machine timer interrupt
inc_mtimecmp
(
0
);
asm
volatile
(
"csrs mie, %0"
:
:
"r"
((
1
<<
7
)
|
(
1
<<
1
)));
asm
volatile
(
"csrs mie, %0"
:
:
"r"
(
1
<<
7
));
outd
(
CLINT_MTIMECMP
,
0
);
}
void
__am_init_cte64
()
{
// set delegation
// set delegation
asm
volatile
(
"csrw mideleg, %0"
:
:
"r"
(
0xffff
));
asm
volatile
(
"csrw mideleg, %0"
:
:
"r"
(
0xffff
));
asm
volatile
(
"csrw medeleg, %0"
:
:
"r"
(
0xffff
));
asm
volatile
(
"csrw medeleg, %0"
:
:
"r"
(
0xffff
));
init_timer
();
// enter S-mode
// enter S-mode
uintptr_t
status
=
MSTATUS_
MXR
|
MSTATUS_SUM
|
MSTATUS_
SPP
(
MODE_S
);
uintptr_t
status
=
MSTATUS_SPP
(
MODE_S
);
extern
char
_here
;
extern
char
_here
;
asm
volatile
(
asm
volatile
(
"csrw sstatus, %0;"
"csrw sstatus, %0;"
...
@@ -72,26 +42,4 @@ int _cte_init(_Context*(*handler)(_Event, _Context*)) {
...
@@ -72,26 +42,4 @@ int _cte_init(_Context*(*handler)(_Event, _Context*)) {
"sret;"
"sret;"
"_here:"
"_here:"
:
:
"r"
(
status
),
"r"
(
&
_here
));
:
:
"r"
(
status
),
"r"
(
&
_here
));
return
0
;
}
_Context
*
_kcontext
(
_Area
stack
,
void
(
*
entry
)(
void
*
),
void
*
arg
)
{
_Context
*
c
=
(
_Context
*
)
stack
.
end
-
1
;
c
->
epc
=
(
uintptr_t
)
entry
;
uintptr_t
mprotect
=
MSTATUS_MXR
|
MSTATUS_SUM
;
c
->
status
=
mprotect
|
MSTATUS_SPP
(
MODE_S
)
|
MSTATUS_PIE
(
MODE_S
);
return
c
;
}
void
_yield
()
{
asm
volatile
(
"li a7, -1; ecall"
);
}
int
_intr_read
()
{
return
0
;
}
void
_intr_write
(
int
enable
)
{
}
}
am/src/nemu/isa/riscv/mtime.S
0 → 100644
浏览文件 @
817223fa
#
machine
-
mode
timer
interrupt
handler
from
xv6
code
.
globl
__am_timervec
.
align
4
__am_timervec
:
csrrw
a0
,
mscratch
,
a0
sd
a1
,
16
(
a0
)
sd
a2
,
24
(
a0
)
sd
a3
,
32
(
a0
)
#
schedule
the
next
timer
interrupt
#
by
adding
interval
to
mtimecmp
.
ld
a1
,
0
(
a0
)
#
CLINT_MTIMECMP
(
hart
)
ld
a2
,
8
(
a0
)
#
interval
ld
a3
,
0
(
a1
)
add
a3
,
a3
,
a2
sd
a3
,
0
(
a1
)
#
raise
a
supervisor
software
interrupt
.
csrwi
sip
,
2
ld
a3
,
32
(
a0
)
ld
a2
,
24
(
a0
)
ld
a1
,
16
(
a0
)
csrrw
a0
,
mscratch
,
a0
mret
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录