Any C99-compliant C compiler should offer the long long int variable type to store 64-bit values. Stop implementing this as a struct.
This allows simplifying the code a little, while making the binary slightly smaller and faster. Signed-off-by: Jean Delvare <jdelv...@suse.de> --- biosdecode.c | 8 ++--- dmidecode.c | 84 +++++++++++++++++++++++------------------------------------ dmioem.c | 13 +++------ types.h | 29 ++------------------ util.c | 12 -------- 5 files changed, 47 insertions(+), 99 deletions(-) --- dmidecode.orig/biosdecode.c +++ dmidecode/biosdecode.c @@ -111,8 +111,8 @@ static int smbios3_decode(const u8 *p, s p[0x07], p[0x08], p[0x09]); printf("\tStructure Table Maximum Length: %u bytes\n", DWORD(p + 0x0C)); - printf("\tStructure Table 64-bit Address: 0x%08X%08X\n", - QWORD(p + 0x10).h, QWORD(p + 0x10).l); + printf("\tStructure Table 64-bit Address: 0x%016llX\n", + QWORD(p + 0x10)); return 1; } @@ -284,8 +284,8 @@ static int acpi_decode(const u8 *p, size if (DWORD(p + 20) < 32) return 1; - printf("\tXSD Table 64-bit Address: 0x%08X%08X\n", - QWORD(p + 24).h, QWORD(p + 24).l); + printf("\tXSD Table 64-bit Address: 0x%016llX\n", + QWORD(p + 24)); return 1; } --- dmidecode.orig/dmidecode.c +++ dmidecode/dmidecode.c @@ -288,13 +288,13 @@ void dmi_print_memory_size(const char *a * MB, kB and B. In practice, it is expected that only one or two * (consecutive) of these will be non-zero. */ - split[0] = code.l & 0x3FFUL; - split[1] = (code.l >> 10) & 0x3FFUL; - split[2] = (code.l >> 20) & 0x3FFUL; - split[3] = ((code.h << 2) & 0x3FCUL) | (code.l >> 30); - split[4] = (code.h >> 8) & 0x3FFUL; - split[5] = (code.h >> 18) & 0x3FFUL; - split[6] = code.h >> 28; + split[0] = code & 0x3FFULL; + split[1] = (code >> 10) & 0x3FFULL; + split[2] = (code >> 20) & 0x3FFULL; + split[3] = (code >> 30) & 0x3FFULL; + split[4] = (code >> 40) & 0x3FFULL; + split[5] = (code >> 50) & 0x3FFULL; + split[6] = (code >> 60) & 0x3FFULL; /* * Now we find the highest unit with a non-zero value. If the following @@ -346,8 +346,7 @@ static void dmi_bios_rom_size(u8 code1, if (code1 != 0xFF) { - u64 s = { .l = (code1 + 1) << 6 }; - dmi_print_memory_size("ROM Size", s, 1); + dmi_print_memory_size("ROM Size", (u64)(code1 + 1) << 6, 1); } else pr_attr("ROM Size", "%u %s", code2 & 0x3FFF, unit[code2 >> 14]); @@ -392,14 +391,14 @@ static void dmi_bios_characteristics(u64 /* * This isn't very clear what this bit is supposed to mean */ - if (code.l & (1 << 3)) + if (code & (1ULL << 3)) { pr_list_item("%s", characteristics[0]); return; } for (i = 4; i <= 31; i++) - if (code.l & (1 << i)) + if (code & (1ULL << i)) pr_list_item("%s", characteristics[i - 3]); } @@ -1780,14 +1779,12 @@ static void dmi_cache_size_2(const char if (code & 0x80000000) { - code &= 0x7FFFFFFFLU; - size.l = code << 6; - size.h = code >> 26; + code &= 0x7FFFFFFFULL; + size = (u64)code << 6; } else { - size.l = code; - size.h = 0; + size = code; } /* Use a more convenient unit for large cache size */ @@ -2767,9 +2764,9 @@ static void dmi_memory_device_size(u16 c pr_attr("Size", "Unknown"); else { - u64 s = { .l = code & 0x7FFF }; + u64 s = (u64)code & 0x7FFFULL; if (!(code & 0x8000)) - s.l <<= 10; + s <<= 10; dmi_print_memory_size("Size", s, 1); } } @@ -3010,9 +3007,9 @@ static void dmi_memory_size(const char * { /* 7.18.12 */ /* 7.18.13 */ - if (code.h == 0xFFFFFFFF && code.l == 0xFFFFFFFF) + if (code == ~0ULL) pr_attr(attr, "Unknown"); - else if (code.h == 0x0 && code.l == 0x0) + else if (code == 0ULL) pr_attr(attr, "None"); else dmi_print_memory_size(attr, code, 0); @@ -3142,18 +3139,12 @@ static void dmi_mapped_address_size(u32 if (code == 0) pr_attr("Range Size", "Invalid"); else - { - u64 size; - - size.h = 0; - size.l = code; - dmi_print_memory_size("Range Size", size, 1); - } + dmi_print_memory_size("Range Size", (u64)code, 1); } static void dmi_mapped_address_extended_size(u64 start, u64 end) { - if (start.h == end.h && start.l == end.l) + if (start == end) pr_attr("Range Size", "Invalid"); else dmi_print_memory_size("Range Size", u64_range(start, end), 0); @@ -3581,10 +3572,10 @@ static const char *dmi_system_boot_statu static void dmi_64bit_memory_error_address(const char *attr, u64 code) { - if (code.h == 0x80000000 && code.l == 0x00000000) + if (code == 0x8000000000000000) pr_attr(attr, "Unknown"); else - pr_attr(attr, "0x%08X%08X", code.h, code.l); + pr_attr(attr, "0x%016llX", code); } /* @@ -3718,9 +3709,9 @@ static void dmi_ipmi_base_address(u8 typ else { u64 address = QWORD(p); - pr_attr("Base Address", "0x%08X%08X (%s)", - address.h, (address.l & ~1) | lsb, - address.l & 1 ? "I/O" : "Memory-mapped"); + pr_attr("Base Address", "0x%016llX (%s)", + (address & ~1ULL) | lsb, + (address & 1ULL) ? "I/O" : "Memory-mapped"); } } @@ -4389,14 +4380,14 @@ static void dmi_tpm_characteristics(u64 /* * This isn't very clear what this bit is supposed to mean */ - if (code.l & (1 << 2)) + if (code & (1ULL << 2)) { pr_list_item("%s", characteristics[0]); return; } for (i = 3; i <= 5; i++) - if (code.l & (1 << i)) + if (code & (1ULL << i)) pr_list_item("%s", characteristics[i - 2]); } @@ -4858,12 +4849,8 @@ static void dmi_decode(const struct dmi_ } else { - u64 capacity; - - capacity.h = 0; - capacity.l = DWORD(data + 0x07); dmi_print_memory_size("Maximum Capacity", - capacity, 1); + DWORD(data + 0x07), 1); } if (!(opt.flags & FLAG_QUIET)) dmi_memory_array_error_handle(WORD(data + 0x0B)); @@ -4989,10 +4976,8 @@ static void dmi_decode(const struct dmi_ start = QWORD(data + 0x0F); end = QWORD(data + 0x17); - pr_attr("Starting Address", "0x%08X%08X", - start.h, start.l); - pr_attr("Ending Address", "0x%08X%08X", - end.h, end.l); + pr_attr("Starting Address", "0x%016llX", start); + pr_attr("Ending Address", "0x%016llX", end); dmi_mapped_address_extended_size(start, end); } else @@ -5022,10 +5007,8 @@ static void dmi_decode(const struct dmi_ start = QWORD(data + 0x13); end = QWORD(data + 0x1B); - pr_attr("Starting Address", "0x%08X%08X", - start.h, start.l); - pr_attr("Ending Address", "0x%08X%08X", - end.h, end.l); + pr_attr("Starting Address", "0x%016llX", start); + pr_attr("Ending Address", "0x%016llX", end); dmi_mapped_address_extended_size(start, end); } else @@ -5947,7 +5930,8 @@ static int smbios3_decode(u8 *buf, size_ buf[0x07], buf[0x08], buf[0x09]); offset = QWORD(buf + 0x10); - if (!(flags & FLAG_NO_FILE_OFFSET) && offset.h && sizeof(off_t) < 8) + if (!(flags & FLAG_NO_FILE_OFFSET) && (offset & 0xFFFFFFFF00000000) + && sizeof(off_t) < 8) { fprintf(stderr, "64-bit addresses not supported, sorry.\n"); return 0; @@ -5955,7 +5939,7 @@ static int smbios3_decode(u8 *buf, size_ /* Maximum length, may get trimmed */ len = DWORD(buf + 0x0C); - table = dmi_table_get(((off_t)offset.h << 32) | offset.l, &len, 0, ver, + table = dmi_table_get(offset, &len, 0, ver, devmem, flags | FLAG_STOP_AT_EOT); if (table == NULL) return 1; --- dmidecode.orig/dmioem.c +++ dmidecode/dmioem.c @@ -141,7 +141,7 @@ static void dmi_dell_bios_flags(u64 flag /* * TODO: The meaning of the other bits is unknown. */ - pr_attr("ACPI WMI Supported", "%s", (flags.l & (1 << 1)) ? "Yes" : "No"); + pr_attr("ACPI WMI Supported", "%s", (flags & (1ULL << 1)) ? "Yes" : "No"); } static void dmi_dell_hotkeys(const struct dmi_header *h) @@ -865,9 +865,9 @@ static void dmi_hp_240_attr(u64 defined, pr_list_start("Attributes Defined/Set", NULL); for (i = 0; i < ARRAY_SIZE(attributes); i++) { - if (!(defined.l & (1UL << i))) + if (!(defined & (1ULL << i))) continue; - pr_list_item("%s: %s", attributes[i], set.l & (1UL << i) ? "Yes" : "No"); + pr_list_item("%s: %s", attributes[i], set & (1ULL << i) ? "Yes" : "No"); } pr_list_end(); } @@ -1243,11 +1243,8 @@ static int dmi_decode_hp(const struct dm if (DWORD(data + 0x04) == 0x55524324) { u64 paddr = QWORD(data + 0x08); - paddr.l += DWORD(data + 0x14); - if (paddr.l < DWORD(data + 0x14)) - paddr.h++; - pr_attr("Physical Address", "0x%08x%08x", - paddr.h, paddr.l); + paddr += DWORD(data + 0x14); + pr_attr("Physical Address", "0x%016llx", paddr); pr_attr("Length", "0x%08x", DWORD(data + 0x10)); } break; --- dmidecode.orig/types.h +++ dmidecode/types.h @@ -7,6 +7,7 @@ typedef unsigned char u8; typedef unsigned short u16; typedef signed short i16; typedef unsigned int u32; +typedef unsigned long long int u64; /* * You may use the following defines to adjust the type definitions @@ -18,30 +19,6 @@ typedef unsigned int u32; * for architectures which need it. */ -#ifdef BIGENDIAN -typedef struct { - u32 h; - u32 l; -} u64; -#else -typedef struct { - u32 l; - u32 h; -} u64; -#endif - -#if defined(ALIGNMENT_WORKAROUND) || defined(BIGENDIAN) -static inline u64 U64(u32 low, u32 high) -{ - u64 self; - - self.l = low; - self.h = high; - - return self; -} -#endif - /* * Per SMBIOS v2.8.0 and later, all structures assume a little-endian * ordering convention. @@ -49,11 +26,11 @@ static inline u64 U64(u32 low, u32 high) #if defined(ALIGNMENT_WORKAROUND) || defined(BIGENDIAN) #define WORD(x) (u16)((x)[0] + ((x)[1] << 8)) #define DWORD(x) (u32)((x)[0] + ((x)[1] << 8) + ((x)[2] << 16) + ((x)[3] << 24)) -#define QWORD(x) (U64(DWORD(x), DWORD(x + 4))) +#define QWORD(x) (((u64)DWORD((x) + 4) << 32) + DWORD(x)) #else /* ALIGNMENT_WORKAROUND || BIGENDIAN */ #define WORD(x) (u16)(*(const u16 *)(x)) #define DWORD(x) (u32)(*(const u32 *)(x)) -#define QWORD(x) (*(const u64 *)(x)) +#define QWORD(x) (u64)(*(const u64 *)(x)) #endif /* ALIGNMENT_WORKAROUND || BIGENDIAN */ #endif --- dmidecode.orig/util.c +++ dmidecode/util.c @@ -265,15 +265,5 @@ void *mem_chunk(off_t base, size_t len, /* Returns end - start + 1, assuming start < end */ u64 u64_range(u64 start, u64 end) { - u64 res; - - res.h = end.h - start.h; - res.l = end.l - start.l; - - if (end.l < start.l) - res.h--; - if (++res.l == 0) - res.h++; - - return res; + return end - start + 1; } -- Jean Delvare SUSE L3 Support