[coreboot] romcc issue with bitfields and chars in static.c

Martin Roth martin.roth at se-eng.com
Wed Jan 30 20:07:00 CET 2013


Bleh.  This was a false path - it had nothing to do with romcc.  The 
issue was a #pragma pack(1) in one of the .h files.  Please see my 
subsequent commit for more information.

http://review.coreboot.org/#/c/2190/

Martin

On 01/21/2013 09:58 PM, Martin Roth wrote:
> I've run into what looks like an issue with how romcc handles 
> bitfields and chars vs how the structure in static.c is created.
> When I'm accessing a member of a structure that comes after a bitfield 
> or a single char  between dwords or pointers, the code is grabbing 
> data from a different address than the actual location of the data.  
> I've found that if I add extra "reserved" bits to the bitfield to fill 
> it up to a dword, and extra chars to do the same, everything works as 
> expected.
>
> I'm currently running into this trying to access data from the 
> 'device' structure from static.c in romstage.  If I don't add any 
> changes, I'm  getting a null pointer returned because I'm trying to 
> access my data 6 bytes too early: mov esi,DWORD PTR [eax+0x86]
>
> Here's what the structure currently looks like:
>
>     unsigned int    enabled : 1;    /* set if we should enable the 
> device */
>     unsigned int    initialized : 1; /* set if we have initialized the 
> device */
>     unsigned int    on_mainboard : 1;
>     struct pci_irq_info pci_irq_info[4];
>     u8 command;
> ...
>     ROMSTAGE_CONST void *chip_info;
>
>
> Here's how I need to fix it to access chip_info correctly:
>     unsigned int    enabled : 1;    /* set if we should enable the 
> device */
>     unsigned int    initialized : 1; /* set if we have initialized the 
> device */
>     unsigned int    on_mainboard : 1;
>     unsigned int    reserved : 29;
>     struct pci_irq_info pci_irq_info[4];
>     u8 command;
>     u8 res_1;
>     u8 res_2;
>     u8 res_3;
> ..
>     ROMSTAGE_CONST void *chip_info;
>
>
> This gives me the correct disassembly:  mov esi,DWORD PTR [eax+0x8c]
> and I pick up the pointer to chip_info correctly.  Note that with 
> these changes, the structure in memory doesn't change at all.
>
> TLDR: Structure is getting set up as dword aligned, but accessed by 
> romcc as if it were packed.
>
>
> Martin
>




More information about the coreboot mailing list