diff options
author | Yilun Lin <yllin@google.com> | 2018-12-12 19:14:39 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-12-23 14:46:08 -0800 |
commit | 216ab1e1d8d74bc722d3e322b2460802e93a5df9 (patch) | |
tree | 558d24d9021ff2a27af623065e55cd91fa8b67ac | |
parent | 4c98d54c19702fdad5864ae6518913a21b64b192 (diff) | |
download | chrome-ec-216ab1e1d8d74bc722d3e322b2460802e93a5df9.tar.gz |
core/cortex-m: Support prevent chip memory region from GC.
We would like to keep a symbol in a chip memory region from GC in link
time. However __attribute__((used)) cannot fulfill the requirement in such
situation. This CL adds a "name.keep" section to prevent all the symbols
in this section in a chip memory region from GC. Also, we would like to
support a non-NOLOAD section, which can load default value on runtime.
BUG=b:120825336
TEST=make buildall -j
BRANCH=none
Change-Id: I76cf445f6b4c0b61c20182a1aaf5a44f962049ae
Signed-off-by: Yilun Lin <yllin@google.com>
Reviewed-on: https://chromium-review.googlesource.com/1373949
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Yilun Lin <yllin@chromium.org>
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
-rw-r--r-- | core/cortex-m/ec.lds.S | 10 | ||||
-rw-r--r-- | include/link_defs.h | 3 |
2 files changed, 13 insertions, 0 deletions
diff --git a/core/cortex-m/ec.lds.S b/core/cortex-m/ec.lds.S index dabdedf860..2a9a9b2fe0 100644 --- a/core/cortex-m/ec.lds.S +++ b/core/cortex-m/ec.lds.S @@ -59,8 +59,10 @@ MEMORY #ifdef CONFIG_CHIP_MEMORY_REGIONS #define REGION(name, attr, start, size) \ name(attr) : ORIGIN = (start), LENGTH = (size) +#define REGION_LOAD REGION #include "memory_regions.inc" #undef REGION +#undef REGION_LOAD #endif /* CONFIG_MEMORY_REGIONS */ } SECTIONS @@ -406,10 +408,18 @@ SECTIONS #define REGION(name, attr, start, size) \ .name(NOLOAD) : { \ __##name##_start = .; \ + KEEP(*(SORT(.name.keep.*))) \ + *(SORT(.name.*)) \ + } > name +#define REGION_LOAD(name, attr, start, size) \ + .name : { \ + __##name##_start = .; \ + KEEP(*(SORT(.name.keep.*))) \ *(SORT(.name.*)) \ } > name #include "memory_regions.inc" #undef REGION +#undef REGION_LOAD #endif /* CONFIG_CHIP_MEMORY_REGIONS */ #if !(defined(SECTION_IS_RO) && defined(CONFIG_FLASH)) diff --git a/include/link_defs.h b/include/link_defs.h index 61648baa0f..299cf54b75 100644 --- a/include/link_defs.h +++ b/include/link_defs.h @@ -111,8 +111,11 @@ extern const void *__data_end; /* Helper for special chip-specific memory sections */ #ifdef CONFIG_CHIP_MEMORY_REGIONS #define __SECTION(name) __attribute__((section("." STRINGIFY(name) ".50_auto"))) +#define __SECTION_KEEP(name) \ + __attribute__((section("." STRINGIFY(name) ".keep.50_auto"))) #else #define __SECTION(name) +#define __SECTION_KEEP(name) #endif /* CONFIG_MEMORY_REGIONS */ #ifdef CONFIG_CHIP_UNCACHED_REGION #define __uncached __SECTION(CONFIG_CHIP_UNCACHED_REGION) |