parent
c3a0102195
commit
6bf3a86ed6
@ -1,130 +0,0 @@ |
||||
From f44f1e7da7c8e3f4575d5d61c4df978496903fcc Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Tue, 23 May 2017 17:32:31 -0700
|
||||
Subject: [PATCH] um: Avoid longjmp/setjmp symbol clashes with libpthread.a
|
||||
|
||||
[ Upstream commit f44f1e7da7c8e3f4575d5d61c4df978496903fcc ]
|
||||
|
||||
Building a statically linked UML kernel on a Centos 6.9 host resulted in
|
||||
the following linking failure (GCC 4.4, glibc-2.12):
|
||||
|
||||
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libpthread.a(libpthread.o):
|
||||
In function `siglongjmp':
|
||||
(.text+0x8490): multiple definition of `longjmp'
|
||||
arch/x86/um/built-in.o:/local/users/fainelli/openwrt/trunk/build_dir/target-x86_64_musl/linux-uml/linux-4.4.69/arch/x86/um/setjmp_64.S:44:
|
||||
first defined here
|
||||
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libpthread.a(libpthread.o):
|
||||
In function `sem_open':
|
||||
(.text+0x77cd): warning: the use of `mktemp' is dangerous, better use
|
||||
`mkstemp'
|
||||
collect2: ld returned 1 exit status
|
||||
make[4]: *** [vmlinux] Error 1
|
||||
|
||||
Adopt a solution similar to the one done for vmap where we define
|
||||
longjmp/setjmp to be kernel_longjmp/setjmp. In the process, make sure we
|
||||
do rename the functions in arch/x86/um/setjmp_*.S accordingly.
|
||||
|
||||
Fixes: a7df4716d195 ("um: link with -lpthread")
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Signed-off-by: Richard Weinberger <richard@nod.at>
|
||||
---
|
||||
arch/um/Makefile | 4 ++++
|
||||
arch/x86/um/setjmp_32.S | 16 ++++++++--------
|
||||
arch/x86/um/setjmp_64.S | 16 ++++++++--------
|
||||
3 files changed, 20 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/arch/um/Makefile
|
||||
+++ b/arch/um/Makefile
|
||||
@@ -59,10 +59,14 @@ KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_D
|
||||
# Same things for in6addr_loopback and mktime - found in libc. For these two we
|
||||
# only get link-time error, luckily.
|
||||
#
|
||||
+# -Dlongjmp=kernel_longjmp prevents anything from referencing the libpthread.a
|
||||
+# embedded copy of longjmp, same thing for setjmp.
|
||||
+#
|
||||
# These apply to USER_CFLAGS to.
|
||||
|
||||
KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ \
|
||||
$(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \
|
||||
+ -Dlongjmp=kernel_longjmp -Dsetjmp=kernel_setjmp \
|
||||
-Din6addr_loopback=kernel_in6addr_loopback \
|
||||
-Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr
|
||||
|
||||
--- a/arch/x86/um/setjmp_32.S
|
||||
+++ b/arch/x86/um/setjmp_32.S
|
||||
@@ -16,9 +16,9 @@
|
||||
|
||||
.text
|
||||
.align 4
|
||||
- .globl setjmp
|
||||
- .type setjmp, @function
|
||||
-setjmp:
|
||||
+ .globl kernel_setjmp
|
||||
+ .type kernel_setjmp, @function
|
||||
+kernel_setjmp:
|
||||
#ifdef _REGPARM
|
||||
movl %eax,%edx
|
||||
#else
|
||||
@@ -35,13 +35,13 @@ setjmp:
|
||||
movl %ecx,20(%edx) # Return address
|
||||
ret
|
||||
|
||||
- .size setjmp,.-setjmp
|
||||
+ .size kernel_setjmp,.-kernel_setjmp
|
||||
|
||||
.text
|
||||
.align 4
|
||||
- .globl longjmp
|
||||
- .type longjmp, @function
|
||||
-longjmp:
|
||||
+ .globl kernel_longjmp
|
||||
+ .type kernel_longjmp, @function
|
||||
+kernel_longjmp:
|
||||
#ifdef _REGPARM
|
||||
xchgl %eax,%edx
|
||||
#else
|
||||
@@ -55,4 +55,4 @@ longjmp:
|
||||
movl 16(%edx),%edi
|
||||
jmp *20(%edx)
|
||||
|
||||
- .size longjmp,.-longjmp
|
||||
+ .size kernel_longjmp,.-kernel_longjmp
|
||||
--- a/arch/x86/um/setjmp_64.S
|
||||
+++ b/arch/x86/um/setjmp_64.S
|
||||
@@ -18,9 +18,9 @@
|
||||
|
||||
.text
|
||||
.align 4
|
||||
- .globl setjmp
|
||||
- .type setjmp, @function
|
||||
-setjmp:
|
||||
+ .globl kernel_setjmp
|
||||
+ .type kernel_setjmp, @function
|
||||
+kernel_setjmp:
|
||||
pop %rsi # Return address, and adjust the stack
|
||||
xorl %eax,%eax # Return value
|
||||
movq %rbx,(%rdi)
|
||||
@@ -34,13 +34,13 @@ setjmp:
|
||||
movq %rsi,56(%rdi) # Return address
|
||||
ret
|
||||
|
||||
- .size setjmp,.-setjmp
|
||||
+ .size kernel_setjmp,.-kernel_setjmp
|
||||
|
||||
.text
|
||||
.align 4
|
||||
- .globl longjmp
|
||||
- .type longjmp, @function
|
||||
-longjmp:
|
||||
+ .globl kernel_longjmp
|
||||
+ .type kernel_longjmp, @function
|
||||
+kernel_longjmp:
|
||||
movl %esi,%eax # Return value (int)
|
||||
movq (%rdi),%rbx
|
||||
movq 8(%rdi),%rsp
|
||||
@@ -51,4 +51,4 @@ longjmp:
|
||||
movq 48(%rdi),%r15
|
||||
jmp *56(%rdi)
|
||||
|
||||
- .size longjmp,.-longjmp
|
||||
+ .size kernel_longjmp,.-kernel_longjmp
|
@ -1,99 +0,0 @@ |
||||
From 0a987645672ebde7844a9c0732a5a25f3d4bb6c6 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Thu, 25 May 2017 11:36:26 -0700
|
||||
Subject: [PATCH] um: Allow building and running on older hosts
|
||||
|
||||
[ Upstream commit 0a987645672ebde7844a9c0732a5a25f3d4bb6c6 ]
|
||||
|
||||
Commit a78ff1112263 ("um: add extended processor state save/restore
|
||||
support") and b6024b21fec8 ("um: extend fpstate to _xstate to support
|
||||
YMM registers") forced the use of the x86 FP _xstate and
|
||||
PTRACE_GETREGSET/SETREGSET. On older hosts, we would neither be able to
|
||||
build UML nor run it anymore with these two commits applied because we
|
||||
don't have definitions for struct _xstate nor these two ptrace requests.
|
||||
|
||||
We can determine at build time which fp context structure to check
|
||||
against, just like we can keep using the old i387 fp save/restore if
|
||||
PTRACE_GETRESET/SETREGSET are not defined.
|
||||
|
||||
Fixes: a78ff1112263 ("um: add extended processor state save/restore support")
|
||||
Fixes: b6024b21fec8 ("um: extend fpstate to _xstate to support YMM registers")
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Signed-off-by: Richard Weinberger <richard@nod.at>
|
||||
---
|
||||
arch/x86/um/os-Linux/registers.c | 12 ++++++++----
|
||||
arch/x86/um/user-offsets.c | 4 ++++
|
||||
2 files changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/arch/x86/um/os-Linux/registers.c
|
||||
+++ b/arch/x86/um/os-Linux/registers.c
|
||||
@@ -26,6 +26,7 @@ int save_i387_registers(int pid, unsigne
|
||||
|
||||
int save_fp_registers(int pid, unsigned long *fp_regs)
|
||||
{
|
||||
+#ifdef PTRACE_GETREGSET
|
||||
struct iovec iov;
|
||||
|
||||
if (have_xstate_support) {
|
||||
@@ -34,9 +35,9 @@ int save_fp_registers(int pid, unsigned
|
||||
if (ptrace(PTRACE_GETREGSET, pid, NT_X86_XSTATE, &iov) < 0)
|
||||
return -errno;
|
||||
return 0;
|
||||
- } else {
|
||||
+ } else
|
||||
+#endif
|
||||
return save_i387_registers(pid, fp_regs);
|
||||
- }
|
||||
}
|
||||
|
||||
int restore_i387_registers(int pid, unsigned long *fp_regs)
|
||||
@@ -48,6 +49,7 @@ int restore_i387_registers(int pid, unsi
|
||||
|
||||
int restore_fp_registers(int pid, unsigned long *fp_regs)
|
||||
{
|
||||
+#ifdef PTRACE_SETREGSET
|
||||
struct iovec iov;
|
||||
|
||||
if (have_xstate_support) {
|
||||
@@ -56,9 +58,9 @@ int restore_fp_registers(int pid, unsign
|
||||
if (ptrace(PTRACE_SETREGSET, pid, NT_X86_XSTATE, &iov) < 0)
|
||||
return -errno;
|
||||
return 0;
|
||||
- } else {
|
||||
+ } else
|
||||
+#endif
|
||||
return restore_i387_registers(pid, fp_regs);
|
||||
- }
|
||||
}
|
||||
|
||||
#ifdef __i386__
|
||||
@@ -122,6 +124,7 @@ int put_fp_registers(int pid, unsigned l
|
||||
|
||||
void arch_init_registers(int pid)
|
||||
{
|
||||
+#ifdef PTRACE_GETREGSET
|
||||
struct _xstate fp_regs;
|
||||
struct iovec iov;
|
||||
|
||||
@@ -129,6 +132,7 @@ void arch_init_registers(int pid)
|
||||
iov.iov_len = sizeof(struct _xstate);
|
||||
if (ptrace(PTRACE_GETREGSET, pid, NT_X86_XSTATE, &iov) == 0)
|
||||
have_xstate_support = 1;
|
||||
+#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
--- a/arch/x86/um/user-offsets.c
|
||||
+++ b/arch/x86/um/user-offsets.c
|
||||
@@ -50,7 +50,11 @@ void foo(void)
|
||||
DEFINE(HOST_GS, GS);
|
||||
DEFINE(HOST_ORIG_AX, ORIG_EAX);
|
||||
#else
|
||||
+#if defined(PTRACE_GETREGSET) && defined(PTRACE_SETREGSET)
|
||||
DEFINE(HOST_FP_SIZE, sizeof(struct _xstate) / sizeof(unsigned long));
|
||||
+#else
|
||||
+ DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long));
|
||||
+#endif
|
||||
DEFINE_LONGS(HOST_BX, RBX);
|
||||
DEFINE_LONGS(HOST_CX, RCX);
|
||||
DEFINE_LONGS(HOST_DI, RDI);
|
@ -1,29 +0,0 @@ |
||||
From 61e8d462457f202bf0c6393133425ad387825e22 Mon Sep 17 00:00:00 2001
|
||||
From: Richard Weinberger <richard@nod.at>
|
||||
Date: Thu, 6 Jul 2017 09:35:27 +0200
|
||||
Subject: [PATCH] um: Correctly check for PTRACE_GETRESET/SETREGSET
|
||||
|
||||
[ Upstream commit 61e8d462457f202bf0c6393133425ad387825e22 ]
|
||||
|
||||
When checking for PTRACE_GETRESET/SETREGSET, make sure that
|
||||
the correct header file is included. We need linux/ptrace.h
|
||||
which contains all ptrace UAPI related defines.
|
||||
Otherwise #if defined(PTRACE_GETRESET) is always false.
|
||||
|
||||
Cc: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Signed-off-by: Richard Weinberger <richard@nod.at>
|
||||
---
|
||||
arch/x86/um/user-offsets.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/x86/um/user-offsets.c
|
||||
+++ b/arch/x86/um/user-offsets.c
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/user.h>
|
||||
#define __FRAME_OFFSETS
|
||||
-#include <asm/ptrace.h>
|
||||
+#include <linux/ptrace.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#ifdef __i386__
|
@ -1,46 +0,0 @@ |
||||
From 2fb44600fe784449404c6639de26af8361999ec7 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Date: Tue, 18 Jul 2017 16:43:47 -0700
|
||||
Subject: [PATCH] um: Fix check for _xstate for older hosts
|
||||
|
||||
Commit 0a987645672e ("um: Allow building and running on older
|
||||
hosts") attempted to check for PTRACE_{GET,SET}REGSET under the premise
|
||||
that these ptrace(2) parameters were directly linked with the presence
|
||||
of the _xstate structure.
|
||||
|
||||
After Richard's commit 61e8d462457f ("um: Correctly check for
|
||||
PTRACE_GETRESET/SETREGSET") which properly included linux/ptrace.h
|
||||
instead of asm/ptrace.h, we could get into the original build failure
|
||||
that I reported:
|
||||
|
||||
arch/x86/um/user-offsets.c: In function 'foo':
|
||||
arch/x86/um/user-offsets.c:54: error: invalid application of 'sizeof' to
|
||||
incomplete type 'struct _xstate'
|
||||
|
||||
On this particular host, we do have PTRACE_GETREGSET and
|
||||
PTRACE_SETREGSET defined in linux/ptrace.h, but not the structure
|
||||
_xstate that should be pulled from the following include chain: signal.h
|
||||
-> bits/sigcontext.h.
|
||||
|
||||
Correctly fix this by checking for FP_XSTATE_MAGIC1 which is the correct
|
||||
way to see if struct _xstate is available or not on the host.
|
||||
|
||||
Fixes: 61e8d462457f ("um: Correctly check for PTRACE_GETRESET/SETREGSET")
|
||||
Fixes: 0a987645672e ("um: Allow building and running on older hosts")
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Signed-off-by: Richard Weinberger <richard@nod.at>
|
||||
---
|
||||
arch/x86/um/user-offsets.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/x86/um/user-offsets.c
|
||||
+++ b/arch/x86/um/user-offsets.c
|
||||
@@ -50,7 +50,7 @@ void foo(void)
|
||||
DEFINE(HOST_GS, GS);
|
||||
DEFINE(HOST_ORIG_AX, ORIG_EAX);
|
||||
#else
|
||||
-#if defined(PTRACE_GETREGSET) && defined(PTRACE_SETREGSET)
|
||||
+#ifdef FP_XSTATE_MAGIC1
|
||||
DEFINE(HOST_FP_SIZE, sizeof(struct _xstate) / sizeof(unsigned long));
|
||||
#else
|
||||
DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long));
|
Loading…
Reference in new issue