Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
cedb936b
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看板
提交
cedb936b
编写于
9月 03, 2009
作者:
E
Edgar E. Iglesias
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
microblaze: Add infrastructure for supporting hw exceptions.
Signed-off-by:
N
Edgar E. Iglesias
<
edgar.iglesias@gmail.com
>
上级
a75cf0c5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
49 addition
and
3 deletion
+49
-3
target-microblaze/cpu.h
target-microblaze/cpu.h
+18
-3
target-microblaze/helper.c
target-microblaze/helper.c
+31
-0
未找到文件。
target-microblaze/cpu.h
浏览文件 @
cedb936b
...
...
@@ -38,6 +38,7 @@ struct CPUMBState;
#define EXCP_IRQ 3
#define EXCP_BREAK 4
#define EXCP_HW_BREAK 5
#define EXCP_HW_EXCP 6
/* Register aliases. R0 - R15 */
#define R_SP 1
...
...
@@ -77,7 +78,18 @@ struct CPUMBState;
#define ESR_DIZ (1<<11)
/* Zone Protection */
#define ESR_S (1<<10)
/* Store instruction */
#define ESR_EC_FSL 0
#define ESR_EC_UNALIGNED_DATA 1
#define ESR_EC_ILLEGAL_OP 2
#define ESR_EC_INSN_BUS 3
#define ESR_EC_DATA_BUS 4
#define ESR_EC_DIVZERO 5
#define ESR_EC_FPU 6
#define ESR_EC_PRIVINSN 7
#define ESR_EC_DATA_STORAGE 8
#define ESR_EC_INSN_STORAGE 9
#define ESR_EC_DATA_TLB 10
#define ESR_EC_INSN_TLB 11
/* Version reg. */
/* Basic PVR mask */
...
...
@@ -198,13 +210,15 @@ typedef struct CPUMBState {
uint32_t
sregs
[
24
];
/* Internal flags. */
#define IMM_FLAG 4
#define IMM_FLAG 4
#define MSR_EE_FLAG (1 << 8)
#define DRTI_FLAG (1 << 16)
#define DRTE_FLAG (1 << 17)
#define DRTB_FLAG (1 << 18)
#define D_FLAG (1 << 19)
/* Bit in ESR. */
/* TB dependant CPUState. */
#define IFLAGS_TB_MASK (D_FLAG | IMM_FLAG | DRTI_FLAG | DRTE_FLAG | DRTB_FLAG)
#define IFLAGS_TB_MASK (D_FLAG | IMM_FLAG | DRTI_FLAG \
| DRTE_FLAG | DRTB_FLAG | MSR_EE_FLAG)
uint32_t
iflags
;
struct
{
...
...
@@ -306,6 +320,7 @@ static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
{
*
pc
=
env
->
sregs
[
SR_PC
];
*
cs_base
=
0
;
env
->
iflags
|=
env
->
sregs
[
SR_MSR
]
&
MSR_EE
;
*
flags
=
env
->
iflags
&
IFLAGS_TB_MASK
;
}
#endif
target-microblaze/helper.c
浏览文件 @
cedb936b
...
...
@@ -126,6 +126,37 @@ void do_interrupt(CPUState *env)
assert
(
!
(
env
->
iflags
&
(
DRTI_FLAG
|
DRTE_FLAG
|
DRTB_FLAG
)));
/* assert(env->sregs[SR_MSR] & (MSR_EE)); Only for HW exceptions. */
switch
(
env
->
exception_index
)
{
case
EXCP_HW_EXCP
:
if
(
!
(
env
->
pvr
.
regs
[
0
]
&
PVR0_USE_EXC_MASK
))
{
qemu_log
(
"Exception raised on system without exceptions!
\n
"
);
return
;
}
env
->
regs
[
17
]
=
env
->
sregs
[
SR_PC
]
+
4
;
env
->
sregs
[
SR_ESR
]
&=
~
(
1
<<
12
);
/* Exception breaks branch + dslot sequence? */
if
(
env
->
iflags
&
D_FLAG
)
{
env
->
sregs
[
SR_ESR
]
|=
1
<<
12
;
env
->
sregs
[
SR_BTR
]
=
env
->
btarget
;
}
/* Disable the MMU. */
t
=
(
env
->
sregs
[
SR_MSR
]
&
(
MSR_VM
|
MSR_UM
))
<<
1
;
env
->
sregs
[
SR_MSR
]
&=
~
(
MSR_VMS
|
MSR_UMS
|
MSR_VM
|
MSR_UM
);
env
->
sregs
[
SR_MSR
]
|=
t
;
/* Exception in progress. */
env
->
sregs
[
SR_MSR
]
|=
MSR_EIP
;
qemu_log_mask
(
CPU_LOG_INT
,
"hw exception at pc=%x ear=%x esr=%x iflags=%x
\n
"
,
env
->
sregs
[
SR_PC
],
env
->
sregs
[
SR_EAR
],
env
->
sregs
[
SR_ESR
],
env
->
iflags
);
log_cpu_state_mask
(
CPU_LOG_INT
,
env
,
0
);
env
->
iflags
&=
~
(
IMM_FLAG
|
D_FLAG
);
env
->
sregs
[
SR_PC
]
=
0x20
;
break
;
case
EXCP_MMU
:
env
->
regs
[
17
]
=
env
->
sregs
[
SR_PC
];
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录