Andrey Petrov (andrey.petrov@intel.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/13804
-gerrit
commit c5572f8828af468c276abb66da21d7e68013f167 Author: Andrey Petrov andrey.petrov@intel.com Date: Thu Feb 25 17:22:17 2016 -0800
arch/x86: document CAR symbols and expose them in symbols.h
Attempt to better document the symbol usage in car.ld for cache-as-ram usage. Additionally, add _car_region_[start|end] that completely covers the entire cache-as-ram region. The _car_data_[start|end] symbols were renamed to _car_relocatable_data_[start|end] in the hopes of making it clearer that objects within there move. Lastly, all these symbols were added to arch/symbols.h.
Change-Id: I1f1af4983804dc8521d0427f43381bde6d23a060 Signed-off-by: Andrey Petrov andrey.petrov@intel.com Signed-off-by: Aaron Durbin adurbin@chromium.org --- src/arch/x86/car.ld | 11 +++--- src/arch/x86/include/arch/early_variables.h | 8 ++--- src/arch/x86/include/arch/symbols.h | 52 +++++++++++++++++++++++++++++ src/cpu/amd/car/post_cache_as_ram.c | 4 +-- 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 d19e613..c221fb8 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 16eeacc..e78b846 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 0000000..e055fa0 --- /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 7e33d32..0a59696 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 fda3f7d..f9b427a 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;