All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ia64: fix ptrace(PTRACE_GETREGS) (unbreaks strace, gdb)
@ 2018-02-02 22:12 ` Sergei Trofimovich
  0 siblings, 0 replies; 15+ messages in thread
From: Sergei Trofimovich @ 2018-02-02 22:12 UTC (permalink / raw)
  To: Tony Luck, Fenghua Yu, linux-ia64, linux-kernel; +Cc: Sergei Trofimovich

The strace breakage looks like that:
./strace: get_regs: get_regs_error: Input/output error

It happens because ia64 needs to load unwind tables
to read certain registers. Unwind tables fail to load
due to GCC quirk on the following code:

    extern char __end_unwind[];
    const struct unw_table_entry *end = (struct unw_table_entry *)table_end;
    table->end = segment_base + end[-1].end_offset;

GCC does not generate correct code for this single memory
reference after constant propagation (see https://gcc.gnu.org/PR84184).
Two triggers are required for bad code generation:
- '__end_unwind' has alignment lower (char), than
  'struct unw_table_entry' (8).
- symbol offset is negative.

This commit workarounds it by fixing alignment of '__end_unwind'.
While at it use hidden symbols to generate shorter gp-relative
relocations.

CC: Tony Luck <tony.luck@intel.com>
CC: Fenghua Yu <fenghua.yu@intel.com>
CC: linux-ia64@vger.kernel.org
CC: linux-kernel@vger.kernel.org
Bug: https://github.com/strace/strace/issues/33
Bug: https://gcc.gnu.org/PR84184
Reported-by: Émeric Maschino <emeric.maschino@gmail.com>
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
---
 arch/ia64/include/asm/sections.h |  1 -
 arch/ia64/kernel/unwind.c        | 15 ++++++++++++++-
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h
index f3481408594e..0fc4f1757a44 100644
--- a/arch/ia64/include/asm/sections.h
+++ b/arch/ia64/include/asm/sections.h
@@ -24,7 +24,6 @@ extern char __start_gate_mckinley_e9_patchlist[], __end_gate_mckinley_e9_patchli
 extern char __start_gate_vtop_patchlist[], __end_gate_vtop_patchlist[];
 extern char __start_gate_fsyscall_patchlist[], __end_gate_fsyscall_patchlist[];
 extern char __start_gate_brl_fsys_bubble_down_patchlist[], __end_gate_brl_fsys_bubble_down_patchlist[];
-extern char __start_unwind[], __end_unwind[];
 extern char __start_ivt_text[], __end_ivt_text[];
 
 #undef dereference_function_descriptor
diff --git a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c
index e04efa088902..025ba6700790 100644
--- a/arch/ia64/kernel/unwind.c
+++ b/arch/ia64/kernel/unwind.c
@@ -2243,7 +2243,20 @@ __initcall(create_gate_table);
 void __init
 unw_init (void)
 {
-	extern char __gp[];
+	#define __ia64_hidden __attribute__((visibility("hidden")))
+	/*
+	 * We use hidden symbols to generate more efficient code using
+	 * gp-relative addressing.
+	 */
+	extern char __gp[] __ia64_hidden;
+	/*
+	 * Unwind tables need to have proper alignment as init_unwind_table()
+	 * uses negative offsets against '__end_unwind'.
+	 * See https://gcc.gnu.org/PR84184
+	 */
+	extern const struct unw_table_entry __start_unwind[] __ia64_hidden;
+	extern const struct unw_table_entry __end_unwind[] __ia64_hidden;
+	#undef __ia64_hidden
 	extern void unw_hash_index_t_is_too_narrow (void);
 	long i, off;
 
-- 
2.16.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-04-29 11:34 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-02 22:12 [PATCH] ia64: fix ptrace(PTRACE_GETREGS) (unbreaks strace, gdb) Sergei Trofimovich
2018-02-02 22:12 ` Sergei Trofimovich
2018-02-02 22:22 ` Luck, Tony
2018-02-02 22:22   ` Luck, Tony
2018-02-02 23:02   ` Sergei Trofimovich
2018-02-02 23:02     ` Sergei Trofimovich
2018-02-11 18:51     ` Sergei Trofimovich
2018-03-09 23:15       ` [PATCH v2, simpler] " Sergei Trofimovich
2018-03-09 23:15         ` Sergei Trofimovich
2018-08-04 21:33         ` Sergei Trofimovich
2018-08-04 21:33           ` Sergei Trofimovich
2019-04-29 10:38 ` [PATCH] " John Paul Adrian Glaubitz
2019-04-29 10:38   ` John Paul Adrian Glaubitz
2019-04-29 11:34   ` John Paul Adrian Glaubitz
2019-04-29 11:34     ` John Paul Adrian Glaubitz

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.