arm: mxs: Adjust the load address of U-Boot and SPL for HAB
Subsystems (3)
PATCH 1/2 arm: mxs: Adjust the load address of U-Boot and SPL for HAB
When using HAB, there are additional special requirements on the placement of U-Boot and the U-Boot SPL in memory. To fullfill these, this patch moves the U-Boot binary a little further from the begining of the DRAM, so the HAB CST and IVT can be placed in front of the U-Boot binary. This is necessary, since both the U-Boot and the IVT must be contained in single CST signature. To make things worse, the IVT must be concatenated with one more entry at it's end, that is the length of the entire CST signature, IVT and U-Boot binary in memory. By placing the blocks in this order -- CST, IVT, U-Boot, we can easily align them all and then produce the length field as needed.
As for the SPL, on i.MX23/i.MX28, the SPL size is limited to 32 KiB, thus we place the IVT at 0x8000 offset, CST right past IVT and claim the size is correct. The HAB library accepts this setup.
Finally, to make sure the vectoring in SPL still works even after moving the SPL from 0x0 to 0x1000, we add a small function which copies the vectoring code and tables to 0x0. This is fine, since the vectoring code is position independent.
--- arch/arm/cpu/arm926ejs/mxs/mxsimage.mx23.cfg | 8 ++++---- arch/arm/cpu/arm926ejs/mxs/mxsimage.mx28.cfg | 8 ++++---- arch/arm/cpu/arm926ejs/mxs/spl_boot.c | 14 ++++++++++++++ arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds | 2 +- include/configs/mxs.h | 10 +++++++++- 5 files changed, 32 insertions(+), 10 deletions(-)
arch/arm/cpu/arm926ejs/mxs/mxsimage.mx23.cfg +4 -4
@@ -1,6 +1,6 @@ SECTION 0x0 BOOTABLE TAG LAST - LOAD 0x0 spl/u-boot-spl.bin - CALL 0x14 0x0 - LOAD 0x40000100 u-boot.bin - CALL 0x40000100 0x0 + LOAD 0x1000 spl/u-boot-spl.bin + CALL 0x1000 0x0 + LOAD 0x40002000 u-boot.bin + CALL 0x40002000 0x0
arch/arm/cpu/arm926ejs/mxs/mxsimage.mx28.cfg +4 -4
@@ -1,8 +1,8 @@ SECTION 0x0 BOOTABLE TAG LAST - LOAD 0x0 spl/u-boot-spl.bin - LOAD IVT 0x8000 0x14 + LOAD 0x1000 spl/u-boot-spl.bin + LOAD IVT 0x8000 0x1000 CALL HAB 0x8000 0x0 - LOAD 0x40000100 u-boot.bin - LOAD IVT 0x8000 0x40000100 + LOAD 0x40002000 u-boot.bin + LOAD IVT 0x8000 0x40002000 CALL HAB 0x8000 0x0
arch/arm/cpu/arm926ejs/mxs/spl_boot.c +14 -0
@@ -117,6 +117,18 @@ static void mxs_spl_console_init(void)#endif } +static void mxs_spl_fixup_vectors (void ) +{ +/* +* Copy our vector table to 0x0, since due to HAB, we cannot +* be loaded to 0x0. We want to have working vectoring though, +* thus this fixup. Our vectoring table is PIC, so copying is +* fine. +*/ +extern uint32_t _start; +memcpy (0x0 , &_start,0x60 ); +} +void mxs_common_spl_init (const uint32_t arg,const uint32_t *resptr,const iomux_cfg_t *iomux_setup,const unsigned int iomux_size)
@@ -126,6 +138,8 @@ void mxs_common_spl_init(const uint32_t arg, const uint32_t *resptr,uint8_t bootmode =mxs_get_bootmode_index (); gd = &gdata; +mxs_spl_fixup_vectors (); +mxs_iomux_setup_multiple_pads (iomux_setup, iomux_size);mxs_spl_console_init ();
arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds +1 -1
@@ -16,7 +16,7 @@ OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { - . = 0x00000000; + . = CONFIG_SPL_TEXT_BASE; . = ALIGN(4); .text :
include/configs/mxs.h +9 -1
@@ -80,8 +80,16 @@* We need to sacrifice first 4 bytes of RAM here to avoid triggering some * strange BUG in ROM corrupting first 4 bytes of RAM when loading U-Boot * binary. In case there was more of this mess, 0x100 bytes are skipped. +* +* In case of a HAB boot, we cannot for some weird reason use the first 4KiB +* of DRAM when loading. Moreover, we use the first 4 KiB for IVT and CST +* blocks, thus U-Boot starts at offset +8 KiB of DRAM start. +* +* As for the SPL, we must avoid the first 4 KiB as well, but we load the +* IVT and CST to 0x8000, so we don't need to waste the subsequent 4 KiB. */ -#define CONFIG_SYS_TEXT_BASE 0x40000100 +#define CONFIG_SYS_TEXT_BASE 0x40002000 +#define CONFIG_SPL_TEXT_BASE 0x00001000/* U-Boot general configuration */ #define CONFIG_SYS_LONGHELP
Signature · 1 line
1.9.0
PATCH 2/2 arm: mxs: Add support for generating signed BootStream
This patch adds the groundwork for generating signed BootStream, which can be used by the HAB library in i.MX28. We are adding a new target, u-boot-signed.sb , since the process for generating regular non-signed BootStream is much easier. Moreover, the signed bootstream depends on external _proprietary_ _binary-only_ tool from Freescale called 'cst', which is available only under NDA.
To make things even uglier, the CST or HAB mandates a kind-of circular dependency. The problem is, unlike the regular IVT, which is generated by mxsimage, the IVT for signed boot must be generated by hand here due to special demands of the CST. The U-Boot binary (or SPL binary) and IVT are then signed by the CST as a one block. But here is the problem. The size of the entire image (U-Boot, IVT, CST blocks) must be appended at the end of IVT. But the size of the entire image is not known until the CST has finished signing the U-Boot and IVT. We solve this by expecting the CST block to be always 3904B (which it is in case two files, U-Boot and the hand-made IVT, are signed in the CST block).
--- Makefile | 2 + arch/arm/cpu/arm926ejs/mxs/Makefile | 60 ++++++++++++++++++++++++++ arch/arm/cpu/arm926ejs/mxs/mxsimage-signed.cfg | 10 +++++ 3 files changed, 72 insertions(+) create mode 100644 arch/arm/cpu/arm926ejs/mxs/mxsimage-signed.cfg
NOTE: Stefano, I had to tweak this to play well with kbuild.
Makefile +2 -0
@@ -849,6 +849,8 @@ OBJCOPYFLAGS_u-boot.ais = -I binary -O binary --pad-to=$(CONFIG_SPL_MAX_SIZE) u-boot.ais: spl/u-boot-spl.ais u-boot.img FORCE $(call if_changed,pad_cat) +u-boot-signed.sb: u-boot.bin spl/u-boot-spl.bin + $(Q)$(MAKE) $(build)=arch/arm/cpu/arm926ejs/mxs u-boot-signed.sb u-boot.sb: u-boot.bin spl/u-boot-spl.bin $(Q)$(MAKE) $(build)=arch/arm/cpu/arm926ejs/mxs u-boot.sb
arch/arm/cpu/arm926ejs/mxs/Makefile +60 -0
69 lines not on this page · raw message
arch/arm/cpu/arm926ejs/mxs/mxsimage-signed.cfg new file +10 -0
@@ -0,0 +1,10 @@ +SECTION 0x0 BOOTABLE + TAG LAST + LOAD 0x1000 spl/u-boot-spl.bin + LOAD 0x8000 spl/u-boot-spl.ivt + LOAD 0x8040 spl/u-boot-spl.sig + CALL HAB 0x8000 0x0 + LOAD 0x40002000 u-boot.bin + LOAD 0x40001000 u-boot.ivt + LOAD 0x40001040 u-boot.sig + CALL HAB 0x40001000 0x0
Signature · 1 line
1.9.0
PATCH 2/2 arm: mxs: Add support for generating signed BootStream
Hi Marek,
Quoted 20 lines · Marek Vasut
This patch adds the groundwork for generating signed BootStream, which can be used by the HAB library in i.MX28. We are adding a new target, u-boot-signed.sb , since the process for generating regular non-signed BootStream is much easier. Moreover, the signed bootstream depends on external _proprietary_ _binary-only_ tool from Freescale called 'cst', which is available only under NDA.
To make things even uglier, the CST or HAB mandates a kind-of circular dependency. The problem is, unlike the regular IVT, which is generated by mxsimage, the IVT for signed boot must be generated by hand here due to special demands of the CST. The U-Boot binary (or SPL binary) and IVT are then signed by the CST as a one block. But here is the problem. The size of the entire image (U-Boot, IVT, CST blocks) must be appended at the end of IVT. But the size of the entire image is not known until the CST has finished signing the U-Boot and IVT. We solve this by expecting the CST block to be always 3904B (which it is in case two files, U-Boot and the hand-made IVT, are signed in the CST block).
Signed-off-by Marek Vasut <[email protected]>Cc Stefano Babic <[email protected]>
Quoted 9 lines
--- Makefile | 2 + arch/arm/cpu/arm926ejs/mxs/Makefile | 60 ++++++++++++++++++++++++++ arch/arm/cpu/arm926ejs/mxs/mxsimage-signed.cfg | 10 +++++ 3 files changed, 72 insertions(+) create mode 100644 arch/arm/cpu/arm926ejs/mxs/mxsimage-signed.cfgNOTE: Stefano, I had to tweak this to play well with kbuild.
ok - only to track what we have already discussed via IIRC.
The patch was already accepted, but it conflicts with current u-boot-arm. I revert it on u-boot-imx, and Marek rebased it.
Marek, I could not apply it directly after merging u-boot-arm - maybe because we set on different commit id. Never mind, I merge it again and it looks ok.
I have pushed a -test branch on u-boot-imx after merging u-boot-arm and your patches. It looks ok, and if you do not complain, I will send it to Albert for inclusion in u-boot-arm.
Thanks,
Stefano
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH 2/2 arm: mxs: Add support for generating signed BootStream
Quoted 39 lines · Stefano Babic
Hi Marek,
Quoted 22 lines · Marek Vasut
This patch adds the groundwork for generating signed BootStream, which can be used by the HAB library in i.MX28. We are adding a new target, u-boot-signed.sb , since the process for generating regular non-signed BootStream is much easier. Moreover, the signed bootstream depends on external _proprietary_ _binary-only_ tool from Freescale called 'cst', which is available only under NDA.
To make things even uglier, the CST or HAB mandates a kind-of circular dependency. The problem is, unlike the regular IVT, which is generated by mxsimage, the IVT for signed boot must be generated by hand here due to special demands of the CST. The U-Boot binary (or SPL binary) and IVT are then signed by the CST as a one block. But here is the problem. The size of the entire image (U-Boot, IVT, CST blocks) must be appended at the end of IVT. But the size of the entire image is not known until the CST has finished signing the U-Boot and IVT. We solve this by expecting the CST block to be always 3904B (which it is in case two files, U-Boot and the hand-made IVT, are signed in the CST block).
Signed-off-by Marek Vasut <[email protected]>Cc Stefano Babic <[email protected]>---
Quoted 8 lines
Makefile | 2 + arch/arm/cpu/arm926ejs/mxs/Makefile | 60 ++++++++++++++++++++++++++ arch/arm/cpu/arm926ejs/mxs/mxsimage-signed.cfg | 10 +++++ 3 files changed, 72 insertions(+) create mode 100644 arch/arm/cpu/arm926ejs/mxs/mxsimage-signed.cfgNOTE: Stefano, I had to tweak this to play well with kbuild.
ok - only to track what we have already discussed via IIRC.
The patch was already accepted, but it conflicts with current u-boot-arm. I revert it on u-boot-imx, and Marek rebased it.
Quoted 7 lines
Marek, I could not apply it directly after merging u-boot-arm - maybe because we set on different commit id. Never mind, I merge it again and it looks ok.
I have pushed a -test branch on u-boot-imx after merging u-boot-arm and your patches. It looks ok, and if you do not complain, I will send it to Albert for inclusion in u-boot-arm.
All good, thank you !
Best regards,
Marek Vasut
PATCH 1/2 arm: mxs: Adjust the load address of U-Boot and SPL for HAB
In reply to Marek VasutHi Marek,
Quoted 14 lines · Marek Vasut
When using HAB, there are additional special requirements on the placement of U-Boot and the U-Boot SPL in memory. To fullfill these, this patch moves the U-Boot binary a little further from the begining of the DRAM, so the HAB CST and IVT can be placed in front of the U-Boot binary. This is necessary, since both the U-Boot and the IVT must be contained in single CST signature. To make things worse, the IVT must be concatenated with one more entry at it's end, that is the length of the entire CST signature, IVT and U-Boot binary in memory. By placing the blocks in this order -- CST, IVT, U-Boot, we can easily align them all and then produce the length field as needed.
As for the SPL, on i.MX23/i.MX28, the SPL size is limited to 32 KiB, thus we place the IVT at
0x8000offset, CST right past IVT and claim the size is correct. The HAB library accepts this setup.
Quoted 8 lines
Finally, to make sure the vectoring in SPL still works even after moving the SPL from
0x0to0x1000, we add a small function which copies the vectoring code and tables to0x0. This is fine, since the vectoring code is position independent.Signed-off-by Marek Vasut <[email protected]>Cc Stefano Babic <[email protected]>---
Thanks for checking this. Your changes reflect the fixes I do to solve conflicts for this patch when merging u-boot-arm.
I had reverse Patch 2/2, but not Patch 1/1. In fact, there are later commit that does not allow to revert the patch. However, I am confident that fixes are ok, so I will let in this way.
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================