diff options
Diffstat (limited to 'resources/libreboot/patch/kgpe-d16/0001-util-cbmem-Fix-failure-with-certain-cbmem-base-align.patch')
-rw-r--r-- | resources/libreboot/patch/kgpe-d16/0001-util-cbmem-Fix-failure-with-certain-cbmem-base-align.patch | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/resources/libreboot/patch/kgpe-d16/0001-util-cbmem-Fix-failure-with-certain-cbmem-base-align.patch b/resources/libreboot/patch/kgpe-d16/0001-util-cbmem-Fix-failure-with-certain-cbmem-base-align.patch new file mode 100644 index 00000000..84c51ba1 --- /dev/null +++ b/resources/libreboot/patch/kgpe-d16/0001-util-cbmem-Fix-failure-with-certain-cbmem-base-align.patch @@ -0,0 +1,205 @@ +From 4e0a69562a189e9abe06979a993f50e3f0b2069b Mon Sep 17 00:00:00 2001 +From: Timothy Pearson <kb9vqf@pearsoncomputing.net> +Date: Sat, 5 Sep 2015 18:07:17 -0500 +Subject: [PATCH 001/146] util/cbmem: Fix failure with certain cbmem base + alignments + +--- + util/cbmem/cbmem.c | 61 ++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 38 insertions(+), 23 deletions(-) + +diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c +index 74cb52d..69ffbaf 100644 +--- a/util/cbmem/cbmem.c ++++ b/util/cbmem/cbmem.c +@@ -2,6 +2,7 @@ + * This file is part of the coreboot project. + * + * Copyright 2012 Google Inc. ++ * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -103,8 +104,7 @@ static void unmap_memory(void) + if (size_to_mib(mapped_size) == 0) { + debug("Unmapping %zuMB of virtual memory at %p.\n", + size_to_mib(mapped_size), mapped_virtual); +- } +- else { ++ } else { + debug("Unmapping %zuMB of virtual memory at %p.\n", + size_to_mib(mapped_size), mapped_virtual); + } +@@ -113,7 +113,7 @@ static void unmap_memory(void) + mapped_size = 0; + } + +-static void *map_memory_size(u64 physical, size_t size) ++static void *map_memory_size(u64 physical, size_t size, uint8_t abort_on_failure) + { + void *v; + off_t p; +@@ -131,8 +131,7 @@ static void *map_memory_size(u64 physical, size_t size) + if (size_to_mib(size) == 0) { + debug("Mapping %zuB of physical memory at 0x%jx (requested 0x%jx).\n", + size, (intmax_t)p, (intmax_t)physical); +- } +- else { ++ } else { + debug("Mapping %zuMB of physical memory at 0x%jx (requested 0x%jx).\n", + size_to_mib(size), (intmax_t)p, (intmax_t)physical); + } +@@ -153,9 +152,13 @@ static void *map_memory_size(u64 physical, size_t size) + } + + if (v == MAP_FAILED) { +- fprintf(stderr, "Failed to mmap /dev/mem: %s\n", +- strerror(errno)); +- exit(1); ++ if (abort_on_failure) { ++ fprintf(stderr, "Failed to mmap /dev/mem: %s\n", ++ strerror(errno)); ++ exit(1); ++ } else { ++ return 0; ++ } + } + + /* Remember what we actually mapped ... */ +@@ -173,7 +176,7 @@ static void *map_memory_size(u64 physical, size_t size) + + static void *map_memory(u64 physical) + { +- return map_memory_size(physical, MAP_BYTES); ++ return map_memory_size(physical, MAP_BYTES, 1); + } + + /* +@@ -210,14 +213,16 @@ static struct lb_cbmem_ref parse_cbmem_ref(struct lb_cbmem_ref *cbmem_ref) + return ret; + } + +-static int parse_cbtable(u64 address, size_t table_size) ++static int parse_cbtable(u64 address, size_t table_size, uint8_t abort_on_failure) + { +- int i, found = 0; ++ int i, found, ret = 0; + void *buf; + + debug("Looking for coreboot table at %" PRIx64 " %zd bytes.\n", + address, table_size); +- buf = map_memory_size(address, table_size); ++ buf = map_memory_size(address, table_size, abort_on_failure); ++ if (!buf) ++ return -2; + + /* look at every 16 bytes within 4K of the base */ + +@@ -283,7 +288,17 @@ static int parse_cbtable(u64 address, size_t table_size) + *(struct lb_forward *) lbr_p; + debug(" Found forwarding entry.\n"); + unmap_memory(); +- return parse_cbtable(lbf_p.forward, table_size); ++ ret = parse_cbtable(lbf_p.forward, table_size, 0); ++ if (ret == -2) { ++ /* try again with a smaller memory mapping request */ ++ ret = parse_cbtable(lbf_p.forward, table_size / 2, 1); ++ if (ret == -2) ++ exit(1); ++ else ++ return ret; ++ } else { ++ return ret; ++ } + } + default: + break; +@@ -544,7 +559,7 @@ static void dump_timestamps(int mach_readable) + } + + size = sizeof(*tst_p); +- tst_p = map_memory_size((unsigned long)timestamps.cbmem_addr, size); ++ tst_p = map_memory_size((unsigned long)timestamps.cbmem_addr, size, 1); + + timestamp_set_tick_freq(tst_p->tick_freq_mhz); + +@@ -553,7 +568,7 @@ static void dump_timestamps(int mach_readable) + size += tst_p->num_entries * sizeof(tst_p->entries[0]); + + unmap_memory(); +- tst_p = map_memory_size((unsigned long)timestamps.cbmem_addr, size); ++ tst_p = map_memory_size((unsigned long)timestamps.cbmem_addr, size, 1); + + /* Report the base time within the table. */ + prev_stamp = 0; +@@ -604,7 +619,7 @@ static void dump_console(void) + } + + console_p = map_memory_size((unsigned long)console.cbmem_addr, +- 2 * sizeof(uint32_t)); ++ 2 * sizeof(uint32_t), 1); + /* The in-memory format of the console area is: + * u32 size + * u32 cursor +@@ -626,7 +641,7 @@ static void dump_console(void) + } + + console_p = map_memory_size((unsigned long)console.cbmem_addr, +- size + sizeof(size) + sizeof(cursor)); ++ size + sizeof(size) + sizeof(cursor), 1); + memcpy(console_c, console_p + 8, size); + console_c[size] = 0; + console_c[cursor] = 0; +@@ -647,7 +662,7 @@ static void hexdump(unsigned long memory, int length) + uint8_t *m; + int all_zero = 0; + +- m = map_memory_size((intptr_t)memory, length); ++ m = map_memory_size((intptr_t)memory, length, 1); + + if (length > MAP_BYTES) { + printf("Truncating hex dump from %d to %d bytes\n\n", +@@ -803,7 +818,7 @@ static void dump_cbmem_toc(void) + + start = unpack_lb64(cbmem.start); + +- cbmem_area = map_memory_size(start, unpack_lb64(cbmem.size)); ++ cbmem_area = map_memory_size(start, unpack_lb64(cbmem.size), 1); + entries = (struct cbmem_entry *)cbmem_area; + + if (entries[0].magic == CBMEM_MAGIC) { +@@ -814,12 +829,12 @@ static void dump_cbmem_toc(void) + rootptr -= sizeof(struct cbmem_root_pointer); + unmap_memory(); + struct cbmem_root_pointer *r = +- map_memory_size(rootptr, sizeof(*r)); ++ map_memory_size(rootptr, sizeof(*r), 1); + if (r->magic == CBMEM_POINTER_MAGIC) { + struct cbmem_root *root; + uint64_t rootaddr = rootptr + r->root_offset; + unmap_memory(); +- root = map_memory_size(rootaddr, ROOT_MIN_SIZE); ++ root = map_memory_size(rootaddr, ROOT_MIN_SIZE, 1); + dump_dynamic_cbmem_toc(root); + } else + fprintf(stderr, "No valid coreboot CBMEM root pointer found.\n"); +@@ -1205,14 +1220,14 @@ int main(int argc, char** argv) + dtbuffer++; + } + +- parse_cbtable(baseaddr, cb_table_size); ++ parse_cbtable(baseaddr, cb_table_size, 1); + #else + int j; + static const int possible_base_addresses[] = { 0, 0xf0000 }; + + /* Find and parse coreboot table */ + for (j = 0; j < ARRAY_SIZE(possible_base_addresses); j++) { +- if (parse_cbtable(possible_base_addresses[j], MAP_BYTES)) ++ if (parse_cbtable(possible_base_addresses[j], MAP_BYTES, 1)) + break; + } + #endif +-- +1.7.9.5 + |