diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/x86/car.ld | 11 | ||||
-rw-r--r-- | src/arch/x86/include/arch/early_variables.h | 8 | ||||
-rw-r--r-- | src/arch/x86/include/arch/symbols.h | 52 | ||||
-rw-r--r-- | src/cpu/amd/car/post_cache_as_ram.c | 4 | ||||
-rw-r--r-- | src/cpu/x86/car.c | 10 |
5 files changed, 69 insertions, 16 deletions
diff --git a/src/arch/x86/car.ld b/src/arch/x86/car.ld index d19e61300b..c221fb88b1 100644 --- a/src/arch/x86/car.ld +++ b/src/arch/x86/car.ld @@ -18,6 +18,7 @@ /* This file is included inside a SECTIONS block */ . = CONFIG_DCACHE_RAM_BASE; .car.data . (NOLOAD) : { + _car_region_start = . ; /* Vboot work buffer is completely volatile outside of verstage and * romstage. Appropriate code needs to handle the transition. */ #if IS_ENABLED(CONFIG_SEPARATE_VERSTAGE) @@ -36,12 +37,12 @@ * so that multiple stages (romstage and verstage) have a consistent * link address of these shared objects. */ PRERAM_CBMEM_CONSOLE(., (CONFIG_LATE_CBMEM_INIT ? 0 : 0xc00)) - _car_data_start = .; + _car_relocatable_data_start = .; /* The timestamp implementation relies on this storage to be around * after migration. One of the fields indicates not to use it as the * backing store once cbmem comes online. Therefore, this data needs - * to reside in the migrated area (between _car_data_start and - * _car_data_end). */ + * to reside in the migrated area (between _car_relocatable_data_start + * and _car_relocatable_data_end). */ TIMESTAMP(., 0x100) /* _car_global_start and _car_global_end provide symbols to per-stage * variables that are not shared like the timestamp and the pre-ram @@ -51,7 +52,9 @@ *(.car.global_data); . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _car_global_end = .; - _car_data_end = .; + _car_relocatable_data_end = .; + + _car_region_end = . + CONFIG_DCACHE_RAM_SIZE - (. - _car_region_start); } /* Global variables are not allowed in romstage diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h index 16eeacce62..e78b846f8e 100644 --- a/src/arch/x86/include/arch/early_variables.h +++ b/src/arch/x86/include/arch/early_variables.h @@ -16,6 +16,7 @@ #ifndef ARCH_EARLY_VARIABLES_H #define ARCH_EARLY_VARIABLES_H +#include <arch/symbols.h> #include <stdlib.h> #include <rules.h> @@ -59,18 +60,15 @@ void *car_sync_var_ptr(void *var); #define car_set_var(var, val) \ do { car_get_var(var) = (val); } while(0) -extern char _car_data_start[]; -extern char _car_data_end[]; - static inline size_t car_data_size(void) { - size_t car_size = &_car_data_end[0] - &_car_data_start[0]; + size_t car_size = _car_relocatable_data_size; return ALIGN(car_size, 64); } static inline size_t car_object_offset(void *ptr) { - return (char *)ptr - &_car_data_start[0]; + return (char *)ptr - &_car_relocatable_data_start[0]; } #else diff --git a/src/arch/x86/include/arch/symbols.h b/src/arch/x86/include/arch/symbols.h new file mode 100644 index 0000000000..e055fa0f5b --- /dev/null +++ b/src/arch/x86/include/arch/symbols.h @@ -0,0 +1,52 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2016 Intel Corp. + * Copyright 2016 Google Inc. + * + * 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 + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __ARCH_SYMBOLS_H +#define __ARCH_SYMBOLS_H + +/* + * The _car_region_[start|end] covers the entirety of the cache as ram + * region. All other symbols with the _car prefix a subsets of this + * larger region. + */ +extern char _car_region_start[]; +extern char _car_region_end[]; +#define _car_region_size (_car_region_end - _car_region_start) + +/* + * This is the stack used under CONFIG_C_ENVIRONMENT_BOOTBLOCK for + * all stages that execute when cache-as-ram is up. + */ +extern char _car_stack_start[]; +extern char _car_stack_end[]; +#define _car_stack_size (_car_stack_end - _car_stack_start) + +/* + * The _car_relocatable_data_[start|end] symbols cover CAR data which is + * relocatable once memory comes online. Variables with CAR_GLOBAL decoration + * reside within this region. The _car_global_[start|end] is a subset of the + * relocatable region which excludes the timestamp region because of + * intricacies in the timestamp code. + */ +extern char _car_relocatable_data_start[]; +extern char _car_relocatable_data_end[]; +#define _car_relocatable_data_size \ + (_car_relocatable_data_end - _car_relocatable_data_start) +extern char _car_global_start[]; +extern char _car_global_end[]; +#define _car_global_size (_car_global_end - _car_global_start) + +#endif diff --git a/src/cpu/amd/car/post_cache_as_ram.c b/src/cpu/amd/car/post_cache_as_ram.c index 7e33d3219c..0a59696b56 100644 --- a/src/cpu/amd/car/post_cache_as_ram.c +++ b/src/cpu/amd/car/post_cache_as_ram.c @@ -150,11 +150,11 @@ void post_cache_as_ram(void) void *migrated_car = (void *)(CONFIG_RAMTOP - car_size); print_car_debug("Copying data from cache to RAM..."); - memcpy_(migrated_car, &_car_data_start[0], car_size); + memcpy_(migrated_car, _car_relocatable_data_start, car_size); print_car_debug(" Done\n"); print_car_debug("Verifying data integrity in RAM..."); - if (memcmp_(migrated_car, &_car_data_start[0], car_size) == 0) + if (memcmp_(migrated_car, _car_relocatable_data_start, car_size) == 0) print_car_debug(" Done\n"); else print_car_debug(" FAILED\n"); diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c index fda3f7d4f4..f9b427a4b0 100644 --- a/src/cpu/x86/car.c +++ b/src/cpu/x86/car.c @@ -46,8 +46,8 @@ void *car_get_var_ptr(void *var) { char *migrated_base = NULL; int offset; - void * _car_start = &_car_data_start; - void * _car_end = &_car_data_end; + void * _car_start = _car_relocatable_data_start; + void * _car_end = _car_relocatable_data_end; /* If the cache-as-ram has not been migrated return the pointer * passed in. */ @@ -84,8 +84,8 @@ void *car_get_var_ptr(void *var) void *car_sync_var_ptr(void *var) { void ** mig_var = car_get_var_ptr(var); - void * _car_start = &_car_data_start; - void * _car_end = &_car_data_end; + void * _car_start = _car_relocatable_data_start; + void * _car_end = _car_relocatable_data_end; /* Not moved or migrated yet. */ if (mig_var == var) @@ -129,7 +129,7 @@ static void do_car_migrate_variables(void) return; } - memcpy(migrated_base, &_car_data_start[0], car_size); + memcpy(migrated_base, _car_relocatable_data_start, car_size); /* Mark that the data has been moved. */ car_migrated = ~0; |