[LinuxBIOS] drop struct lb_uint64?

Stefan Reinauer stepan at openbios.org
Sun Nov 13 13:30:11 CET 2005


* Eric W. Biederman <ebiederman at lnxi.com> [051113 09:43]:
> I actually a little surprised you don't remember as I think you were
> the one who brought it to the list.  Someone was using the old
> definition which was uint64_t in a 64bit environment and they couldn't
> read the table.
 
Seems I was oblivious yesterday. You are right. Therefore I have
attached a patch to clean up lb_uint64 handling and comment it.

Looks Ok?

Stefan


-------------- next part --------------
Index: src/include/boot/linuxbios_tables.h
===================================================================
--- src/include/boot/linuxbios_tables.h	(revision 2085)
+++ src/include/boot/linuxbios_tables.h	(working copy)
@@ -31,7 +31,41 @@
  * table entries and be backwards compatible, but it is not required.
  */
 
+/* Since LinuxBIOS is usually compiled 32bit, gcc will align 64bit 
+ * types to 32bit boundaries. If the LinuxBIOS table is dumped on a 
+ * 64bit system, a uint64_t would be aligned to 64bit boundaries, 
+ * breaking the table format.
+ *
+ * lb_uint64 will keep 64bit LinuxBIOS table values aligned to 32bit
+ * to ensure compatibility. They can be accessed with the two functions
+ * below: unpack_lb64() and pack_lb64()
+ *
+ * See also: util/lbtdump/lbtdump.c
+ */
 
+struct lb_uint64 {
+	uint32_t lo;
+	uint32_t hi;
+};
+
+static inline uint64_t unpack_lb64(struct lb_uint64 value)
+{
+        uint64_t result;
+        result = value.hi;
+        result = (result << 32) + value.lo;
+        return result;
+}
+
+static inline struct lb_uint64 pack_lb64(uint64_t value)
+{
+        struct lb_uint64 result;
+        result.lo = (value >> 0) & 0xffffffff;
+        result.hi = (value >> 32) & 0xffffffff;
+        return result;
+}
+
+
+
 struct lb_header
 {
 	uint8_t  signature[4]; /* LBIO */
@@ -57,10 +91,6 @@
 
 #define LB_TAG_MEMORY	0x0001
 
-struct lb_uint64 {
-	uint32_t lo;
-	uint32_t hi;
-};
 struct lb_memory_range {
 	struct lb_uint64 start;
 	struct lb_uint64 size;
Index: src/arch/ppc/boot/linuxbios_table.c
===================================================================
--- src/arch/ppc/boot/linuxbios_table.c	(revision 2085)
+++ src/arch/ppc/boot/linuxbios_table.c	(working copy)
@@ -7,22 +7,6 @@
 #include <device/device.h>
 #include <stdlib.h>
 
-static inline uint64_t unpack_lb64(struct lb_uint64 value) 
-{
-	uint64_t result;
-	result = value.hi;
-	result = (result << 32) + value.lo;
-	return result;
-}
-
-static inline struct lb_uint64 pack_lb64(uint64_t value)
-{
-	struct lb_uint64 result;
-	result.lo = (value >> 0) & 0xffffffff;
-	result.hi = (value >> 32) & 0xffffffff;
-	return result;
-}
-
 struct lb_header *lb_table_init(unsigned long addr)
 {
 	struct lb_header *header;
Index: src/arch/i386/boot/linuxbios_table.c
===================================================================
--- src/arch/i386/boot/linuxbios_table.c	(revision 2085)
+++ src/arch/i386/boot/linuxbios_table.c	(working copy)
@@ -7,22 +7,6 @@
 #include <device/device.h>
 #include <stdlib.h>
 
-static inline uint64_t unpack_lb64(struct lb_uint64 value) 
-{
-	uint64_t result;
-	result = value.hi;
-	result = (result << 32) + value.lo;
-	return result;
-}
-
-static inline struct lb_uint64 pack_lb64(uint64_t value)
-{
-	struct lb_uint64 result;
-	result.lo = (value >> 0) & 0xffffffff;
-	result.hi = (value >> 32) & 0xffffffff;
-	return result;
-}
-
 struct lb_header *lb_table_init(unsigned long addr)
 {
 	struct lb_header *header;
Index: util/lbtdump/lbtdump.c
===================================================================
--- util/lbtdump/lbtdump.c	(revision 2085)
+++ util/lbtdump/lbtdump.c	(working copy)
@@ -9,14 +9,6 @@
 #include <sys/mman.h>
 #include "../../src/include/boot/linuxbios_tables.h"
 
-static inline uint64_t unpack_lb64(struct lb_uint64 value)
-{
-	uint64_t result;
-	result = value.hi;
-	result = (result << 32) + value.lo;
-	return result;
-}
-
 void print_lb_records(struct lb_record *rec, struct lb_record *last, unsigned long addr);
 
 unsigned long compute_checksum(void *addr, unsigned long length)


More information about the coreboot mailing list