summaryrefslogtreecommitdiff
path: root/common/firmware_image.lds.S
diff options
context:
space:
mode:
authorTzung-Bi Shih <tzungbi@chromium.org>2020-11-23 13:24:51 +0800
committerCommit Bot <commit-bot@chromium.org>2020-12-16 05:19:48 +0000
commitdf1e7a01c2a9ad696b66a4f1a4bee56512a1c2ab (patch)
tree4a018e10f6238b10554962aad65817bc6d3acea0 /common/firmware_image.lds.S
parent7303a75202abb8f0a9a232ce2ab91fe20f12b072 (diff)
downloadchrome-ec-df1e7a01c2a9ad696b66a4f1a4bee56512a1c2ab.tar.gz
common: separate VirtAddr and PhysAddr usage
The "VirtAddr" and "PhysAddr" are inconsistent for all ELF segments. Taking the following figure as an example: - 0x00000000 in the 1st segment is virtual address in SCP. - 0x50000000 in the 4th segment is physical address in AP. $ /opt/coreboot-sdk/bin/riscv64-elf-readelf -l build/asurada_scp/ec.obj Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x001000 0x00000000 0x00000000 0x08198 0x08198 R E 0x1000 LOAD 0x009198 0x00008198 0x00057fff 0x00001 0x00001 RW 0x1000 LOAD 0x000db0 0x000ffdb0 0x000ffdb0 0x00000 0x00250 RW 0x1000 LOAD 0x00a000 0x50000000 0x50000000 0x00180 0x00180 R E 0x1000 Let "VirtAddr" for EC (SCP) view address; "PhysAddr" for AP view address. After the patch, the ELF's program header should be as the following. $ /opt/coreboot-sdk/bin/riscv64-elf-readelf -l build/asurada_scp/ec.obj Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x001000 0x00000000 0x10500000 0x08198 0x08198 R E 0x1000 LOAD 0x009198 0x00008198 0x10557fff 0x00001 0x00001 RW 0x1000 LOAD 0x000db0 0x000ffdb0 0x105ffdb0 0x00000 0x00250 RW 0x1000 LOAD 0x00a000 0x10000000 0x50000000 0x00180 0x00180 R E 0x1000 BRANCH=none BUG=b:173753688 TEST=make BOARD=asurada_scp Signed-off-by: Tzung-Bi Shih <tzungbi@chromium.org> Change-Id: I921d1e14b2ca1eb553ae4f7cd3dd83ac01749043 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2553996 Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
Diffstat (limited to 'common/firmware_image.lds.S')
-rw-r--r--common/firmware_image.lds.S30
1 files changed, 27 insertions, 3 deletions
diff --git a/common/firmware_image.lds.S b/common/firmware_image.lds.S
index 7fc53ec4fd..65014336ab 100644
--- a/common/firmware_image.lds.S
+++ b/common/firmware_image.lds.S
@@ -22,6 +22,17 @@
CONFIG_RW_B_STORAGE_OFF)
#elif (CONFIG_RO_MEM_OFF == CONFIG_RW_MEM_OFF)
+
+#ifdef CONFIG_PROGRAM_MEMORY_BASE_LOAD
+
+#define IMAGE_RO_AT (CONFIG_PROGRAM_MEMORY_BASE_LOAD + CONFIG_RO_MEM_OFF)
+#define IMAGE_RW_AT (CONFIG_PROGRAM_MEMORY_BASE_LOAD + \
+ CONFIG_RO_MEM_OFF + CONFIG_RO_SIZE)
+#define IMAGE_RW_B_AT (CONFIG_PROGRAM_MEMORY_BASE_LOAD + \
+ CONFIG_RO_MEM_OFF + CONFIG_RO_SIZE + CONFIG_RW_SIZE)
+
+#else
+
#define IMAGE_RO_AT (CONFIG_PROGRAM_MEMORY_BASE + CONFIG_RO_MEM_OFF)
/* This is applicable to ECs in which RO and RW execution is
mapped to the same location but we still have to generate an ec.bin with RO
@@ -31,12 +42,21 @@ and RW images at different Flash offset */
#define IMAGE_RW_B_AT (CONFIG_PROGRAM_MEMORY_BASE + \
CONFIG_RO_MEM_OFF + CONFIG_RO_SIZE + CONFIG_RW_SIZE)
+#endif /* CONFIG_PROGRAM_MEMORY_BASE_LOAD */
+
#else
#define IMAGE_RO_AT (CONFIG_PROGRAM_MEMORY_BASE + CONFIG_RO_MEM_OFF)
#define IMAGE_RW_AT (CONFIG_PROGRAM_MEMORY_BASE + CONFIG_RW_MEM_OFF)
#define IMAGE_RW_B_AT (CONFIG_PROGRAM_MEMORY_BASE + CONFIG_RW_B_MEM_OFF)
#endif
+#ifdef CONFIG_PROGRAM_MEMORY_BASE_LOAD
+#define IMAGE_PADDING_AT (CONFIG_PROGRAM_MEMORY_BASE_LOAD + \
+ CONFIG_FLASH_SIZE - 1)
+#else
+#define IMAGE_PADDING_AT (CONFIG_PROGRAM_MEMORY_BASE + CONFIG_FLASH_SIZE - 1)
+#endif
+
OUTPUT_FORMAT(BFD_FORMAT, BFD_FORMAT, BFD_FORMAT)
OUTPUT_ARCH(BFD_ARCH)
@@ -49,7 +69,7 @@ MEMORY
LENGTH = (CONFIG_IPC_SHARED_OBJ_BUF_SIZE + 8) * 2
#endif
#ifdef CONFIG_DRAM_BASE
- DRAM (rx) : ORIGIN = CONFIG_DRAM_BASE_LOAD, LENGTH = CONFIG_DRAM_SIZE
+ DRAM (rx) : ORIGIN = CONFIG_DRAM_BASE, LENGTH = CONFIG_DRAM_SIZE
#endif
}
@@ -96,13 +116,17 @@ SECTIONS
} > FLASH =0xff
#endif
#endif
- .padding : AT(CONFIG_PROGRAM_MEMORY_BASE + CONFIG_FLASH_SIZE - 1) {
+ .padding : AT(IMAGE_PADDING_AT) {
BYTE(0xff);
} > FLASH =0xff
#ifdef CONFIG_IPI
/* The section holds address of IPI buffer but no symbols. */
- .ipi_buffer(NOLOAD) : {
+ .ipi_buffer(NOLOAD) :
+#ifdef CONFIG_PROGRAM_MEMORY_BASE_LOAD
+ AT(CONFIG_PROGRAM_MEMORY_BASE_LOAD + CONFIG_IPC_SHARED_OBJ_ADDR)
+#endif
+ {
} > IPI_BUFFER
#endif