[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: loadvm and APIC
From: |
Jan Kiszka |
Subject: |
[Qemu-devel] Re: loadvm and APIC |
Date: |
Tue, 17 Jun 2008 09:58:54 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 |
malc wrote:
> Here's the scenario:
>
> 1. Start QEMU and boot Linux capable of using APIC
> 2. Save the VM state
> 3. Exit QEMU
> 4. Start QEMU and loadvm
>
> Kernel instantly panics. Here's why:
>
> Upon starting eventually following happens:
> ... -> pc_init -> ... -> pit_irq_timer_update
> -> qemu_set_irq -> ...
> -> apic_local_deliver -> cpu_interrupt(CPU_INTERRUPT_HARD)
>
> Then qemu_loadvm_state begins executing load handlers eventually coming
> to apic_load which loads the state from the storage overriding all the
> effects of apic_local_deliver, in the meantime env->interrupt_request
> stays the same.
>
> Then cpu_exec is entered and it arrives at line 399 where
> cpu_get_pic_interrupt calls apic_get_interrupt which returns -1, this
> bogus interrupt number is then passed to do_interrupt and here it is
> finally caught by a IDT limit check at line 649, general protection
> fault is generated and kernel inside the VM panics.
>
> Hence:
>
> diff --git a/vl.c b/vl.c
> index d759fde..11827ba 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -6296,6 +6296,7 @@ void do_loadvm(const char *name)
> goto the_end;
> }
> ret = qemu_loadvm_state(f);
> + first_cpu->interrupt_request = 0;
> qemu_fclose(f);
> if (ret < 0) {
> term_printf("Error %d while loading VM state\n", ret);
>
> Okay to commit?
That is basically
http://permalink.gmane.org/gmane.comp.emulators.qemu/26215, which I
would prefer.
Jan
--
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux