summaryrefslogtreecommitdiff
path: root/arch/sandbox/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sandbox/cpu')
-rw-r--r--arch/sandbox/cpu/cpu.c13
-rw-r--r--arch/sandbox/cpu/os.c23
-rw-r--r--arch/sandbox/cpu/u-boot.lds29
3 files changed, 65 insertions, 0 deletions
diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c
index d4ad020012..cde0b055a6 100644
--- a/arch/sandbox/cpu/cpu.c
+++ b/arch/sandbox/cpu/cpu.c
@@ -9,6 +9,7 @@
#include <linux/libfdt.h>
#include <os.h>
#include <asm/io.h>
+#include <asm/setjmp.h>
#include <asm/state.h>
#include <dm/root.h>
@@ -164,3 +165,15 @@ ulong timer_get_boot_us(void)
return (count - base_count) / 1000;
}
+
+int setjmp(jmp_buf jmp)
+{
+ return os_setjmp((ulong *)jmp, sizeof(*jmp));
+}
+
+void longjmp(jmp_buf jmp, int ret)
+{
+ os_longjmp((ulong *)jmp, ret);
+ while (1)
+ ;
+}
diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index d76d0211a2..5839932b00 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -7,6 +7,7 @@
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
+#include <setjmp.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
@@ -628,3 +629,25 @@ void os_localtime(struct rtc_time *rt)
rt->tm_yday = tm->tm_yday;
rt->tm_isdst = tm->tm_isdst;
}
+
+int os_setjmp(ulong *jmp, int size)
+{
+ jmp_buf dummy;
+
+ /*
+ * We cannot rely on the struct name that jmp_buf uses, so use a
+ * local variable here
+ */
+ if (size < sizeof(dummy)) {
+ printf("setjmp: jmpbuf is too small (%d bytes, need %d)\n",
+ size, sizeof(jmp_buf));
+ return -ENOSPC;
+ }
+
+ return setjmp((struct __jmp_buf_tag *)jmp);
+}
+
+void os_longjmp(ulong *jmp, int ret)
+{
+ longjmp((struct __jmp_buf_tag *)jmp, ret);
+}
diff --git a/arch/sandbox/cpu/u-boot.lds b/arch/sandbox/cpu/u-boot.lds
index f97abdfa05..3a6cf55eb9 100644
--- a/arch/sandbox/cpu/u-boot.lds
+++ b/arch/sandbox/cpu/u-boot.lds
@@ -18,6 +18,35 @@ SECTIONS
__u_boot_sandbox_option_end = .;
__bss_start = .;
+
+ .__efi_runtime_start : {
+ *(.__efi_runtime_start)
+ }
+
+ .efi_runtime : {
+ *(efi_runtime_text)
+ *(efi_runtime_data)
+ }
+
+ .__efi_runtime_stop : {
+ *(.__efi_runtime_stop)
+ }
+
+ .efi_runtime_rel_start :
+ {
+ *(.__efi_runtime_rel_start)
+ }
+
+ .efi_runtime_rel : {
+ *(.relefi_runtime_text)
+ *(.relefi_runtime_data)
+ }
+
+ .efi_runtime_rel_stop :
+ {
+ *(.__efi_runtime_rel_stop)
+ }
+
}
INSERT BEFORE .data;