arm64: Allow EFI payload code to take exceptions
There are 2 ways an EFI payload could return into u-boot: - Callback function - Exception While in EFI payload mode, x18 is owned by the payload and may not contain a valid pointer to gd, so we need to fix it up. We do that properly for the payload to callback path already. This patch also adds gd pointer restoral for the exception path. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
4c2cc7c4e9
commit
649829157e
@ -7,6 +7,7 @@
|
||||
|
||||
#include <common.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <efi_loader.h>
|
||||
|
||||
|
||||
int interrupt_init(void)
|
||||
@ -41,6 +42,7 @@ void show_regs(struct pt_regs *regs)
|
||||
*/
|
||||
void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
@ -51,6 +53,7 @@ void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
|
||||
*/
|
||||
void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
@ -61,6 +64,7 @@ void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
*/
|
||||
void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
@ -71,6 +75,7 @@ void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
*/
|
||||
void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
@ -81,6 +86,7 @@ void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
|
||||
*/
|
||||
void do_sync(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
@ -91,6 +97,7 @@ void do_sync(struct pt_regs *pt_regs, unsigned int esr)
|
||||
*/
|
||||
void do_irq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("\"Irq\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
@ -101,6 +108,7 @@ void do_irq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
*/
|
||||
void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("\"Fiq\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
@ -114,6 +122,7 @@ void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
|
||||
*/
|
||||
void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
|
||||
{
|
||||
efi_restore_gd();
|
||||
printf("\"Error\" handler, esr 0x%08x\n", esr);
|
||||
show_regs(pt_regs);
|
||||
panic("Resetting CPU ...\n");
|
||||
|
Loading…
Reference in New Issue
Block a user