From 4d3ac6c3268d39929488c14d913af30f8de0368b Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 16 Jan 2017 07:04:20 -0700 Subject: x86: Move setjmp to the i386 directory This code is only used in 32-bit mode. Move it so that it does not get built with 64-bit U-Boot. Signed-off-by: Simon Glass Reviewed-by: Bin Meng --- arch/x86/cpu/Makefile | 3 --- arch/x86/cpu/i386/Makefile | 1 + arch/x86/cpu/i386/setjmp.S | 61 ++++++++++++++++++++++++++++++++++++++++++++++ arch/x86/cpu/setjmp.S | 61 ---------------------------------------------- 4 files changed, 62 insertions(+), 64 deletions(-) create mode 100644 arch/x86/cpu/i386/setjmp.S delete mode 100644 arch/x86/cpu/setjmp.S (limited to 'arch/x86') diff --git a/arch/x86/cpu/Makefile b/arch/x86/cpu/Makefile index 2fda32d..45f95ab 100644 --- a/arch/x86/cpu/Makefile +++ b/arch/x86/cpu/Makefile @@ -14,9 +14,6 @@ else extra-y = start.o endif extra-$(CONFIG_$(SPL_)X86_16BIT_INIT) += resetvec.o start16.o -ifndef CONFIG_$(SPL_)X86_64 -obj-y += setjmp.o -endif obj-y += cpu.o cpu_x86.o diff --git a/arch/x86/cpu/i386/Makefile b/arch/x86/cpu/i386/Makefile index 2547bba..0c47252 100644 --- a/arch/x86/cpu/i386/Makefile +++ b/arch/x86/cpu/i386/Makefile @@ -6,3 +6,4 @@ obj-y += call64.o obj-y += cpu.o obj-y += interrupt.o +obj-y += setjmp.o diff --git a/arch/x86/cpu/i386/setjmp.S b/arch/x86/cpu/i386/setjmp.S new file mode 100644 index 0000000..2ea1c6c --- /dev/null +++ b/arch/x86/cpu/i386/setjmp.S @@ -0,0 +1,61 @@ +/* + * Written by H. Peter Anvin + * Brought in from Linux v4.4 and modified for U-Boot + * From Linux arch/um/sys-i386/setjmp.S + * + * SPDX-License-Identifier: GPL-2.0 + */ + +#define _REGPARM + +/* + * The jmp_buf is assumed to contain the following, in order: + * %ebx + * %esp + * %ebp + * %esi + * %edi + * + */ + + .text + .align 4 + .globl setjmp + .type setjmp, @function +setjmp: +#ifdef _REGPARM + movl %eax, %edx +#else + movl 4(%esp), %edx +#endif + popl %ecx /* Return address, and adjust the stack */ + xorl %eax, %eax /* Return value */ + movl %ebx, (%edx) + movl %esp, 4(%edx) /* Post-return %esp! */ + pushl %ecx /* Make the call/return stack happy */ + movl %ebp, 8(%edx) + movl %esi, 12(%edx) + movl %edi, 16(%edx) + movl %ecx, 20(%edx) /* Return address */ + ret + + /* Provide function size if needed */ + .size setjmp, .-setjmp + + .align 4 + .globl longjmp + .type longjmp, @function +longjmp: +#ifdef _REGPARM + xchgl %eax, %edx +#else + movl 4(%esp), %edx /* jmp_ptr address */ +#endif + movl (%edx), %ebx + movl 4(%edx), %esp + movl 8(%edx), %ebp + movl 12(%edx), %esi + movl 16(%edx), %edi + jmp *20(%edx) + + .size longjmp, .-longjmp diff --git a/arch/x86/cpu/setjmp.S b/arch/x86/cpu/setjmp.S deleted file mode 100644 index 2ea1c6c..0000000 --- a/arch/x86/cpu/setjmp.S +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Written by H. Peter Anvin - * Brought in from Linux v4.4 and modified for U-Boot - * From Linux arch/um/sys-i386/setjmp.S - * - * SPDX-License-Identifier: GPL-2.0 - */ - -#define _REGPARM - -/* - * The jmp_buf is assumed to contain the following, in order: - * %ebx - * %esp - * %ebp - * %esi - * %edi - * - */ - - .text - .align 4 - .globl setjmp - .type setjmp, @function -setjmp: -#ifdef _REGPARM - movl %eax, %edx -#else - movl 4(%esp), %edx -#endif - popl %ecx /* Return address, and adjust the stack */ - xorl %eax, %eax /* Return value */ - movl %ebx, (%edx) - movl %esp, 4(%edx) /* Post-return %esp! */ - pushl %ecx /* Make the call/return stack happy */ - movl %ebp, 8(%edx) - movl %esi, 12(%edx) - movl %edi, 16(%edx) - movl %ecx, 20(%edx) /* Return address */ - ret - - /* Provide function size if needed */ - .size setjmp, .-setjmp - - .align 4 - .globl longjmp - .type longjmp, @function -longjmp: -#ifdef _REGPARM - xchgl %eax, %edx -#else - movl 4(%esp), %edx /* jmp_ptr address */ -#endif - movl (%edx), %ebx - movl 4(%edx), %esp - movl 8(%edx), %ebp - movl 12(%edx), %esi - movl 16(%edx), %edi - jmp *20(%edx) - - .size longjmp, .-longjmp -- cgit v1.1