Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
c05bab77
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看板
提交
c05bab77
编写于
6月 21, 2003
作者:
B
bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
force IOPL=3
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@257
c046a42c-6fe2-441c-8c8c-71466251a162
上级
a52c757c
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
22 addition
and
20 deletion
+22
-20
linux-user/vm86.c
linux-user/vm86.c
+22
-20
未找到文件。
linux-user/vm86.c
浏览文件 @
c05bab77
...
...
@@ -73,17 +73,17 @@ void save_v86_state(CPUX86State *env)
ts
->
target_v86
->
regs
.
ebp
=
tswap32
(
env
->
regs
[
R_EBP
]);
ts
->
target_v86
->
regs
.
esp
=
tswap32
(
env
->
regs
[
R_ESP
]);
ts
->
target_v86
->
regs
.
eip
=
tswap32
(
env
->
eip
);
ts
->
target_v86
->
regs
.
cs
=
tswap16
(
env
->
segs
[
R_CS
]);
ts
->
target_v86
->
regs
.
ss
=
tswap16
(
env
->
segs
[
R_SS
]);
ts
->
target_v86
->
regs
.
ds
=
tswap16
(
env
->
segs
[
R_DS
]);
ts
->
target_v86
->
regs
.
es
=
tswap16
(
env
->
segs
[
R_ES
]);
ts
->
target_v86
->
regs
.
fs
=
tswap16
(
env
->
segs
[
R_FS
]);
ts
->
target_v86
->
regs
.
gs
=
tswap16
(
env
->
segs
[
R_GS
]);
ts
->
target_v86
->
regs
.
cs
=
tswap16
(
env
->
segs
[
R_CS
]
.
selector
);
ts
->
target_v86
->
regs
.
ss
=
tswap16
(
env
->
segs
[
R_SS
]
.
selector
);
ts
->
target_v86
->
regs
.
ds
=
tswap16
(
env
->
segs
[
R_DS
]
.
selector
);
ts
->
target_v86
->
regs
.
es
=
tswap16
(
env
->
segs
[
R_ES
]
.
selector
);
ts
->
target_v86
->
regs
.
fs
=
tswap16
(
env
->
segs
[
R_FS
]
.
selector
);
ts
->
target_v86
->
regs
.
gs
=
tswap16
(
env
->
segs
[
R_GS
]
.
selector
);
set_flags
(
env
->
eflags
,
ts
->
v86flags
,
VIF_MASK
|
ts
->
v86mask
);
ts
->
target_v86
->
regs
.
eflags
=
tswap32
(
env
->
eflags
);
#ifdef DEBUG_VM86
fprintf
(
logfile
,
"save_v86_state: eflags=%08x cs:ip=%04x:%04x
\n
"
,
env
->
eflags
,
env
->
segs
[
R_CS
],
env
->
eip
);
env
->
eflags
,
env
->
segs
[
R_CS
]
.
selector
,
env
->
eip
);
#endif
/* restore 32 bit registers */
...
...
@@ -180,6 +180,7 @@ static inline unsigned int get_vflags(CPUX86State *env)
flags
=
env
->
eflags
&
RETURN_MASK
;
if
(
ts
->
v86flags
&
VIF_MASK
)
flags
|=
IF_MASK
;
flags
|=
IOPL_MASK
;
return
flags
|
(
ts
->
v86flags
&
ts
->
v86mask
);
}
...
...
@@ -194,7 +195,7 @@ static void do_int(CPUX86State *env, int intno)
uint8_t
*
ssp
;
unsigned
int
sp
;
if
(
env
->
segs
[
R_CS
]
==
TARGET_BIOSSEG
)
if
(
env
->
segs
[
R_CS
]
.
selector
==
TARGET_BIOSSEG
)
goto
cannot_handle
;
if
(
is_revectored
(
intno
,
&
ts
->
vm86plus
.
int_revectored
))
goto
cannot_handle
;
...
...
@@ -210,10 +211,10 @@ static void do_int(CPUX86State *env, int intno)
intno
,
segoffs
>>
16
,
segoffs
&
0xffff
);
#endif
/* save old state */
ssp
=
(
uint8_t
*
)(
env
->
segs
[
R_SS
]
<<
4
);
ssp
=
(
uint8_t
*
)(
env
->
segs
[
R_SS
]
.
selector
<<
4
);
sp
=
env
->
regs
[
R_ESP
]
&
0xffff
;
vm_putw
(
ssp
,
sp
-
2
,
get_vflags
(
env
));
vm_putw
(
ssp
,
sp
-
4
,
env
->
segs
[
R_CS
]);
vm_putw
(
ssp
,
sp
-
4
,
env
->
segs
[
R_CS
]
.
selector
);
vm_putw
(
ssp
,
sp
-
6
,
env
->
eip
);
ADD16
(
env
->
regs
[
R_ESP
],
-
6
);
/* goto interrupt handler */
...
...
@@ -257,16 +258,16 @@ void handle_vm86_fault(CPUX86State *env)
unsigned
int
ip
,
sp
,
newflags
,
newip
,
newcs
,
opcode
,
intno
;
int
data32
,
pref_done
;
csp
=
(
uint8_t
*
)(
env
->
segs
[
R_CS
]
<<
4
);
csp
=
(
uint8_t
*
)(
env
->
segs
[
R_CS
]
.
selector
<<
4
);
ip
=
env
->
eip
&
0xffff
;
pc
=
csp
+
ip
;
ssp
=
(
uint8_t
*
)(
env
->
segs
[
R_SS
]
<<
4
);
ssp
=
(
uint8_t
*
)(
env
->
segs
[
R_SS
]
.
selector
<<
4
);
sp
=
env
->
regs
[
R_ESP
]
&
0xffff
;
#if defined(DEBUG_VM86)
fprintf
(
logfile
,
"VM86 exception %04x:%08x %02x %02x
\n
"
,
env
->
segs
[
R_CS
],
env
->
eip
,
pc
[
0
],
pc
[
1
]);
env
->
segs
[
R_CS
]
.
selector
,
env
->
eip
,
pc
[
0
],
pc
[
1
]);
#endif
data32
=
0
;
...
...
@@ -413,12 +414,12 @@ int do_vm86(CPUX86State *env, long subfunction,
ts
->
vm86_saved_regs
.
esp
=
env
->
regs
[
R_ESP
];
ts
->
vm86_saved_regs
.
eflags
=
env
->
eflags
;
ts
->
vm86_saved_regs
.
eip
=
env
->
eip
;
ts
->
vm86_saved_regs
.
cs
=
env
->
segs
[
R_CS
];
ts
->
vm86_saved_regs
.
ss
=
env
->
segs
[
R_SS
];
ts
->
vm86_saved_regs
.
ds
=
env
->
segs
[
R_DS
];
ts
->
vm86_saved_regs
.
es
=
env
->
segs
[
R_ES
];
ts
->
vm86_saved_regs
.
fs
=
env
->
segs
[
R_FS
];
ts
->
vm86_saved_regs
.
gs
=
env
->
segs
[
R_GS
];
ts
->
vm86_saved_regs
.
cs
=
env
->
segs
[
R_CS
]
.
selector
;
ts
->
vm86_saved_regs
.
ss
=
env
->
segs
[
R_SS
]
.
selector
;
ts
->
vm86_saved_regs
.
ds
=
env
->
segs
[
R_DS
]
.
selector
;
ts
->
vm86_saved_regs
.
es
=
env
->
segs
[
R_ES
]
.
selector
;
ts
->
vm86_saved_regs
.
fs
=
env
->
segs
[
R_FS
]
.
selector
;
ts
->
vm86_saved_regs
.
gs
=
env
->
segs
[
R_GS
]
.
selector
;
/* build vm86 CPU state */
ts
->
v86flags
=
tswap32
(
target_v86
->
regs
.
eflags
);
...
...
@@ -466,7 +467,8 @@ int do_vm86(CPUX86State *env, long subfunction,
target_v86
->
vm86plus
.
vm86dbg_intxxtab
,
32
);
#ifdef DEBUG_VM86
fprintf
(
logfile
,
"do_vm86: cs:ip=%04x:%04x
\n
"
,
env
->
segs
[
R_CS
],
env
->
eip
);
fprintf
(
logfile
,
"do_vm86: cs:ip=%04x:%04x
\n
"
,
env
->
segs
[
R_CS
].
selector
,
env
->
eip
);
#endif
/* now the virtual CPU is ready for vm86 execution ! */
out:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录