On Fri, May 8, 2009 at 8:35 PM, Myles Watson <[email protected]> wrote:
> On Fri, May 8, 2009 at 9:06 PM, ron minnich <[email protected]> wrote:
>> I don't understand this code.
>>
>> Here it is.
>>
>> #if (HAVE_OPTION_TABLE == 1)
>> {
>> struct lb_record *rec_dest, *rec_src;
>> /* Write the option config table... */
>> rec_dest = lb_new_record(head);
>> rec_src = (struct lb_record *)(void *)&option_table;
>> memcpy(rec_dest, rec_src, rec_src->size);
>> /* Create cmos checksum entry in coreboot table */
>> lb_cmos_checksum(head);
>> }
>> #endif
>>
>>
>> Note the cast of rec_src.
> I guess I'm clueless what that actually does. It looks like an
> unsigned char* getting cast to a void* then to a lb_record*.
>
> I wouldn't expect that to change the value.
This is an lb_record
struct lb_record {
uint32_t tag; /* tag ID */
uint32_t size; /* size of record (in bytes) */
};
option_table is an array of bytes, not a struct. I can see if there is
a filled-in option table this might work, but not in this case:
unsigned char option_table[] = {
};
Which turns into a four byte quantity, which in terms of the lb_record
is a four byte tag of zero and then a length of ... whatever comes
after option_table!
This code needs some fixing. I have a simple hack but I'd rather do
something better than what we have now. It will need repair to the
build_opt_tbl tool.
ron
--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot