haswell: fix overflow handling TOUUD
It's possible that the TOUUD can be set to less than 4GiB. When that is the case the size_k variable is an extremely large value. Instead ensure TOUUD is greater than 4GiB before adding said resources. Change-Id: I456633d6210824e60665281538300fd15656b86d Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/3352 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
parent
373a20c335
commit
27435d3bcd
|
@ -312,6 +312,7 @@ static void mc_report_map_entries(device_t dev, uint64_t *values)
|
||||||
static void mc_add_dram_resources(device_t dev)
|
static void mc_add_dram_resources(device_t dev)
|
||||||
{
|
{
|
||||||
unsigned long base_k, size_k;
|
unsigned long base_k, size_k;
|
||||||
|
unsigned long touud_k;
|
||||||
unsigned long index;
|
unsigned long index;
|
||||||
struct resource *resource;
|
struct resource *resource;
|
||||||
uint64_t mc_values[NUM_MAP_ENTRIES];
|
uint64_t mc_values[NUM_MAP_ENTRIES];
|
||||||
|
@ -396,8 +397,9 @@ static void mc_add_dram_resources(device_t dev)
|
||||||
|
|
||||||
/* 4GiB -> TOUUD */
|
/* 4GiB -> TOUUD */
|
||||||
base_k = 4096 * 1024; /* 4GiB */
|
base_k = 4096 * 1024; /* 4GiB */
|
||||||
size_k = (unsigned long)(mc_values[TOUUD_REG] >> 10) - base_k;
|
touud_k = mc_values[TOUUD_REG] >> 10;
|
||||||
if (size_k > 0)
|
size_k = touud_k - base_k;
|
||||||
|
if (touud_k > base_k)
|
||||||
ram_resource(dev, index++, base_k, size_k);
|
ram_resource(dev, index++, base_k, size_k);
|
||||||
|
|
||||||
/* Reserve everything between A segment and 1MB:
|
/* Reserve everything between A segment and 1MB:
|
||||||
|
|
Loading…
Reference in New Issue