diff options
author | Simon Glass <sjg@chromium.org> | 2015-05-13 07:02:24 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-06-10 19:26:54 -0600 |
commit | 32ba8952cb449f8b151c4c1a27b9e9c3b4995dee (patch) | |
tree | 6d3096b9cfc1a51bd5dcd7aededdc5ed0978aabb | |
parent | 0c5dd9ae2f2e731c5c961fd92fa974aaa3cbdc27 (diff) | |
download | u-boot-imx-32ba8952cb449f8b151c4c1a27b9e9c3b4995dee.zip u-boot-imx-32ba8952cb449f8b151c4c1a27b9e9c3b4995dee.tar.gz u-boot-imx-32ba8952cb449f8b151c4c1a27b9e9c3b4995dee.tar.bz2 |
arm: spl: Add an API to detect when U-Boot is started from SPL
For secure boot systems it is common to have a read-only U-Boot which starts
the machine and jumps to a read-write U-Boot for actual booting the OS. This
allows the read-write U-Boot to be upgraded without risk of permanently
bricking the machine. In the event that the read-write U-Boot is corrupted,
the read-only U-Boot can detect this with a checksum and boot into a
recovery flow.
To support this, add a way to detect when U-Boot is run from SPL as opposed
to some other method, such as booted directly (no SPL) or started from
another source (e.g. a primary U-Boot). This works by putting a special value
in r0.
For now we rely on board-specific code to actually check the register and
set a flag. At some point this could be generalised, perhaps by using a spare
register and passing a flag to _main and/or board_init_f().
This commit does not implement any feature, but merely provides the API for
boards to implement.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | include/spl.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/include/spl.h b/include/spl.h index b2e5bf7..d19940f 100644 --- a/include/spl.h +++ b/include/spl.h @@ -11,6 +11,8 @@ #include <linux/compiler.h> #include <asm/spl.h> +/* Value in r0 indicates we booted from U-Boot */ +#define UBOOT_NOT_LOADED_FROM_SPL 0x13578642 /* Boot type */ #define MMCSD_MODE_UNDEFINED 0 @@ -82,4 +84,15 @@ int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition); #ifdef CONFIG_SPL_BOARD_INIT void spl_board_init(void); #endif + +/** + * spl_was_boot_source() - check if U-Boot booted from SPL + * + * This will normally be true, but if U-Boot jumps to second U-Boot, it will + * be false. This should be implemented by board-specific code. + * + * @return true if U-Boot booted from SPL, else false + */ +bool spl_was_boot_source(void); + #endif |