Revision eef26553
b/target-i386/op_helper.c | ||
---|---|---|
3030 | 3030 |
update_mask |= MSR_EFER_NXE; |
3031 | 3031 |
if (env->cpuid_ext3_features & CPUID_EXT3_SVM) |
3032 | 3032 |
update_mask |= MSR_EFER_SVME; |
3033 |
if (env->cpuid_ext2_features & CPUID_EXT2_FFXSR) |
|
3034 |
update_mask |= MSR_EFER_FFXSR; |
|
3033 | 3035 |
cpu_load_efer(env, (env->efer & ~update_mask) | |
3034 | 3036 |
(val & update_mask)); |
3035 | 3037 |
} |
... | ... | |
4352 | 4354 |
else |
4353 | 4355 |
nb_xmm_regs = 8; |
4354 | 4356 |
addr = ptr + 0xa0; |
4355 |
for(i = 0; i < nb_xmm_regs; i++) { |
|
4356 |
stq(addr, env->xmm_regs[i].XMM_Q(0)); |
|
4357 |
stq(addr + 8, env->xmm_regs[i].XMM_Q(1)); |
|
4358 |
addr += 16; |
|
4357 |
/* Fast FXSAVE leaves out the XMM registers */ |
|
4358 |
if (!(env->efer & MSR_EFER_FFXSR) |
|
4359 |
|| (env->hflags & HF_CPL_MASK) |
|
4360 |
|| !(env->hflags & HF_LMA_MASK)) { |
|
4361 |
for(i = 0; i < nb_xmm_regs; i++) { |
|
4362 |
stq(addr, env->xmm_regs[i].XMM_Q(0)); |
|
4363 |
stq(addr + 8, env->xmm_regs[i].XMM_Q(1)); |
|
4364 |
addr += 16; |
|
4365 |
} |
|
4359 | 4366 |
} |
4360 | 4367 |
} |
4361 | 4368 |
} |
... | ... | |
4392 | 4399 |
else |
4393 | 4400 |
nb_xmm_regs = 8; |
4394 | 4401 |
addr = ptr + 0xa0; |
4395 |
for(i = 0; i < nb_xmm_regs; i++) { |
|
4396 |
env->xmm_regs[i].XMM_Q(0) = ldq(addr); |
|
4397 |
env->xmm_regs[i].XMM_Q(1) = ldq(addr + 8); |
|
4398 |
addr += 16; |
|
4402 |
/* Fast FXRESTORE leaves out the XMM registers */ |
|
4403 |
if (!(env->efer & MSR_EFER_FFXSR) |
|
4404 |
|| (env->hflags & HF_CPL_MASK) |
|
4405 |
|| !(env->hflags & HF_LMA_MASK)) { |
|
4406 |
for(i = 0; i < nb_xmm_regs; i++) { |
|
4407 |
env->xmm_regs[i].XMM_Q(0) = ldq(addr); |
|
4408 |
env->xmm_regs[i].XMM_Q(1) = ldq(addr + 8); |
|
4409 |
addr += 16; |
|
4410 |
} |
|
4399 | 4411 |
} |
4400 | 4412 |
} |
4401 | 4413 |
} |
Also available in: Unified diff