[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PULL 13/21] apic_common: vapic_paddr synchronization f
From: |
Pavel Dovgaluk |
Subject: |
Re: [Qemu-devel] [PULL 13/21] apic_common: vapic_paddr synchronization fix |
Date: |
Fri, 19 Sep 2014 16:50:10 +0400 |
> From: Paolo Bonzini [mailto:address@hidden On Behalf Of Paolo Bonzini
> Il 19/09/2014 12:43, Pavel Dovgaluk ha scritto:
> > I've tested this patch with replay. I enabled VM reset (which was
> > previously disabled for
> replay)
> > while loading the VM state and discovered the following problem.
> > vapic_enable function in kvmapic.c retrieves cpu number with the
> > get_kpcr_number() function.
> > When cpu number is -1 vapic_enable exits and does not call
> > apic_enable_vapic, which should
> > setup vapic_paddr field.
> > Without this call vapic_paddr remains initialized with default value and
> > behavior of the
> virtual
> > machine becomes different.
>
> IIUC the fix would be to move part of vapic_enable out to its separate
> function, and call it from do_vapic_enable? Could you prepare a patch?
static int vapic_enable(VAPICROMState *s, X86CPU *cpu)
{
int cpu_number = get_kpcr_number(cpu);
hwaddr vapic_paddr;
static const uint8_t enabled = 1;
if (cpu_number < 0) {
return -1;
}
vapic_paddr = s->vapic_paddr +
(((hwaddr)cpu_number) << VAPIC_CPU_SHIFT);
cpu_physical_memory_write(vapic_paddr + offsetof(VAPICState, enabled),
&enabled, sizeof(enabled));
apic_enable_vapic(cpu->apic_state, vapic_paddr);
s->state = VAPIC_ACTIVE;
return 0;
}
vapic_paddr depends on cpu_number. cpu_number cannot be retrieved when
do_vapic_enable executes.
Thus we cannot reconstruct vapic_paddr in that function.
Pavel Dovgalyuk
- [Qemu-devel] [PULL 08/21] memory: add parameter errp to memory_region_init_rom_device, (continued)
- [Qemu-devel] [PULL 08/21] memory: add parameter errp to memory_region_init_rom_device, Paolo Bonzini, 2014/09/12
- [Qemu-devel] [PULL 09/21] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big, Paolo Bonzini, 2014/09/12
- [Qemu-devel] [PULL 07/21] memory: add parameter errp to memory_region_init_ram, Paolo Bonzini, 2014/09/12
- [Qemu-devel] [PULL 11/21] exec: add parameter errp to gethugepagesize, Paolo Bonzini, 2014/09/12
- [Qemu-devel] [PULL 10/21] exec: report error when memory < hpagesize, Paolo Bonzini, 2014/09/12
- [Qemu-devel] [PULL 05/21] rules.mak: Fix DSO build by pulling in archive symbols, Paolo Bonzini, 2014/09/12
- [Qemu-devel] [PULL 13/21] apic_common: vapic_paddr synchronization fix, Paolo Bonzini, 2014/09/12
Re: [Qemu-devel] [PULL 13/21] apic_common: vapic_paddr synchronization fix, Pavel Dovgaluk, 2014/09/26
[Qemu-devel] [PULL 14/21] cpu: init vmstate for ticks and clock offset, Paolo Bonzini, 2014/09/12
[Qemu-devel] [PULL 15/21] fdc: adding vmstate for save/restore, Paolo Bonzini, 2014/09/12
[Qemu-devel] [PULL 12/21] vl: use QLIST_FOREACH_SAFE to visit change state handlers, Paolo Bonzini, 2014/09/12
[Qemu-devel] [PULL 16/21] parallel: adding vmstate for save/restore, Paolo Bonzini, 2014/09/12
[Qemu-devel] [PULL 17/21] serial: fixing vmstate for save/restore, Paolo Bonzini, 2014/09/12