Skip to content
Snippets Groups Projects
Commit 8bc347e2 authored by Hans de Goede's avatar Hans de Goede Committed by Albert ARIBAUD
Browse files

ARM: bootm: Allow booting in secure mode on hyp capable systems


Older Linux kernels will not properly boot in hyp mode, add support for a
bootm_boot_mode environment variable, which can be set to "sec" or "nonsec"
to force booting in secure or non-secure mode when build with non-sec support.

The default behavior can be selected through CONFIG_ARMV7_BOOT_SEC_DEFAULT,
when this is set booting in secure mode is the default. The default setting
for this Kconfig option is N, preserving the current behavior of booting in
non-secure mode by default when non-secure mode is supported.

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Acked-by: default avatarSiarhei Siamashka <siarhei.siamashka@gmail.com>
parent ea624e19
No related branches found
No related tags found
No related merge requests found
...@@ -13,6 +13,17 @@ config ARMV7_NONSEC ...@@ -13,6 +13,17 @@ config ARMV7_NONSEC
---help--- ---help---
Say Y here to enable support for booting in non-secure / SVC mode. Say Y here to enable support for booting in non-secure / SVC mode.
config ARMV7_BOOT_SEC_DEFAULT
boolean "Boot in secure mode by default" if EXPERT
depends on ARMV7_NONSEC
default n
---help---
Say Y here to boot in secure mode by default even if non-secure mode
is supported. This option is useful to boot kernels which do not
suppport booting in non-secure mode. Only set this if you need it.
This can be overriden at run-time by setting the bootm_boot_mode env.
variable to "sec" or "nonsec".
config ARMV7_VIRT config ARMV7_VIRT
boolean "Enable support for hardware virtualization" if EXPERT boolean "Enable support for hardware virtualization" if EXPERT
depends on CPU_V7_HAS_VIRT && ARMV7_NONSEC depends on CPU_V7_HAS_VIRT && ARMV7_NONSEC
......
...@@ -237,6 +237,26 @@ static void boot_prep_linux(bootm_headers_t *images) ...@@ -237,6 +237,26 @@ static void boot_prep_linux(bootm_headers_t *images)
} }
} }
#if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
static bool boot_nonsec(void)
{
char *s = getenv("bootm_boot_mode");
#ifdef CONFIG_ARMV7_BOOT_SEC_DEFAULT
bool nonsec = false;
#else
bool nonsec = true;
#endif
if (s && !strcmp(s, "sec"))
nonsec = false;
if (s && !strcmp(s, "nonsec"))
nonsec = true;
return nonsec;
}
#endif
/* Subcommand: GO */ /* Subcommand: GO */
static void boot_jump_linux(bootm_headers_t *images, int flag) static void boot_jump_linux(bootm_headers_t *images, int flag)
{ {
...@@ -285,12 +305,13 @@ static void boot_jump_linux(bootm_headers_t *images, int flag) ...@@ -285,12 +305,13 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
if (!fake) { if (!fake) {
#if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT) #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
armv7_init_nonsec(); if (boot_nonsec()) {
secure_ram_addr(_do_nonsec_entry)(kernel_entry, armv7_init_nonsec();
0, machid, r2); secure_ram_addr(_do_nonsec_entry)(kernel_entry,
#else 0, machid, r2);
kernel_entry(0, machid, r2); } else
#endif #endif
kernel_entry(0, machid, r2);
} }
#endif #endif
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment