* [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation
@ 2018-06-19 18:39 Ivan Gorinov
2018-06-19 18:40 ` Ivan Gorinov
0 siblings, 1 reply; 4+ messages in thread
From: Ivan Gorinov @ 2018-06-19 18:39 UTC (permalink / raw)
To: u-boot
Add setjmp/longjmp functions for x86_64.
v3:
Removed the FPU control word and MXCSR;
Corrected SPDX License Identifier.
v2:
Added the FPU control word and MXCSR to jmp_buf;
Using ENTRY/ENDPROC macros.
Ivan Gorinov (1):
x86: Add 64-bit setjmp/longjmp implementation
arch/x86/cpu/x86_64/setjmp.S | 49 +++++++++++++++++++++++++++++++++++++++++++
arch/x86/cpu/x86_64/setjmp.c | 19 -----------------
arch/x86/include/asm/setjmp.h | 17 +++++++++++++++
3 files changed, 66 insertions(+), 19 deletions(-)
create mode 100644 arch/x86/cpu/x86_64/setjmp.S
delete mode 100644 arch/x86/cpu/x86_64/setjmp.c
--
2.7.4
^ permalink raw reply [flat|nested] 4+ messages in thread
* [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation
2018-06-19 18:39 [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation Ivan Gorinov
@ 2018-06-19 18:40 ` Ivan Gorinov
2018-06-21 4:30 ` Bin Meng
0 siblings, 1 reply; 4+ messages in thread
From: Ivan Gorinov @ 2018-06-19 18:40 UTC (permalink / raw)
To: u-boot
Add setjmp/longjmp functions for x86_64.
Signed-off-by: Ivan Gorinov <ivan.gorinov@intel.com>
---
arch/x86/cpu/x86_64/setjmp.S | 49 +++++++++++++++++++++++++++++++++++++++++++
arch/x86/cpu/x86_64/setjmp.c | 19 -----------------
arch/x86/include/asm/setjmp.h | 17 +++++++++++++++
3 files changed, 66 insertions(+), 19 deletions(-)
create mode 100644 arch/x86/cpu/x86_64/setjmp.S
delete mode 100644 arch/x86/cpu/x86_64/setjmp.c
diff --git a/arch/x86/cpu/x86_64/setjmp.S b/arch/x86/cpu/x86_64/setjmp.S
new file mode 100644
index 0000000..97b8128
--- /dev/null
+++ b/arch/x86/cpu/x86_64/setjmp.S
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2018 Intel Corporation
+ *
+ * See arch/x86/include/asm/setjmp.h for jmp_buf format
+ */
+
+#include <linux/linkage.h>
+
+.text
+.align 8
+
+ENTRY(setjmp)
+
+ pop %rcx
+ movq %rcx, (%rdi) /* Return address */
+ movq %rsp, 8(%rdi)
+ movq %rbp, 16(%rdi)
+ movq %rbx, 24(%rdi)
+ movq %r12, 32(%rdi)
+ movq %r13, 40(%rdi)
+ movq %r14, 48(%rdi)
+ movq %r15, 56(%rdi)
+ xorq %rax, %rax /* Direct invocation returns 0 */
+ jmpq *%rcx
+
+ENDPROC(setjmp)
+
+.align 8
+
+ENTRY(longjmp)
+
+ movq (%rdi), %rcx /* Return address */
+ movq 8(%rdi), %rsp
+ movq 16(%rdi), %rbp
+ movq 24(%rdi), %rbx
+ movq 32(%rdi), %r12
+ movq 40(%rdi), %r13
+ movq 48(%rdi), %r14
+ movq 56(%rdi), %r15
+
+ movq %rsi, %rax /* Value to be returned by setjmp() */
+ testq %rax, %rax /* cannot be 0 in this case */
+ jnz 1f
+ incq %rax /* Return 1 instead */
+1:
+ jmpq *%rcx
+
+ENDPROC(longjmp)
diff --git a/arch/x86/cpu/x86_64/setjmp.c b/arch/x86/cpu/x86_64/setjmp.c
deleted file mode 100644
index 5d4a74a..0000000
--- a/arch/x86/cpu/x86_64/setjmp.c
+++ /dev/null
@@ -1,19 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright (c) 2016 Google, Inc
- */
-
-#include <common.h>
-#include <asm/setjmp.h>
-
-int setjmp(struct jmp_buf_data *jmp_buf)
-{
- printf("WARNING: setjmp() is not supported\n");
-
- return 0;
-}
-
-void longjmp(struct jmp_buf_data *jmp_buf, int val)
-{
- printf("WARNING: longjmp() is not supported\n");
-}
diff --git a/arch/x86/include/asm/setjmp.h b/arch/x86/include/asm/setjmp.h
index f25975f..49c36c1 100644
--- a/arch/x86/include/asm/setjmp.h
+++ b/arch/x86/include/asm/setjmp.h
@@ -8,6 +8,21 @@
#ifndef __setjmp_h
#define __setjmp_h
+#ifdef CONFIG_X86_64
+
+struct jmp_buf_data {
+ unsigned long __rip;
+ unsigned long __rsp;
+ unsigned long __rbp;
+ unsigned long __rbx;
+ unsigned long __r12;
+ unsigned long __r13;
+ unsigned long __r14;
+ unsigned long __r15;
+};
+
+#else
+
struct jmp_buf_data {
unsigned int __ebx;
unsigned int __esp;
@@ -17,6 +32,8 @@ struct jmp_buf_data {
unsigned int __eip;
};
+#endif
+
int setjmp(struct jmp_buf_data *jmp_buf);
void longjmp(struct jmp_buf_data *jmp_buf, int val);
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation
2018-06-19 18:40 ` Ivan Gorinov
@ 2018-06-21 4:30 ` Bin Meng
2018-06-21 4:50 ` Bin Meng
0 siblings, 1 reply; 4+ messages in thread
From: Bin Meng @ 2018-06-21 4:30 UTC (permalink / raw)
To: u-boot
On Wed, Jun 20, 2018 at 2:40 AM, Ivan Gorinov <ivan.gorinov@intel.com> wrote:
> Add setjmp/longjmp functions for x86_64.
>
> Signed-off-by: Ivan Gorinov <ivan.gorinov@intel.com>
> ---
> arch/x86/cpu/x86_64/setjmp.S | 49 +++++++++++++++++++++++++++++++++++++++++++
> arch/x86/cpu/x86_64/setjmp.c | 19 -----------------
> arch/x86/include/asm/setjmp.h | 17 +++++++++++++++
> 3 files changed, 66 insertions(+), 19 deletions(-)
> create mode 100644 arch/x86/cpu/x86_64/setjmp.S
> delete mode 100644 arch/x86/cpu/x86_64/setjmp.c
>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation
2018-06-21 4:30 ` Bin Meng
@ 2018-06-21 4:50 ` Bin Meng
0 siblings, 0 replies; 4+ messages in thread
From: Bin Meng @ 2018-06-21 4:50 UTC (permalink / raw)
To: u-boot
On Thu, Jun 21, 2018 at 12:30 PM, Bin Meng <bmeng.cn@gmail.com> wrote:
> On Wed, Jun 20, 2018 at 2:40 AM, Ivan Gorinov <ivan.gorinov@intel.com> wrote:
>> Add setjmp/longjmp functions for x86_64.
>>
>> Signed-off-by: Ivan Gorinov <ivan.gorinov@intel.com>
>> ---
>> arch/x86/cpu/x86_64/setjmp.S | 49 +++++++++++++++++++++++++++++++++++++++++++
>> arch/x86/cpu/x86_64/setjmp.c | 19 -----------------
>> arch/x86/include/asm/setjmp.h | 17 +++++++++++++++
>> 3 files changed, 66 insertions(+), 19 deletions(-)
>> create mode 100644 arch/x86/cpu/x86_64/setjmp.S
>> delete mode 100644 arch/x86/cpu/x86_64/setjmp.c
>>
>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
applied to u-boot-x86, thanks!
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-06-21 4:50 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-06-19 18:39 [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation Ivan Gorinov
2018-06-19 18:40 ` Ivan Gorinov
2018-06-21 4:30 ` Bin Meng
2018-06-21 4:50 ` Bin Meng
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.