[coreboot] [commit] r5286 - ...

Stefan Reinauer stepan at coresystems.de
Thu Mar 25 22:58:41 CET 2010


On 3/25/10 10:47 PM, Segher Boessenkool wrote:
>>>>> -extern unsigned char AmlCode[];
>>>>> +extern const acpi_header_t AmlCode;
>>>>>           
>>>> And we're positive, this always does the right thing with gcc?
>>>>         
>>> I am told that AmlCode is defined as array of (unsigned) char in
>>> some other file.  Declaring it as some other type here is not
>>> valid C, and *will* break with GCC, with some options (-combine
>>> or LTO at least) -- it will not compile.
>>>       
>> The biggest worry for me is incorrect execution.  If it doesn't compile
>> when
>> it breaks, then that's a good thing.
>>     
> It will probably _work_ with current GCC and no whole-program stuff,
> but how do you *know* it does?  Better to just fix it.
>
>   
I changed one as an example now...
I guess we could optimize to not copy the header twice, but the header
is really small, so i didn't care to make the code uglier.



Index: src/mainboard/intel/d945gclf/acpi_tables.c
===================================================================
--- src/mainboard/intel/d945gclf/acpi_tables.c    (revision 5297)
+++ src/mainboard/intel/d945gclf/acpi_tables.c    (working copy)
@@ -31,7 +31,7 @@
 
 #define OLD_ACPI 0
 
-extern const acpi_header_t AmlCode;
+extern unsigned char AmlCode[];
 #if CONFIG_HAVE_ACPI_SLIC
 unsigned long acpi_create_slic(unsigned long current);
 #endif
@@ -273,8 +273,10 @@
     acpi_create_facs(facs);
 
     dsdt = (acpi_header_t *) current;
-    current += AmlCode.length;
-    memcpy((void *) dsdt, &AmlCode, AmlCode.length);
+    memcpy((void *) dsdt, AmlCode, sizeof(acpi_header_t));
+    int len = dsdt->length;
+    current += len;
+    memcpy((void *) dsdt, AmlCode, len);
 
 #if OLD_ACPI
     for (i=0; i < dsdt->length; i++) {






More information about the coreboot mailing list