Alignment of LinuxBIOS table structures

Ronald G. Minnich rminnich at lanl.gov
Sun Nov 28 18:19:00 CET 2004


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. 

ron



More information about the coreboot mailing list