[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go be
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests |
Date: |
Tue, 16 Jul 2013 19:46:14 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 |
Il 16/07/2013 19:38, Eduardo Habkost ha scritto:
> On Tue, Jul 16, 2013 at 07:22:01PM +0200, Andrea Arcangeli wrote:
>> Without this patch the guest physical bits are advertised as 40, not
>> 44 or more depending on the hardware capability of the host.
>>
>> That leads to guest kernel crashes with injection of page faults 9
>> (see oops: 0009) as bits above 40 in the guest pagetables are
>> considered reserved.
>>
>> exregion-0206 [324572448] [17] ex_system_memory_space: System-Memory (width
>> 32) R/W 0 Address=00000000FED00000
>> BUG: unable to handle kernel paging request at ffffc9006030e000
>> IP: [<ffffffff812fbb6f>] acpi_ex_system_memory_space_handler+0x23e/0x2cb
>> PGD e01f875067 PUD 1001f075067 PMD e0178d8067 PTE 80000000fed00173
>> Oops: 0009 [#1] SMP
>>
>> (see PUD with bit >=40 set)
>
> I am not sure I understand what caused this: if we are advertising 40
> physical bits to the guest, why are we ending up with a PUD with
> bit >= 40 set?
Because we create a guest that has bigger memory than what we advertise
in CPUID.
>>
>> Signed-off-by: Andrea Arcangeli <address@hidden>
>> Reported-by: Chegu Vinod <address@hidden>
>> ---
>> target-i386/cpu.c | 6 ++++++
>> 1 file changed, 6 insertions(+)
>>
>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>> index e3f75a8..0e65673 100644
>> --- a/target-i386/cpu.c
>> +++ b/target-i386/cpu.c
>> @@ -2108,6 +2108,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index,
>> uint32_t count,
>> /* 64 bit processor */
>> /* XXX: The physical address space is limited to 42 bits in exec.c. */
>> *eax = 0x00003028; /* 48 bits virtual, 40 bits physical */
>> + if (kvm_enabled()) {
>> + uint32_t _eax;
>> + host_cpuid(0x80000000, 0, &_eax, NULL, NULL, NULL);
>> + if (_eax >= 0x80000008)
>> + host_cpuid(0x80000008, 0, eax, NULL, NULL, NULL);
>> + }
>
> We can't expose a different virtual machine depending on host
> capabilities. What if we live-migrate between hosts with different
> physical address bit sizes?
Same as for vPMU or leaf 0xD: who knows. In practice, this has an
effect only for guests with 1T or more memory, otherwise the physical
memory is smaller than 40 bits.
Paolo
>> } else {
>> if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
>> *eax = 0x00000024; /* 36 bits physical */
>>
>
- [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Andrea Arcangeli, 2013/07/16
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Paolo Bonzini, 2013/07/16
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Eduardo Habkost, 2013/07/16
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests,
Paolo Bonzini <=
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Eduardo Habkost, 2013/07/16
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Paolo Bonzini, 2013/07/16
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Eduardo Habkost, 2013/07/16
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Paolo Bonzini, 2013/07/17
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Eduardo Habkost, 2013/07/17
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Paolo Bonzini, 2013/07/17
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Gleb Natapov, 2013/07/17
- Re: [Qemu-devel] [PATCH] fix guest physical bits to match host, to go beyond 1TB guests, Eduardo Habkost, 2013/07/17