Skip to content
Snippets Groups Projects
Commit cc4a4748 authored by Alexander Graf's avatar Alexander Graf Committed by Tom Rini
Browse files

arm: 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, r9 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: default avatarAlexander Graf <agraf@suse.de>
parent da3e620d
No related branches found
No related tags found
No related merge requests found
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <common.h> #include <common.h>
#include <asm/proc-armv/ptrace.h> #include <asm/proc-armv/ptrace.h>
#include <asm/u-boot-arm.h> #include <asm/u-boot-arm.h>
#include <efi_loader.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
...@@ -165,6 +166,7 @@ void show_regs (struct pt_regs *regs) ...@@ -165,6 +166,7 @@ void show_regs (struct pt_regs *regs)
void do_undefined_instruction (struct pt_regs *pt_regs) void do_undefined_instruction (struct pt_regs *pt_regs)
{ {
efi_restore_gd();
printf ("undefined instruction\n"); printf ("undefined instruction\n");
show_regs (pt_regs); show_regs (pt_regs);
bad_mode (); bad_mode ();
...@@ -172,6 +174,7 @@ void do_undefined_instruction (struct pt_regs *pt_regs) ...@@ -172,6 +174,7 @@ void do_undefined_instruction (struct pt_regs *pt_regs)
void do_software_interrupt (struct pt_regs *pt_regs) void do_software_interrupt (struct pt_regs *pt_regs)
{ {
efi_restore_gd();
printf ("software interrupt\n"); printf ("software interrupt\n");
show_regs (pt_regs); show_regs (pt_regs);
bad_mode (); bad_mode ();
...@@ -179,6 +182,7 @@ void do_software_interrupt (struct pt_regs *pt_regs) ...@@ -179,6 +182,7 @@ void do_software_interrupt (struct pt_regs *pt_regs)
void do_prefetch_abort (struct pt_regs *pt_regs) void do_prefetch_abort (struct pt_regs *pt_regs)
{ {
efi_restore_gd();
printf ("prefetch abort\n"); printf ("prefetch abort\n");
show_regs (pt_regs); show_regs (pt_regs);
bad_mode (); bad_mode ();
...@@ -186,6 +190,7 @@ void do_prefetch_abort (struct pt_regs *pt_regs) ...@@ -186,6 +190,7 @@ void do_prefetch_abort (struct pt_regs *pt_regs)
void do_data_abort (struct pt_regs *pt_regs) void do_data_abort (struct pt_regs *pt_regs)
{ {
efi_restore_gd();
printf ("data abort\n"); printf ("data abort\n");
show_regs (pt_regs); show_regs (pt_regs);
bad_mode (); bad_mode ();
...@@ -193,6 +198,7 @@ void do_data_abort (struct pt_regs *pt_regs) ...@@ -193,6 +198,7 @@ void do_data_abort (struct pt_regs *pt_regs)
void do_not_used (struct pt_regs *pt_regs) void do_not_used (struct pt_regs *pt_regs)
{ {
efi_restore_gd();
printf ("not used\n"); printf ("not used\n");
show_regs (pt_regs); show_regs (pt_regs);
bad_mode (); bad_mode ();
...@@ -200,6 +206,7 @@ void do_not_used (struct pt_regs *pt_regs) ...@@ -200,6 +206,7 @@ void do_not_used (struct pt_regs *pt_regs)
void do_fiq (struct pt_regs *pt_regs) void do_fiq (struct pt_regs *pt_regs)
{ {
efi_restore_gd();
printf ("fast interrupt request\n"); printf ("fast interrupt request\n");
show_regs (pt_regs); show_regs (pt_regs);
bad_mode (); bad_mode ();
...@@ -208,6 +215,7 @@ void do_fiq (struct pt_regs *pt_regs) ...@@ -208,6 +215,7 @@ void do_fiq (struct pt_regs *pt_regs)
#ifndef CONFIG_USE_IRQ #ifndef CONFIG_USE_IRQ
void do_irq (struct pt_regs *pt_regs) void do_irq (struct pt_regs *pt_regs)
{ {
efi_restore_gd();
printf ("interrupt request\n"); printf ("interrupt request\n");
show_regs (pt_regs); show_regs (pt_regs);
bad_mode (); bad_mode ();
......
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