[SeaBIOS] Qemu-kvm VM halt at allocate VGA stack when continuously reset VM

Xulei (Stone) stone.xulei at huawei.com
Tue Dec 1 09:35:46 CET 2015




>
>
>>On Sat, Nov 28, 2015 at 07:12:47AM +0000, Xulei (Stone) wrote:
>>> Hi,
>>> Recently, i use a script to continuously reset a VM and
>>> i found my VM frequently halts at "Attempting to allocate
>>> VGA stack via pmm call". After analyzing, i think it may
>>> be a problem of SeaBIOS.
>>>
>>> From the log(attached below), we can see handle_post()
>>> executes twice and this makes the destination address of
>>> "Relocating init" change when the 2nd reset command comes.
>>> This also influences on the source address of "Copying MPTABLE".
>>> At last, the VM will be stuck at attempting to allocate VGA
>>> stack via pmm call.
>>>
>>> Could you offer me a solution to fix this problem?
>>>
>>> ==============bad SeaBIOS log======
>>> SeaBIOS (version rel-1.8.1-0-g4adadbd-20151127_220019-UVP)
>>> No Xen hypervisor found.
>>> Running on QEMU (i440fx)
>>> Running on KVM
>>> RamSize: 0xc0000000 [cmos]
>>> Now vcpu cpu_id = 0                                          <<========= i add
>>> Static seabios entry times =1                                <<========= i add
>>> Relocating init from 0x000dbb30 to 0xbffad2c0 (size 76928)
>>> Found QEMU fw_cfg
>>> SeaBIOS (version rel-1.8.1-0-g4adadbd-20151127_220019-UVP)   <<=========  handle_post() execute again?
>>
>>If seabios resets before it sets HaveRunPost then it probably wont
>>work well, as it will rerun the POST code without resetting the global
>>variables it has modified.
>>
>>Unfortunately, it's not clear to me that we can simply move the
>>setting of HaveRunPost to an earlier point, as the handle_resume()
>>code would need to be audited to ensure it can run even if POST hasn't
>>completed.
>
>I move HaveRunPost = 1 in the very early point of POST phase (begin
>at handle_post()), so that when the 2nd reset comes, HaveRunPost is
>already 1 which makes entry_post jmps to handle_resume() instead of
>handle_post(). As we know, handle_resume() will reset all global variables.
>
>Can you tell me is this solution ok? or, does this have some side effects?

Sorry, i've tested and this seems not work. Let HaveRunPost = 1 at begin
of handle_post(), will lead the VM to loop forever in the resume phase.
It seems the memcpy() in qemu_prep_reset()can not clear HaveRunPost at
this time.

Ah! I'm confused! I don't know where is the right place to let HaveRunPost = 1?
>>So, it looks like a fix for this will take some further analysis.
>>
>>-Kevin 


More information about the SeaBIOS mailing list