diff options
author | Tzung-Bi Shih <tzungbi@chromium.org> | 2020-11-23 13:24:51 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-12-16 05:19:48 +0000 |
commit | df1e7a01c2a9ad696b66a4f1a4bee56512a1c2ab (patch) | |
tree | 4a018e10f6238b10554962aad65817bc6d3acea0 /common/firmware_image.lds.S | |
parent | 7303a75202abb8f0a9a232ce2ab91fe20f12b072 (diff) | |
download | chrome-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.S | 30 |
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 |