Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
7a977356
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7a977356
编写于
2月 15, 2010
作者:
E
Edgar E. Iglesias
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
cris: Add v10 style interrupts.
Signed-off-by:
N
Edgar E. Iglesias
<
edgar.iglesias@gmail.com
>
上级
95475216
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
63 addition
and
5 deletion
+63
-5
target-cris/helper.c
target-cris/helper.c
+63
-5
未找到文件。
target-cris/helper.c
浏览文件 @
7a977356
...
...
@@ -87,10 +87,10 @@ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
if
(
miss
)
{
if
(
env
->
exception_index
==
EXCP_BUSFAULT
)
cpu_abort
(
env
,
cpu_abort
(
env
,
"CRIS: Illegal recursive bus fault."
"addr=%x rw=%d
\n
"
,
address
,
rw
);
"addr=%x rw=%d
\n
"
,
address
,
rw
);
env
->
pregs
[
PR_EDA
]
=
address
;
env
->
exception_index
=
EXCP_BUSFAULT
;
...
...
@@ -116,10 +116,68 @@ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
return
r
;
}
static
void
do_interruptv10
(
CPUState
*
env
)
{
int
ex_vec
=
-
1
;
D_LOG
(
"exception index=%d interrupt_req=%d
\n
"
,
env
->
exception_index
,
env
->
interrupt_request
);
assert
(
!
(
env
->
pregs
[
PR_CCS
]
&
PFIX_FLAG
));
switch
(
env
->
exception_index
)
{
case
EXCP_BREAK
:
/* These exceptions are genereated by the core itself.
ERP should point to the insn following the brk. */
ex_vec
=
env
->
trap_vector
;
env
->
pregs
[
PR_ERP
]
=
env
->
pc
;
break
;
case
EXCP_NMI
:
/* NMI is hardwired to vector zero. */
ex_vec
=
0
;
env
->
pregs
[
PR_CCS
]
&=
~
M_FLAG
;
env
->
pregs
[
PR_NRP
]
=
env
->
pc
;
break
;
case
EXCP_BUSFAULT
:
assert
(
0
);
break
;
default:
/* The interrupt controller gives us the vector. */
ex_vec
=
env
->
interrupt_vector
;
/* Normal interrupts are taken between
TB's. env->pc is valid here. */
env
->
pregs
[
PR_ERP
]
=
env
->
pc
;
break
;
}
if
(
env
->
pregs
[
PR_CCS
]
&
U_FLAG
)
{
/* Swap stack pointers. */
env
->
pregs
[
PR_USP
]
=
env
->
regs
[
R_SP
];
env
->
regs
[
R_SP
]
=
env
->
ksp
;
}
/* Now that we are in kernel mode, load the handlers address. */
env
->
pc
=
ldl_code
(
env
->
pregs
[
PR_EBP
]
+
ex_vec
*
4
);
env
->
locked_irq
=
1
;
qemu_log_mask
(
CPU_LOG_INT
,
"%s isr=%x vec=%x ccs=%x pid=%d erp=%x
\n
"
,
__func__
,
env
->
pc
,
ex_vec
,
env
->
pregs
[
PR_CCS
],
env
->
pregs
[
PR_PID
],
env
->
pregs
[
PR_ERP
]);
}
void
do_interrupt
(
CPUState
*
env
)
{
int
ex_vec
=
-
1
;
if
(
env
->
pregs
[
PR_VR
]
<
32
)
return
do_interruptv10
(
env
);
D_LOG
(
"exception index=%d interrupt_req=%d
\n
"
,
env
->
exception_index
,
env
->
interrupt_request
);
...
...
@@ -184,8 +242,8 @@ void do_interrupt(CPUState *env)
/* Now that we are in kernel mode, load the handlers address. */
env
->
pc
=
ldl_code
(
env
->
pregs
[
PR_EBP
]
+
ex_vec
*
4
);
D_LOG
(
"%s isr=%x vec=%x ccs=%x pid=%d erp=%x
\n
"
,
__func__
,
env
->
pc
,
ex_vec
,
D_LOG
(
"%s isr=%x vec=%x ccs=%x pid=%d erp=%x
\n
"
,
__func__
,
env
->
pc
,
ex_vec
,
env
->
pregs
[
PR_CCS
],
env
->
pregs
[
PR_PID
],
env
->
pregs
[
PR_ERP
]);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录