Re: [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation

2018-06-20 Thread Bin Meng
On Thu, Jun 21, 2018 at 12:30 PM, Bin Meng  wrote:
> On Wed, Jun 20, 2018 at 2:40 AM, Ivan Gorinov  wrote:
>> Add setjmp/longjmp functions for x86_64.
>>
>> Signed-off-by: Ivan Gorinov 
>> ---
>>  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 

applied to u-boot-x86, thanks!
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation

2018-06-20 Thread Bin Meng
On Wed, Jun 20, 2018 at 2:40 AM, Ivan Gorinov  wrote:
> Add setjmp/longjmp functions for x86_64.
>
> Signed-off-by: Ivan Gorinov 
> ---
>  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 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation

2018-06-19 Thread Ivan Gorinov
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

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [PATCH v3] x86: Add 64-bit setjmp/longjmp implementation

2018-06-19 Thread Ivan Gorinov
Add setjmp/longjmp functions for x86_64.

Signed-off-by: Ivan Gorinov 
---
 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 000..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 
+
+.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 */
+   movq8(%rdi), %rsp
+   movq16(%rdi), %rbp
+   movq24(%rdi), %rbx
+   movq32(%rdi), %r12
+   movq40(%rdi), %r13
+   movq48(%rdi), %r14
+   movq56(%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..000
--- 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 
-#include 
-
-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

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot