Alignment of LinuxBIOS table structures

Greg Watson gwatson at lanl.gov
Mon Nov 29 04:52:00 CET 2004


On Nov 28, 2004, at 9:34 PM, Ronald G. Minnich wrote:

>
>
> On Fri, 26 Nov 2004, Stefan Reinauer wrote:
>> The problem is that different compilers handle structure alignment
>> differently, ie 2.95.x and 3.x have fundamental differences here:
>
> stepan, from the point of view of Plan 9, these are the same compiler.
>
>> Adding __attribute__ ((packed)) to the structures helps:
>
> Sadly, Plan 9 compilers do not support this attribute for very good
> technical reasons. The problem then is that these tables will be hard 
> for
> Plan 9 to deal with.
>
>> struct lb_memory_range {
>> 	uint64_t start;
>> 	uint64_t size;
>> 	uint32_t type;
>> #define LB_MEM_RAM       1	/* Memory anyone can use */
>> #define LB_MEM_RESERVED  2	/* Don't use this memory region */
>> #define LB_MEM_TABLE     16	/* Ram configuration tables are kept in */
>> 	
>> } __attribute__ ((packed));
>
> There are two problems here.
>
> The first problem is the use of binary structures, followed by the use 
> of
> gcc attributes to make the structures have a certain "shape". I've just
> had a big tussle with this in Xen and Plan 9. Xen kind of assumes a gcc
> world and things fall apart badly when your compiler is not gcc. This 
> is
> going to happen with these binary structures when our payloads are not
> built with gcc compatible compilers -- which is already the case with 
> Plan
> 9 payloads.
>
> Second problem is, what happens if this or other LinuxBIOS tables need 
> to
> change at some future point? We're going to have different versions.
> Intel and Microsoft solve this versioning problem by putting a version
> number in binary tables. Hence in the _MP_ table there is a version 
> flag.
> This versioning of binary tables is a headache; what if you have to 
> boot a
> very old OS that realizes it can't parse table version 2, only table
> version 1? Oops. Trouble, that's what.
>
> I think the big problem is the use of binary data structures. It shows 
> how
> smart the Open Boot guys were to use strings, and they figured this 
> out 16
> years ago!
>
> I think we should look at having linuxbios create strings of data for
> tables, not binary tables. Long term, the binary tables are going to 
> cause
> us trouble, as they have already: having to use non-portable compiler
> options/attributes is a recipe for disaster. You only parse them once 
> to
> turn them into internal binary data structures in the OS; performance 
> is
> not an issue here.
>
> In Plan 9, the parameters are passed in as keyword-value pairs, viz:
> totalmem=0x100000
>
> This is easy to generate, and both Linux and Plan 9 and other OSes have
> more than enough functions in the kernel already to parse these. This
> removes special needs for alignment, packing, and so on.
>
> If you want you can generate Forth tables, which are also simple, but 
> in
> the end, I think we need to avoid the problems of binary tables.
>
> My real preference is for S-expressions, as they are totally
> character-oriented tables that can still provide structure such as 
> trees
> and tables, but I am not sure people will like S-expressions.

I agree, we need to get away from binary structures. Much as I like 
S-expressions, strings containing key/value pairs is probably the most 
common and easily understandable way to do it.

Greg




More information about the coreboot mailing list