forked from u-boot/u-boot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
efi_loader: refactor switch to non-secure mode
Refactor the switch from supervisor to hypervisor to a new function called at the beginning of do_bootefi(). Signed-off-by: Heinrich Schuchardt <[email protected]> Signed-off-by: Alexander Graf <[email protected]>
- Loading branch information
Showing
7 changed files
with
132 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* Switch to non-secure mode | ||
* | ||
* Copyright (c) 2018 Heinrich Schuchardt | ||
* | ||
* This module contains the ARMv7 specific code required for leaving the | ||
* secure mode before booting an operating system. | ||
*/ | ||
|
||
#include <common.h> | ||
#include <bootm.h> | ||
#include <asm/armv7.h> | ||
#include <asm/secure.h> | ||
#include <asm/setjmp.h> | ||
|
||
/** | ||
* entry_non_secure() - entry point when switching to non-secure mode | ||
* | ||
* When switching to non-secure mode switch_to_non_secure_mode() calls this | ||
* function passing a jump buffer. We use this jump buffer to restore the | ||
* original stack and register state. | ||
* | ||
* @non_secure_jmp: jump buffer for restoring stack and registers | ||
*/ | ||
static void entry_non_secure(struct jmp_buf_data *non_secure_jmp) | ||
{ | ||
dcache_enable(); | ||
debug("Reached non-secure mode\n"); | ||
|
||
/* Restore stack and registers saved in switch_to_non_secure_mode() */ | ||
longjmp(non_secure_jmp, 1); | ||
} | ||
|
||
/** | ||
* switch_to_non_secure_mode() - switch to non-secure mode | ||
* | ||
* Operating systems may expect to run in non-secure mode. Here we check if | ||
* we are running in secure mode and switch to non-secure mode if necessary. | ||
*/ | ||
void switch_to_non_secure_mode(void) | ||
{ | ||
static bool is_nonsec; | ||
struct jmp_buf_data non_secure_jmp; | ||
|
||
if (armv7_boot_nonsec() && !is_nonsec) { | ||
if (setjmp(&non_secure_jmp)) | ||
return; | ||
dcache_disable(); /* flush cache before switch to HYP */ | ||
armv7_init_nonsec(); | ||
is_nonsec = true; | ||
secure_ram_addr(_do_nonsec_entry)(entry_non_secure, | ||
(uintptr_t)&non_secure_jmp, | ||
0, 0); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* Switch to non-secure mode | ||
* | ||
* Copyright (c) 2018 Heinrich Schuchardt | ||
* | ||
* This module contains the ARMv8 specific code required to adjust the exception | ||
* level before booting an operating system. | ||
*/ | ||
|
||
#include <common.h> | ||
#include <bootm.h> | ||
#include <asm/setjmp.h> | ||
|
||
/** | ||
* entry_non_secure() - entry point when switching to non-secure mode | ||
* | ||
* When switching to non-secure mode switch_to_non_secure_mode() calls this | ||
* function passing a jump buffer. We use this jump buffer to restore the | ||
* original stack and register state. | ||
* | ||
* @non_secure_jmp: jump buffer for restoring stack and registers | ||
*/ | ||
static void entry_non_secure(struct jmp_buf_data *non_secure_jmp) | ||
{ | ||
dcache_enable(); | ||
debug("Reached non-secure mode\n"); | ||
|
||
/* Restore stack and registers saved in switch_to_non_secure_mode() */ | ||
longjmp(non_secure_jmp, 1); | ||
} | ||
|
||
/** | ||
* switch_to_non_secure_mode() - switch to non-secure mode | ||
* | ||
* Exception level EL3 is meant to be used by the secure monitor only (ARM | ||
* trusted firmware being one embodiment). The operating system shall be | ||
* started at exception level EL2. So here we check the exception level | ||
* and switch it if necessary. | ||
*/ | ||
void switch_to_non_secure_mode(void) | ||
{ | ||
struct jmp_buf_data non_secure_jmp; | ||
|
||
/* On AArch64 we need to make sure we call our payload in < EL3 */ | ||
if (current_el() == 3) { | ||
if (setjmp(&non_secure_jmp)) | ||
return; | ||
dcache_disable(); /* flush cache before switch to EL2 */ | ||
|
||
/* Move into EL2 and keep running there */ | ||
armv8_switch_to_el2((uintptr_t)&non_secure_jmp, 0, 0, 0, | ||
(uintptr_t)entry_non_secure, ES_TO_AARCH64); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters