Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
447db213
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看板
提交
447db213
编写于
5月 10, 2003
作者:
B
bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
sigtrap support
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@147
c046a42c-6fe2-441c-8c8c-71466251a162
上级
564c8f99
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
43 addition
and
6 deletion
+43
-6
linux-user/main.c
linux-user/main.c
+19
-2
linux-user/qemu.h
linux-user/qemu.h
+1
-1
linux-user/signal.c
linux-user/signal.c
+7
-2
linux-user/vm86.c
linux-user/vm86.c
+10
-1
syscall-i386.h
syscall-i386.h
+6
-0
未找到文件。
linux-user/main.c
浏览文件 @
447db213
...
...
@@ -166,7 +166,7 @@ void cpu_loop(CPUX86State *env)
break
;
case
EXCP00_DIVZ
:
if
(
env
->
eflags
&
VM_MASK
)
{
do_int
(
env
,
trapnr
);
handle_vm86_trap
(
env
,
trapnr
);
}
else
{
/* division by zero */
info
.
si_signo
=
SIGFPE
;
...
...
@@ -176,10 +176,27 @@ void cpu_loop(CPUX86State *env)
queue_signal
(
info
.
si_signo
,
&
info
);
}
break
;
case
EXCP01_SSTP
:
case
EXCP03_INT3
:
if
(
env
->
eflags
&
VM_MASK
)
{
handle_vm86_trap
(
env
,
trapnr
);
}
else
{
info
.
si_signo
=
SIGTRAP
;
info
.
si_errno
=
0
;
if
(
trapnr
==
EXCP01_SSTP
)
{
info
.
si_code
=
TARGET_TRAP_BRKPT
;
info
.
_sifields
.
_sigfault
.
_addr
=
env
->
eip
;
}
else
{
info
.
si_code
=
TARGET_SI_KERNEL
;
info
.
_sifields
.
_sigfault
.
_addr
=
0
;
}
queue_signal
(
info
.
si_signo
,
&
info
);
}
break
;
case
EXCP04_INTO
:
case
EXCP05_BOUND
:
if
(
env
->
eflags
&
VM_MASK
)
{
do_int
(
env
,
trapnr
);
handle_vm86_trap
(
env
,
trapnr
);
}
else
{
info
.
si_signo
=
SIGSEGV
;
info
.
si_errno
=
0
;
...
...
linux-user/qemu.h
浏览文件 @
447db213
...
...
@@ -83,7 +83,7 @@ extern FILE *logfile;
/* vm86.c */
void
save_v86_state
(
CPUX86State
*
env
);
void
do_int
(
CPUX86State
*
env
,
int
int
no
);
void
handle_vm86_trap
(
CPUX86State
*
env
,
int
trap
no
);
void
handle_vm86_fault
(
CPUX86State
*
env
);
int
do_vm86
(
CPUX86State
*
env
,
long
subfunction
,
struct
target_vm86plus_struct
*
target_v86
);
...
...
linux-user/signal.c
浏览文件 @
447db213
...
...
@@ -110,7 +110,8 @@ static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
tinfo
->
si_signo
=
sig
;
tinfo
->
si_errno
=
0
;
tinfo
->
si_code
=
0
;
if
(
sig
==
SIGILL
||
sig
==
SIGFPE
||
sig
==
SIGSEGV
||
sig
==
SIGBUS
)
{
if
(
sig
==
SIGILL
||
sig
==
SIGFPE
||
sig
==
SIGSEGV
||
sig
==
SIGBUS
||
sig
==
SIGTRAP
)
{
/* should never come here, but who knows. The information for
the target is irrelevant */
tinfo
->
_sifields
.
_sigfault
.
_addr
=
0
;
...
...
@@ -131,7 +132,8 @@ static void tswap_siginfo(target_siginfo_t *tinfo,
tinfo
->
si_signo
=
tswap32
(
sig
);
tinfo
->
si_errno
=
tswap32
(
info
->
si_errno
);
tinfo
->
si_code
=
tswap32
(
info
->
si_code
);
if
(
sig
==
SIGILL
||
sig
==
SIGFPE
||
sig
==
SIGSEGV
||
sig
==
SIGBUS
)
{
if
(
sig
==
SIGILL
||
sig
==
SIGFPE
||
sig
==
SIGSEGV
||
sig
==
SIGBUS
||
sig
==
SIGTRAP
)
{
tinfo
->
_sifields
.
_sigfault
.
_addr
=
tswapl
(
info
->
_sifields
.
_sigfault
.
_addr
);
}
else
if
(
sig
>=
TARGET_SIGRTMIN
)
{
...
...
@@ -788,6 +790,9 @@ long do_sigreturn(CPUX86State *env)
sigset_t
set
;
int
eax
,
i
;
#if defined(DEBUG_SIGNAL)
fprintf
(
stderr
,
"do_sigreturn
\n
"
);
#endif
/* set blocked signals */
target_set
.
sig
[
0
]
=
frame
->
sc
.
oldmask
;
for
(
i
=
1
;
i
<
TARGET_NSIG_WORDS
;
i
++
)
...
...
linux-user/vm86.c
浏览文件 @
447db213
...
...
@@ -178,7 +178,7 @@ static inline unsigned int get_vflags(CPUX86State *env)
/* handle VM86 interrupt (NOTE: the CPU core currently does not
support TSS interrupt revectoring, so this code is always executed) */
void
do_int
(
CPUX86State
*
env
,
int
intno
)
static
void
do_int
(
CPUX86State
*
env
,
int
intno
)
{
TaskState
*
ts
=
env
->
opaque
;
uint32_t
*
int_ptr
,
segoffs
;
...
...
@@ -225,6 +225,15 @@ void do_int(CPUX86State *env, int intno)
return_to_32bit
(
env
,
TARGET_VM86_INTx
|
(
intno
<<
8
));
}
void
handle_vm86_trap
(
CPUX86State
*
env
,
int
trapno
)
{
if
(
trapno
==
1
||
trapno
==
3
)
{
return_to_32bit
(
env
,
TARGET_VM86_TRAP
+
(
trapno
<<
8
));
}
else
{
do_int
(
env
,
trapno
);
}
}
#define CHECK_IF_IN_TRAP(disp) \
if ((tswap32(ts->target_v86->vm86plus.flags) & TARGET_vm86dbg_active) && \
(tswap32(ts->target_v86->vm86plus.flags) & TARGET_vm86dbg_TFpendig)) \
...
...
syscall-i386.h
浏览文件 @
447db213
...
...
@@ -480,6 +480,12 @@ typedef struct target_siginfo {
#define TARGET_SEGV_MAPERR (1)
/* address not mapped to object */
#define TARGET_SEGV_ACCERR (2)
/* invalid permissions for mapped object */
/*
* SIGTRAP si_codes
*/
#define TARGET_TRAP_BRKPT (1)
/* process breakpoint */
#define TARGET_TRAP_TRACE (2)
/* process trace trap */
/* default linux values for the selectors */
#define __USER_CS (0x23)
#define __USER_DS (0x2B)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录