<br><br><div class="gmail_quote">On Thu, Mar 25, 2010 at 10:39 AM, Stefan Reinauer <span dir="ltr"><<a href="mailto:stepan@coresystems.de">stepan@coresystems.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">On 3/25/10 5:18 PM, Myles Watson wrote:<br>
><br>
>> On Thu, Mar 25, 2010 at 7:56 AM, Myles Watson <<a href="mailto:mylesgw@gmail.com">mylesgw@gmail.com</a>> wrote:<br>
>><br>
>><br>
>>> It seems like others must have this problem of needing to force a binary<br>
>>> blob into a struct.<br>
>>><br>
>> Hi, I've only been following this at a distance. I assume this all<br>
>> happens after memory is turned on. Why not just have a function to<br>
>> fill the struct given the binary blob? I'm starting to worry about all<br>
>> the tricks people want to play with gcc.<br>
>><br>
> Memory is on.  The blob is in flash, and the first bit of the blob is the<br>
> header with the length field.<br>
><br>
> We do a memcpy from flash to the struct,<br>
</div>Actually this is a memcpy from memory to the cbmem area,</blockquote><div>You're right, since it gets copied to memory with the rest of coreboot_ram.<br> <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
 but after it's<br>
copied it's not treated as a struct anymore.<br><div class="im"></div></blockquote><div>Except when you patch it?<br> <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">
> but first we have to cast it to a<br>
> header so we can read out the length to copy.<br>
</div>Which makes me think if there are not other ways to determine the size<br>
of an array. Maybe sizeof(AmlCode) ?<br></blockquote><div>I tried that.  It doesn't work because it's an incomplete type.<br> <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div class="im"><br>
> Gcc doesn't like the cast, so<br>
> we just declare that we have the header stored in flash.<br>
><br>
> One way to solve it would be to copy the header first, then read the length<br>
> and copy the rest...<br>
><br>
><br>
</div>That's more copying than my variant with the extra pointer. Since we<br>
copied (or uncompressed) the dsdt from flash to ram already before, and<br>
are going to make another copy, I suggest rather keeping an extra 4<br>
bytes, than copying the complete header for no apparent reason...<font color="#888888"><br></font></blockquote><div>The reason I object to the void* method was that it just masked the problem so that gcc couldn't spot it.  Casting to void* and back to a struct seems equivalent to just having it declared two different ways.<br>
<br>Copying the header first works (boot tested), and if you want to save the redundant copy, we could start after the header for the second copy.<br><br> Index: svn/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c<br>
===================================================================<br>--- svn.orig/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c<br>+++ svn/src/mainboard/amd/serengeti_cheetah_fam10/acpi_tables.c<br>@@ -47,7 +47,7 @@ static void dump_mem(u32 start, u32 end)<br>
 #endif<br> <br> extern const acpi_header_t AmlCode;<br>-extern const acpi_header_t AmlCode_ssdt;<br>+extern const unsigned char AmlCode_ssdt[];<br> <br> #if CONFIG_ACPI_SSDTX_NUM >= 1<br> extern const acpi_header_t AmlCode_ssdt2;<br>
@@ -264,8 +264,10 @@ unsigned long write_acpi_tables(unsigned<br>     current      = ( current + 0x0f) & -0x10;<br>     printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);<br>     ssdt = (acpi_header_t *)current;<br>
-    current += AmlCode_ssdt.length;<br>-    memcpy((void *)ssdt, &AmlCode_ssdt, AmlCode_ssdt.length);<br>+    memcpy(ssdt, &AmlCode_ssdt[0], sizeof(acpi_header_t));<br>+    current += ssdt->length;<br>+    printk(BIOS_DEBUG, "ssdt->length %x\n", ssdt->length);<br>
+    memcpy(ssdt, &AmlCode_ssdt[0], ssdt->length);<br>     //Here you need to set value in pci1234, sblk and sbdn in get_bus_conf.c<br>     update_ssdt((void*)ssdt);<br>     /* recalculate checksum */<br><br></div>
</div>Thanks,<br>Myles<br>