diff options
| author | Nils Fitinghoff <nils.fitinghoff@kiteshield.com> | 2024-10-16 13:04:23 +0200 |
|---|---|---|
| committer | Nils Fitinghoff <nils.fitinghoff@kiteshield.com> | 2024-10-17 17:40:20 +0200 |
| commit | 9138706b8a5e4469f33a7a826c08e6446b642a3c (patch) | |
| tree | 1a530c8d1f96cf2193666f9ae595f8f399366899 /src/host/imxrt-boot-header-1180.x | |
| parent | cb3af5ba736443adbf3dbf305f7a95aa23f3d26b (diff) | |
Support RT1180 family
The 1180 family uses a different boot header than previous families. The
header is generated to support the default configuration where hash and
signature errors are ignored.
The XIP `__pre_init` strategy is still used, more for ease of getting
something running than because of any known problems with the boot ROM's
implementation of loading images to different memories.
The boot ROM for the 1180 does not appear to allow the entry point to
lie outside the (loaded or execute-in-place) image, so a new `.xip`
section is added after the vector table to put the address inside the
image while keeping VMA=LMA. This could cause problems for tools that
manipulate binaries based on section names.
Diffstat (limited to 'src/host/imxrt-boot-header-1180.x')
| -rw-r--r-- | src/host/imxrt-boot-header-1180.x | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/host/imxrt-boot-header-1180.x b/src/host/imxrt-boot-header-1180.x new file mode 100644 index 0000000..101725a --- /dev/null +++ b/src/host/imxrt-boot-header-1180.x @@ -0,0 +1,104 @@ +/* ===--- Begin imxrt-boot-header-1180.x ---=== + * This extra content is injected into the linker script depending on the + * runtime configuration. + */ + +__image_size = SIZEOF(.vector_table) + SIZEOF(.text) + SIZEOF(.xip) + SIZEOF(.rodata) + SIZEOF(.data); + +EXTERN(FLEXSPI_CONFIGURATION_BLOCK); + +/* # Sections */ +SECTIONS +{ + /* Boot header for serial NOR FlexSPI XIP. + * + * It's 'XIP' in that it starts executing instructions + * from flash immediately out of reset. The runtime then + * manually copies instructions (data, etc.), and we jump + * to that. After that jump, we're no longer XIP. + * + * The i.MX RT boot ROM also supports a way to copy the + * application image by changing the boot data configuration. + * Specifically, point the 'Image offset' to somewhere other + * than the start of flash, and specify how many bytes to copy. + * The boot ROM copies the image, then jumps to the entry point. + * It is currently not tested or used, mainly for consistency + * with the other iMXRT families. + */ + .boot1 ORIGIN(FLASH): + { + FILL(0x00); + /* ------------------ + * Memory configuration block + * ------------------ + * + * The size and layout is different for different boot devices. Currently, + * only NOR flash is supported. + */ + . += __fcb_offset; /* Can change based on boot source */ + KEEP(*(.fcb)); + . = ORIGIN(FLASH) + 0x1000; + + /* ------------------ + * Container 1 + * ------------------ + */ + __container1_start = .; + LONG(0x87000000 | (__container1_len << 8)); /* Tag, length, version */ + LONG(0); /* Flags */ + LONG(0x01000000); /* 1 image, fuse version 0, SW version 0 */ + LONG(__signature_block_start - __container1_start); /* Signature block offset */ + + /* Image array, image 0 */ + LONG(0xa000); /* Image offset */ + LONG(__image_size); /* Image size */ + QUAD(LOADADDR(.vector_table)); /* Load address (execute in place) */ + QUAD(Reset); /* Entry point */ + LONG(0x213); /* Flags: Unencrypted, SHA512 hashed, executable image for Cortex-M33 */ + LONG(0); /* Reserved (image meta data) */ + } > FLASH + + /* Put the hash in a separate section for easier replacement in a post-build step */ + .image_hash : + { + QUAD(0); /* Hash 512 bytes */ + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + } > FLASH + + .boot2 : + { + FILL(0x00); + QUAD(0); /* IV 256 bytes, zero for unencrypted image */ + QUAD(0); + QUAD(0); + QUAD(0); + + /* ------------------ + * Signature block + * ------------------ + */ + __signature_block_start = .; + LONG(0x90000000 | (__signature_block_len << 8)); /* Tag, length, version */ + LONG(0); /* SRK Table offset, Certificate Offset */ + LONG(0); /* Signature offset, Blob offset */ + LONG(0); /* Reserved */ + __signature_block_end = .; + __signature_block_len = __signature_block_end - __signature_block_start; + __container1_end = .; + __container1_len = __container1_end - __container1_start; + + /* DCD is replaced by XMCD. Satisfy assertions intended for other families. */ + __dcd_start = .; + __dcd_end = .; + + . = ORIGIN(FLASH) + 0x2000; /* Pad to 8k alignment for the container/images boundary */ + } > FLASH +} + +/* ===--- End imxrt-boot-header-1180.x ---=== */ |
