Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
8988ae89
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看板
提交
8988ae89
编写于
9月 27, 2006
作者:
B
bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
SMM fix for x86_64
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@2183
c046a42c-6fe2-441c-8c8c-71466251a162
上级
69c3bcb4
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
13 addition
and
6 deletion
+13
-6
target-i386/cpu.h
target-i386/cpu.h
+3
-1
target-i386/helper.c
target-i386/helper.c
+10
-5
未找到文件。
target-i386/cpu.h
浏览文件 @
8988ae89
...
...
@@ -260,6 +260,7 @@
#define CPUID_MCA (1 << 14)
#define CPUID_CMOV (1 << 15)
#define CPUID_PAT (1 << 16)
#define CPUID_PSE36 (1 << 17)
#define CPUID_CLFLUSH (1 << 19)
/* ... */
#define CPUID_MMX (1 << 23)
...
...
@@ -543,7 +544,8 @@ void cpu_set_ferr(CPUX86State *s);
cache: it synchronizes the hflags with the segment cache values */
static
inline
void
cpu_x86_load_seg_cache
(
CPUX86State
*
env
,
int
seg_reg
,
unsigned
int
selector
,
uint32_t
base
,
unsigned
int
limit
,
target_ulong
base
,
unsigned
int
limit
,
unsigned
int
flags
)
{
SegmentCache
*
sc
;
...
...
target-i386/helper.c
浏览文件 @
8988ae89
...
...
@@ -1338,6 +1338,10 @@ void do_smm_enter(void)
#endif
/* init SMM cpu state */
#ifdef TARGET_X86_64
env
->
efer
=
0
;
env
->
hflags
&=
~
HF_LMA_MASK
;
#endif
load_eflags
(
0
,
~
(
CC_O
|
CC_S
|
CC_Z
|
CC_A
|
CC_P
|
CC_C
|
DF_MASK
));
env
->
eip
=
0x00008000
;
cpu_x86_load_seg_cache
(
env
,
R_CS
,
(
env
->
smbase
>>
4
)
&
0xffff
,
env
->
smbase
,
...
...
@@ -1352,9 +1356,6 @@ void do_smm_enter(void)
env
->
cr
[
0
]
&
~
(
CR0_PE_MASK
|
CR0_EM_MASK
|
CR0_TS_MASK
|
CR0_PG_MASK
));
cpu_x86_update_cr4
(
env
,
0
);
env
->
dr
[
7
]
=
0x00000400
;
#ifdef TARGET_X86_64
env
->
efer
=
0
;
#endif
CC_OP
=
CC_OP_EFLAGS
;
}
...
...
@@ -1366,6 +1367,12 @@ void helper_rsm(void)
sm_state
=
env
->
smbase
+
0x8000
;
#ifdef TARGET_X86_64
env
->
efer
=
ldq_phys
(
sm_state
+
0x7ed0
);
if
(
env
->
efer
&
MSR_EFER_LMA
)
env
->
hflags
|=
HF_LMA_MASK
;
else
env
->
hflags
&=
~
HF_LMA_MASK
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
offset
=
0x7e00
+
i
*
16
;
cpu_x86_load_seg_cache
(
env
,
i
,
...
...
@@ -1391,8 +1398,6 @@ void helper_rsm(void)
env
->
tr
.
limit
=
ldl_phys
(
sm_state
+
0x7e94
);
env
->
tr
.
flags
=
(
lduw_phys
(
sm_state
+
0x7e92
)
&
0xf0ff
)
<<
8
;
env
->
efer
=
ldq_phys
(
sm_state
+
0x7ed0
);
EAX
=
ldq_phys
(
sm_state
+
0x7ff8
);
ECX
=
ldq_phys
(
sm_state
+
0x7ff0
);
EDX
=
ldq_phys
(
sm_state
+
0x7fe8
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录