Luca Tettamanti wrote:
> Il Sun, Sep 09, 2007 at 03:51:20PM +0300, Avi Kivity ha scritto: 
>   
>> Luca Tettamanti wrote:
>>     
>>>> Actually 0xfff2 is in the middle of an instruction.
>>>>
>>>> I'm guessing an 'out' instruction triggered the reboot, and 
>>>> skip_emulated_instruction() added 2 to rip.
>>>>     
>>>>         
>>> I think you're right; the reset is triggered by an outb to 0x64.
>>>
>>> Now, with this patch:
>>>
>>> diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
>>> index 491c32c..722d838 100644
>>> --- a/qemu/qemu-kvm.c
>>> +++ b/qemu/qemu-kvm.c
>>> @@ -706,8 +706,12 @@ static void update_regs_for_sipi(CPUState *env)
>>>   static void update_regs_for_init(CPUState *env)
>>>  {
>>> -    cpu_reset(env);
>>> -    load_regs(env);
>>> +    if (env->cpu_index) {
>>> +        cpu_reset(env);
>>> +        load_regs(env);
>>> +    } else {
>>> +         vcpu_info[env->cpu_index].init = 0;
>>> +    }
>>>  }
>>>   
>>>       
>> Can you explain this patch?  Why is the boot cpu treated differently?
>> I think the only difference should be the halted flag.
>>     
>
> The reset has already been done by qmeu_system_reset(), so it's
> superfluous. Furthermore, the extra reset causes the vmentry failure. 

I just committed a patch which prevented .init from being set to 1 on 
cpu_index == 0.

> I
> still don't understand which check is failing though...
>
>   

These are tough...

>>> the #GP makes more sense than the vm entry failure if the the emulator
>>> is jumping to fff2.
>>>       
>> Right.  Maybe the processor dropped out of vm86 mode and we're getting #gp 
>> on ds.
>>     
>
> Ok, the culprit really is skip_emulated_instruction: skipping the
> increment when EIP is 0xfff0 allows rebooting (yes, it's disgusting...)
>
> So I think that there are two different issues:
>
> 1) Extra reset in update_regs_for_init causes vm entry failure due to
>    invalid guest state
>
> 2) The emulator is doing something wrong since it used to handle the
>    reset just fine
>   

It may have been timing.  kvm continued to run for a bit, reaching a 
non-emulated instruction, and then the reset hit it in the face.  The 
reset is much quicker now.

We should probably both fix the kernel to handle reset-during-emulation 
correctly (one ugly way is to zero the instruction length if we're 
setting rip), and fix userspace to delay reset like it used to for 
compatibility with older kernels.

-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to