public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] bios: Fix MADT corruption and RSDT size when using -acpitable
@ 2009-05-14  0:52 Vincent Minet
  2009-05-14  0:59 ` Anthony Liguori
  0 siblings, 1 reply; 5+ messages in thread
From: Vincent Minet @ 2009-05-14  0:52 UTC (permalink / raw)
  To: kvm

External ACPI tables are counted twice for the RSDT size and the load
address for the first external table is in the MADT (interrupt override
entries are overwritten).

Signed-off-by: Vincent Minet <vincent@vincent-minet.net>
---
 kvm/bios/rombios32.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
index cbd5f15..289361b 100755
--- a/kvm/bios/rombios32.c
+++ b/kvm/bios/rombios32.c
@@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
     addr = base_addr = ram_size - ACPI_DATA_SIZE;
     rsdt_addr = addr;
     rsdt = (void *)(addr);
-    rsdt_size = sizeof(*rsdt) + external_tables * 4;
+    rsdt_size = sizeof(*rsdt);
     addr += rsdt_size;
 
     fadt_addr = addr;
@@ -1787,6 +1787,7 @@ void acpi_bios_init(void)
             }
             int_override++;
             madt_size += sizeof(struct madt_int_override);
+            addr += sizeof(struct madt_int_override);
         }
         acpi_build_table_header((struct acpi_table_header *)madt,
                                 "APIC", madt_size, 1);
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] bios: Fix MADT corruption and RSDT size when using -acpitable
  2009-05-14  0:52 [PATCH] bios: Fix MADT corruption and RSDT size when using -acpitable Vincent Minet
@ 2009-05-14  0:59 ` Anthony Liguori
  2009-05-14 16:20   ` Beth Kon
  0 siblings, 1 reply; 5+ messages in thread
From: Anthony Liguori @ 2009-05-14  0:59 UTC (permalink / raw)
  To: Vincent Minet; +Cc: kvm, beth kon

Vincent Minet wrote:
> External ACPI tables are counted twice for the RSDT size and the load
> address for the first external table is in the MADT (interrupt override
> entries are overwritten).
>
> Signed-off-by: Vincent Minet <vincent@vincent-minet.net>
>   

Beth,

I think you had a patch attempting to address the same issue.  It was a 
bit more involved though.

Which is the proper fix and are they both to the same problem?

Regards,

Anthony Liguori

> ---
>  kvm/bios/rombios32.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
> index cbd5f15..289361b 100755
> --- a/kvm/bios/rombios32.c
> +++ b/kvm/bios/rombios32.c
> @@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
>      addr = base_addr = ram_size - ACPI_DATA_SIZE;
>      rsdt_addr = addr;
>      rsdt = (void *)(addr);
> -    rsdt_size = sizeof(*rsdt) + external_tables * 4;
> +    rsdt_size = sizeof(*rsdt);
>      addr += rsdt_size;
>  
>      fadt_addr = addr;
> @@ -1787,6 +1787,7 @@ void acpi_bios_init(void)
>              }
>              int_override++;
>              madt_size += sizeof(struct madt_int_override);
> +            addr += sizeof(struct madt_int_override);
>          }
>          acpi_build_table_header((struct acpi_table_header *)madt,
>                                  "APIC", madt_size, 1);
>   


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] bios: Fix MADT corruption and RSDT size when using  -acpitable
  2009-05-14  0:59 ` Anthony Liguori
@ 2009-05-14 16:20   ` Beth Kon
  2009-05-15 16:13     ` Marcelo Tosatti
  0 siblings, 1 reply; 5+ messages in thread
From: Beth Kon @ 2009-05-14 16:20 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: Vincent Minet, kvm

[-- Attachment #1: Type: text/plain, Size: 2689 bytes --]

Anthony Liguori wrote:
> Vincent Minet wrote:
>> External ACPI tables are counted twice for the RSDT size and the load
>> address for the first external table is in the MADT (interrupt override
>> entries are overwritten).
>>
>> Signed-off-by: Vincent Minet <vincent@vincent-minet.net>
>>   
>
> Beth,
>
> I think you had a patch attempting to address the same issue.  It was 
> a bit more involved though.
>
> Which is the proper fix and are they both to the same problem?
They are for 2 different bases. My patch was for qemu's bochs bios and 
this is for qemu-kvm/kvm/bios/rombios32.c. They are pretty divergent in 
this area of setting up the ACPI tables. My patch is still needed for 
the qemu base. I hope we'll be getting to one base soon :-)

Assuming the intent of the code was for MAX_RSDT_ENTRIES to include 
external_tables, this patch looks correct. I think one additional check 
would be needed (in my patch) to make sure that the code doesn't exceed 
MAX_RSDT_ENTRIES when the external tables are being loaded.

My patch also puts all the code that calculates madt_size in the same 
place, at the beginning of the table layout. I believe this is neater 
and will avoid problems like this one in the future. As much as 
possible, I think it best to get all the tables layed out, then fill 
them in. If for some reason this is not acceptable, we need to add a big 
note that no tables should be layed out after the madt because the madt 
may grow further down in the code and overwrite the other table.
>


>
> Regards,
>
> Anthony Liguori
>
>> ---
>>  kvm/bios/rombios32.c |    3 ++-
>>  1 files changed, 2 insertions(+), 1 deletions(-)
>>
>> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
>> index cbd5f15..289361b 100755
>> --- a/kvm/bios/rombios32.c
>> +++ b/kvm/bios/rombios32.c
>> @@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
>>      addr = base_addr = ram_size - ACPI_DATA_SIZE;
>>      rsdt_addr = addr;
>>      rsdt = (void *)(addr);
>> -    rsdt_size = sizeof(*rsdt) + external_tables * 4;
>> +    rsdt_size = sizeof(*rsdt);
>>      addr += rsdt_size;
>>  
>>      fadt_addr = addr;
>> @@ -1787,6 +1787,7 @@ void acpi_bios_init(void)
>>              }
>>              int_override++;
>>              madt_size += sizeof(struct madt_int_override);
>> +            addr += sizeof(struct madt_int_override);
>>          }
>>          acpi_build_table_header((struct acpi_table_header *)madt,
>>                                  "APIC", madt_size, 1);
>>   
>
> -- 
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


[-- Attachment #2: acpi_tables_fix_2.patch --]
[-- Type: text/x-patch, Size: 2729 bytes --]

diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
index cbd5f15..23835b6 100755
--- a/kvm/bios/rombios32.c
+++ b/kvm/bios/rombios32.c
@@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
     addr = base_addr = ram_size - ACPI_DATA_SIZE;
     rsdt_addr = addr;
     rsdt = (void *)(addr);
-    rsdt_size = sizeof(*rsdt) + external_tables * 4;
+    rsdt_size = sizeof(*rsdt);
     addr += rsdt_size;
 
     fadt_addr = addr;
@@ -1665,6 +1665,7 @@ void acpi_bios_init(void)
 
     addr = (addr + 7) & ~7;
     madt_addr = addr;
+    madt = (void *)(addr);
     madt_size = sizeof(*madt) +
         sizeof(struct madt_processor_apic) * MAX_CPUS +
 #ifdef BX_QEMU
@@ -1672,7 +1673,11 @@ void acpi_bios_init(void)
 #else
         sizeof(struct madt_io_apic);
 #endif
-    madt = (void *)(addr);
+    for ( i = 0; i < 16; i++ ) {
+        if ( PCI_ISA_IRQ_MASK & (1U << i) ) {
+            madt_size += sizeof(struct madt_int_override);
+        }
+    }
     addr += madt_size;
 
 #ifdef BX_QEMU
@@ -1786,7 +1791,6 @@ void acpi_bios_init(void)
                 continue;
             }
             int_override++;
-            madt_size += sizeof(struct madt_int_override);
         }
         acpi_build_table_header((struct acpi_table_header *)madt,
                                 "APIC", madt_size, 1);
@@ -1868,17 +1872,6 @@ void acpi_bios_init(void)
     acpi_build_table_header((struct  acpi_table_header *)hpet,
                              "HPET", sizeof(*hpet), 1);
 #endif
-
-    acpi_additional_tables(); /* resets cfg to required entry */
-    for(i = 0; i < external_tables; i++) {
-        uint16_t len;
-        if(acpi_load_table(i, addr, &len) < 0)
-            BX_PANIC("Failed to load ACPI table from QEMU\n");
-        rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(addr);
-        addr += len;
-        if(addr >= ram_size)
-            BX_PANIC("ACPI table overflow\n");
-    }
 #endif
 
     /* RSDT */
@@ -1891,6 +1884,16 @@ void acpi_bios_init(void)
 //  rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(hpet_addr);
     if (nb_numa_nodes > 0)
         rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(srat_addr);
+    acpi_additional_tables(); /* resets cfg to required entry */
+    for(i = 0; i < external_tables; i++) {
+        uint16_t len;
+        if(acpi_load_table(i, addr, &len) < 0)
+            BX_PANIC("Failed to load ACPI table from QEMU\n");
+        rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(addr);
+        addr += len;
+        if((addr >= ram_size) || (nb_rsdt_entries + 1 > MAX_RSDT_ENTRIES)) 
+            BX_PANIC("ACPI table overflow\n");
+    }
 #endif
     rsdt_size -= MAX_RSDT_ENTRIES * 4;
     rsdt_size += nb_rsdt_entries * 4;

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] bios: Fix MADT corruption and RSDT size when using -acpitable
  2009-05-14 16:20   ` Beth Kon
@ 2009-05-15 16:13     ` Marcelo Tosatti
  2009-05-15 18:24       ` Beth Kon
  0 siblings, 1 reply; 5+ messages in thread
From: Marcelo Tosatti @ 2009-05-15 16:13 UTC (permalink / raw)
  To: Beth Kon, Gleb Natapov; +Cc: Anthony Liguori, Vincent Minet, kvm

Beth,

On Thu, May 14, 2009 at 12:20:29PM -0400, Beth Kon wrote:
> Anthony Liguori wrote:
>> Vincent Minet wrote:
>>> External ACPI tables are counted twice for the RSDT size and the load
>>> address for the first external table is in the MADT (interrupt override
>>> entries are overwritten).
>>>
>>> Signed-off-by: Vincent Minet <vincent@vincent-minet.net>
>>>   
>>
>> Beth,
>>
>> I think you had a patch attempting to address the same issue.  It was  
>> a bit more involved though.
>>
>> Which is the proper fix and are they both to the same problem?
> They are for 2 different bases. My patch was for qemu's bochs bios and  
> this is for qemu-kvm/kvm/bios/rombios32.c. They are pretty divergent in  
> this area of setting up the ACPI tables. My patch is still needed for  
> the qemu base. I hope we'll be getting to one base soon :-)
>
> Assuming the intent of the code was for MAX_RSDT_ENTRIES to include  
> external_tables, this patch looks correct. I think one additional check  
> would be needed (in my patch) to make sure that the code doesn't exceed  
> MAX_RSDT_ENTRIES when the external tables are being loaded.
>
> My patch also puts all the code that calculates madt_size in the same  
> place, at the beginning of the table layout. I believe this is neater  
> and will avoid problems like this one in the future. As much as  
> possible, I think it best to get all the tables layed out, then fill  
> them in. If for some reason this is not acceptable, we need to add a big  
> note that no tables should be layed out after the madt because the madt  
> may grow further down in the code and overwrite the other table.

I like this better too, see questions/comments below.

>>
>> Regards,
>>
>> Anthony Liguori
>>
>>> ---
>>>  kvm/bios/rombios32.c |    3 ++-
>>>  1 files changed, 2 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
>>> index cbd5f15..289361b 100755
>>> --- a/kvm/bios/rombios32.c
>>> +++ b/kvm/bios/rombios32.c
>>> @@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
>>>      addr = base_addr = ram_size - ACPI_DATA_SIZE;
>>>      rsdt_addr = addr;
>>>      rsdt = (void *)(addr);
>>> -    rsdt_size = sizeof(*rsdt) + external_tables * 4;
>>> +    rsdt_size = sizeof(*rsdt);
>>>      addr += rsdt_size;
>>>       fadt_addr = addr;
>>> @@ -1787,6 +1787,7 @@ void acpi_bios_init(void)
>>>              }
>>>              int_override++;
>>>              madt_size += sizeof(struct madt_int_override);
>>> +            addr += sizeof(struct madt_int_override);
>>>          }
>>>          acpi_build_table_header((struct acpi_table_header *)madt,
>>>                                  "APIC", madt_size, 1);
>>>   


> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
> index cbd5f15..23835b6 100755
> --- a/kvm/bios/rombios32.c
> +++ b/kvm/bios/rombios32.c
> @@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
>      addr = base_addr = ram_size - ACPI_DATA_SIZE;
>      rsdt_addr = addr;
>      rsdt = (void *)(addr);
> -    rsdt_size = sizeof(*rsdt) + external_tables * 4;
> +    rsdt_size = sizeof(*rsdt);
>      addr += rsdt_size;
>  
>      fadt_addr = addr;
> @@ -1665,6 +1665,7 @@ void acpi_bios_init(void)
>  
>      addr = (addr + 7) & ~7;
>      madt_addr = addr;
> +    madt = (void *)(addr);
>      madt_size = sizeof(*madt) +
>          sizeof(struct madt_processor_apic) * MAX_CPUS +
>  #ifdef BX_QEMU
> @@ -1672,7 +1673,11 @@ void acpi_bios_init(void)
>  #else
>          sizeof(struct madt_io_apic);
>  #endif
> -    madt = (void *)(addr);
> +    for ( i = 0; i < 16; i++ ) {
> +        if ( PCI_ISA_IRQ_MASK & (1U << i) ) {
> +            madt_size += sizeof(struct madt_int_override);
> +        }
> +    }
>      addr += madt_size;

This bug could only affect the HPET descriptor right? 

>  #ifdef BX_QEMU
> @@ -1786,7 +1791,6 @@ void acpi_bios_init(void)
>                  continue;
>              }
>              int_override++;
> -            madt_size += sizeof(struct madt_int_override);
>          }
>          acpi_build_table_header((struct acpi_table_header *)madt,
>                                  "APIC", madt_size, 1);
> @@ -1868,17 +1872,6 @@ void acpi_bios_init(void)
>      acpi_build_table_header((struct  acpi_table_header *)hpet,
>                               "HPET", sizeof(*hpet), 1);
>  #endif
> -
> -    acpi_additional_tables(); /* resets cfg to required entry */
> -    for(i = 0; i < external_tables; i++) {
> -        uint16_t len;
> -        if(acpi_load_table(i, addr, &len) < 0)
> -            BX_PANIC("Failed to load ACPI table from QEMU\n");
> -        rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(addr);
> -        addr += len;
> -        if(addr >= ram_size)
> -            BX_PANIC("ACPI table overflow\n");
> -    }

The external ACPI tables fix(es) are logically separate from the MADT
intoverride size calculation, and so they could be separate patches?

>  #endif
>  
>      /* RSDT */
> @@ -1891,6 +1884,16 @@ void acpi_bios_init(void)
>  //  rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(hpet_addr);
>      if (nb_numa_nodes > 0)
>          rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(srat_addr);
> +    acpi_additional_tables(); /* resets cfg to required entry */
> +    for(i = 0; i < external_tables; i++) {
> +        uint16_t len;
> +        if(acpi_load_table(i, addr, &len) < 0)
> +            BX_PANIC("Failed to load ACPI table from QEMU\n");
> +        rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(addr);
> +        addr += len;
> +        if((addr >= ram_size) || (nb_rsdt_entries + 1 > MAX_RSDT_ENTRIES)) 
> +            BX_PANIC("ACPI table overflow\n");
> +    }
>  #endif
>      rsdt_size -= MAX_RSDT_ENTRIES * 4;
>      rsdt_size += nb_rsdt_entries * 4;


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] bios: Fix MADT corruption and RSDT size when using -acpitable
  2009-05-15 16:13     ` Marcelo Tosatti
@ 2009-05-15 18:24       ` Beth Kon
  0 siblings, 0 replies; 5+ messages in thread
From: Beth Kon @ 2009-05-15 18:24 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: Gleb Natapov, Anthony Liguori, Vincent Minet, kvm

Marcelo Tosatti wrote:
> Beth,
>
> On Thu, May 14, 2009 at 12:20:29PM -0400, Beth Kon wrote:
>   
>> Anthony Liguori wrote:
>>     
>>> Vincent Minet wrote:
>>>       
>>>> External ACPI tables are counted twice for the RSDT size and the load
>>>> address for the first external table is in the MADT (interrupt override
>>>> entries are overwritten).
>>>>
>>>> Signed-off-by: Vincent Minet <vincent@vincent-minet.net>
>>>>   
>>>>         
>>> Beth,
>>>
>>> I think you had a patch attempting to address the same issue.  It was  
>>> a bit more involved though.
>>>
>>> Which is the proper fix and are they both to the same problem?
>>>       
>> They are for 2 different bases. My patch was for qemu's bochs bios and  
>> this is for qemu-kvm/kvm/bios/rombios32.c. They are pretty divergent in  
>> this area of setting up the ACPI tables. My patch is still needed for  
>> the qemu base. I hope we'll be getting to one base soon :-)
>>
>> Assuming the intent of the code was for MAX_RSDT_ENTRIES to include  
>> external_tables, this patch looks correct. I think one additional check  
>> would be needed (in my patch) to make sure that the code doesn't exceed  
>> MAX_RSDT_ENTRIES when the external tables are being loaded.
>>
>> My patch also puts all the code that calculates madt_size in the same  
>> place, at the beginning of the table layout. I believe this is neater  
>> and will avoid problems like this one in the future. As much as  
>> possible, I think it best to get all the tables layed out, then fill  
>> them in. If for some reason this is not acceptable, we need to add a big  
>> note that no tables should be layed out after the madt because the madt  
>> may grow further down in the code and overwrite the other table.
>>     
>
> I like this better too, see questions/comments below.
>
>   
>>> Regards,
>>>
>>> Anthony Liguori
>>>
>>>       
>>>> ---
>>>>  kvm/bios/rombios32.c |    3 ++-
>>>>  1 files changed, 2 insertions(+), 1 deletions(-)
>>>>
>>>> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
>>>> index cbd5f15..289361b 100755
>>>> --- a/kvm/bios/rombios32.c
>>>> +++ b/kvm/bios/rombios32.c
>>>> @@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
>>>>      addr = base_addr = ram_size - ACPI_DATA_SIZE;
>>>>      rsdt_addr = addr;
>>>>      rsdt = (void *)(addr);
>>>> -    rsdt_size = sizeof(*rsdt) + external_tables * 4;
>>>> +    rsdt_size = sizeof(*rsdt);
>>>>      addr += rsdt_size;
>>>>       fadt_addr = addr;
>>>> @@ -1787,6 +1787,7 @@ void acpi_bios_init(void)
>>>>              }
>>>>              int_override++;
>>>>              madt_size += sizeof(struct madt_int_override);
>>>> +            addr += sizeof(struct madt_int_override);
>>>>          }
>>>>          acpi_build_table_header((struct acpi_table_header *)madt,
>>>>                                  "APIC", madt_size, 1);
>>>>   
>>>>         
>
>
>   
>> diff --git a/kvm/bios/rombios32.c b/kvm/bios/rombios32.c
>> index cbd5f15..23835b6 100755
>> --- a/kvm/bios/rombios32.c
>> +++ b/kvm/bios/rombios32.c
>> @@ -1626,7 +1626,7 @@ void acpi_bios_init(void)
>>      addr = base_addr = ram_size - ACPI_DATA_SIZE;
>>      rsdt_addr = addr;
>>      rsdt = (void *)(addr);
>> -    rsdt_size = sizeof(*rsdt) + external_tables * 4;
>> +    rsdt_size = sizeof(*rsdt);
>>      addr += rsdt_size;
>>  
>>      fadt_addr = addr;
>> @@ -1665,6 +1665,7 @@ void acpi_bios_init(void)
>>  
>>      addr = (addr + 7) & ~7;
>>      madt_addr = addr;
>> +    madt = (void *)(addr);
>>      madt_size = sizeof(*madt) +
>>          sizeof(struct madt_processor_apic) * MAX_CPUS +
>>  #ifdef BX_QEMU
>> @@ -1672,7 +1673,11 @@ void acpi_bios_init(void)
>>  #else
>>          sizeof(struct madt_io_apic);
>>  #endif
>> -    madt = (void *)(addr);
>> +    for ( i = 0; i < 16; i++ ) {
>> +        if ( PCI_ISA_IRQ_MASK & (1U << i) ) {
>> +            madt_size += sizeof(struct madt_int_override);
>> +        }
>> +    }
>>      addr += madt_size;
>>     
>
> This bug could only affect the HPET descriptor right? 
>   
I'm not sure what you're asking. There were 2 bugs that Vincent pointed 
out. The first caused an incorrect rsdt_size to be reported, and the 
second (missing addr += sizeof(struct madt_int_override)) caused 
corruption of whatever came after the MADT. But even if his patch were 
applied, any future code that added a table and manipulated addr between 
the following points:

...
(about line 1676)
madt = (void *)(addr);
addr += madt_size;
...
(about line 1789)
madt_size += sizeof(struct madt_int_override);
addr += sizeof(struct madt_int_override);

would have wound up causing some kind of corruption, as happened with 
the HPET. Also the "memset(madt, 0, madt_size)" around line 1740 was not 
using the complete madt_size.

So this seems undesirable, and that's why I suggested moving all addr 
manipulation (with the exception of additional tables at the very end) 
to the same section of the table layout code. Seems best to manage 
madt_size all in one place.

>   
>>  #ifdef BX_QEMU
>> @@ -1786,7 +1791,6 @@ void acpi_bios_init(void)
>>                  continue;
>>              }
>>              int_override++;
>> -            madt_size += sizeof(struct madt_int_override);
>>          }
>>          acpi_build_table_header((struct acpi_table_header *)madt,
>>                                  "APIC", madt_size, 1);
>> @@ -1868,17 +1872,6 @@ void acpi_bios_init(void)
>>      acpi_build_table_header((struct  acpi_table_header *)hpet,
>>                               "HPET", sizeof(*hpet), 1);
>>  #endif
>> -
>> -    acpi_additional_tables(); /* resets cfg to required entry */
>> -    for(i = 0; i < external_tables; i++) {
>> -        uint16_t len;
>> -        if(acpi_load_table(i, addr, &len) < 0)
>> -            BX_PANIC("Failed to load ACPI table from QEMU\n");
>> -        rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(addr);
>> -        addr += len;
>> -        if(addr >= ram_size)
>> -            BX_PANIC("ACPI table overflow\n");
>> -    }
>>     
>
> The external ACPI tables fix(es) are logically separate from the MADT
> intoverride size calculation, and so they could be separate patches?
>   
Yes that's true.
>>  #endif
>>  
>>      /* RSDT */
>> @@ -1891,6 +1884,16 @@ void acpi_bios_init(void)
>>  //  rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(hpet_addr);
>>      if (nb_numa_nodes > 0)
>>          rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(srat_addr);
>> +    acpi_additional_tables(); /* resets cfg to required entry */
>> +    for(i = 0; i < external_tables; i++) {
>> +        uint16_t len;
>> +        if(acpi_load_table(i, addr, &len) < 0)
>> +            BX_PANIC("Failed to load ACPI table from QEMU\n");
>> +        rsdt->table_offset_entry[nb_rsdt_entries++] = cpu_to_le32(addr);
>> +        addr += len;
>> +        if((addr >= ram_size) || (nb_rsdt_entries + 1 > MAX_RSDT_ENTRIES)) 
>> +            BX_PANIC("ACPI table overflow\n");
>> +    }
>>  #endif
>>      rsdt_size -= MAX_RSDT_ENTRIES * 4;
>>      rsdt_size += nb_rsdt_entries * 4;
>>     
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>   


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-05-15 18:23 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-14  0:52 [PATCH] bios: Fix MADT corruption and RSDT size when using -acpitable Vincent Minet
2009-05-14  0:59 ` Anthony Liguori
2009-05-14 16:20   ` Beth Kon
2009-05-15 16:13     ` Marcelo Tosatti
2009-05-15 18:24       ` Beth Kon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox