aboutsummaryrefslogtreecommitdiff
path: root/src/host/imxrt-boot-header-1180.x
blob: 101725aa84271b7ae29e8820495285ae730e7609 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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 ---=== */