From: Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
To: Marcus Shawcroft <marcus.shawcroft@gmail.com>
Cc: libc-ports@sourceware.org, Patch Tracking <patch@linaro.org>
Subject: Re: [PATCH] [AARCH64]: Pointer mangling support for Aarch64
Date: Tue, 31 Dec 2013 05:15:00 -0000 [thread overview]
Message-ID: <CAJK_mQ0QwoSEJU+GWG=zibWQ8VAmj6+gvB3FqY9Y7jEBa6w8gQ@mail.gmail.com> (raw)
In-Reply-To: <CAFqB+PyA1=MZ4gTZQ4VX9q7rG7ra-AEeTXXDm4Rz34fyMxLyjA@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1847 bytes --]
Hi Marcus,
Thank you for reviewing the patch.
I have incorporated your review comments.
(Snip)
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (sp);
+#endif
Nested #if should have indentation between # and if.
(Snip)
In ports/sysdeps/aarch64/jmpbuf-offsets.h, should I need to add space
between # and if?
Reading the glibc coding style, I understood it as outer #ifndef
__ASSEMBLER__ will not increase indentation level.
if it is Ok, can you please commit on my behalf since I don't have write access.
ChangeLog.aarch64:
-----------------------------
2013-12-31 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
* sysdeps/aarch64/__longjmp.S (__longjmp): Demangle sp
and lr when restoring register values.
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Mangle sp and lr
before storing register values.
* sysdeps/arm/jmpbuf-unwind.h (_jmpbuf_sp): Remove.
* sysdeps/aarch64/jmpbuf-offsets.h (_jmpbuf_sp): Add.
(JB_FRAME_ADDRESS): call _jmpbuf_sp.
* sysdeps/aarch64/sysdep.h (LDST_PCREL) : New macros.
(LDST_GLOBAL): Likewise.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h (PTR_MANGLE): New macro.
(PTR_DEMANGLE): Likewise.
(PTR_MANGLE2): Likewise.
(PTR_DEMANGLE2): Likewise.
regards,
Venkat.
On 31 December 2013 03:50, Marcus Shawcroft <marcus.shawcroft@gmail.com> wrote:
> Hi, Couple of nits:
>
> On 30 December 2013 05:00, Venkataramanan Kumar
> <venkataramanan.kumar@linaro.org> wrote:
>
> +# define PTR_MANGLE(dst, src, guard, tmp) \
> + LDST_PCREL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
> + PTR_MANGLE2(dst, src, guard)
>
> Space before ( in macro invocations.
>
> +#ifdef PTR_DEMANGLE
> + PTR_DEMANGLE (sp);
> +#endif
>
> Nested #if should have indentation between # and if.
>
> +/* Pointer mangling is support for AArch64. */
>
> support -> supported
>
> Otherwise OK
> /Marcus
[-- Attachment #2: aarch64.glibc.pointer.mangle.txt --]
[-- Type: text/plain, Size: 6012 bytes --]
diff --git a/ports/sysdeps/aarch64/__longjmp.S b/ports/sysdeps/aarch64/__longjmp.S
index ffd30a2..426edc0 100644
--- a/ports/sysdeps/aarch64/__longjmp.S
+++ b/ports/sysdeps/aarch64/__longjmp.S
@@ -50,8 +50,12 @@ ENTRY (__longjmp)
ldp x23, x24, [x0, #JB_X23<<3]
ldp x25, x26, [x0, #JB_X25<<3]
ldp x27, x28, [x0, #JB_X27<<3]
+#ifdef PTR_DEMANGLE
+ ldp x29, x4, [x0, #JB_X29<<3]
+ PTR_DEMANGLE (x30, x4, x3, x2)
+#else
ldp x29, x30, [x0, #JB_X29<<3]
-
+#endif
ldp d8, d9, [x0, #JB_D8<<3]
ldp d10, d11, [x0, #JB_D10<<3]
ldp d12, d13, [x0, #JB_D12<<3]
@@ -87,8 +91,12 @@ ENTRY (__longjmp)
cfi_same_value(d13)
cfi_same_value(d14)
cfi_same_value(d15)
-
- ldr x5, [x0, #JB_SP<<3]
+#ifdef PTR_DEMANGLE
+ ldr x4, [x0, #JB_SP<<3]
+ PTR_DEMANGLE (x5, x4, x3, x2)
+#else
+ ldr x5, [x0, #JB_SP<<3]
+#endif
mov sp, x5
cmp x1, #0
mov x0, #1
diff --git a/ports/sysdeps/aarch64/jmpbuf-offsets.h b/ports/sysdeps/aarch64/jmpbuf-offsets.h
index ed5f42a..1392c41 100644
--- a/ports/sysdeps/aarch64/jmpbuf-offsets.h
+++ b/ports/sysdeps/aarch64/jmpbuf-offsets.h
@@ -39,6 +39,22 @@
#define JB_D14 20
#define JB_D15 21
+#ifndef __ASSEMBLER__
+#include <setjmp.h>
+#include <stdint.h>
+#include <sysdep.h>
+
+static inline uintptr_t __attribute__ ((unused))
+_jmpbuf_sp (__jmp_buf jmpbuf)
+{
+ uintptr_t sp = jmpbuf[JB_SP];
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (sp);
+#endif
+ return sp;
+}
+#endif
+
/* Helper for generic ____longjmp_chk(). */
#define JB_FRAME_ADDRESS(buf) \
- ((void *) (buf[JB_SP]))
+ ((void *) _jmpbuf_sp (buf))
diff --git a/ports/sysdeps/aarch64/jmpbuf-unwind.h b/ports/sysdeps/aarch64/jmpbuf-unwind.h
index 087e1b6..375decb 100644
--- a/ports/sysdeps/aarch64/jmpbuf-unwind.h
+++ b/ports/sysdeps/aarch64/jmpbuf-unwind.h
@@ -29,16 +29,6 @@
#define _JMPBUF_CFA_UNWINDS_ADJ(jmpbuf, context, adj) \
_JMPBUF_UNWINDS_ADJ (jmpbuf, (void *) _Unwind_GetCFA (context), adj)
-static inline uintptr_t __attribute__ ((unused))
-_jmpbuf_sp (__jmp_buf jmpbuf)
-{
- uintptr_t sp = jmpbuf[JB_SP];
-#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (sp);
-#endif
- return sp;
-}
-
#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
diff --git a/ports/sysdeps/aarch64/setjmp.S b/ports/sysdeps/aarch64/setjmp.S
index 10e0709..fb90cf2 100644
--- a/ports/sysdeps/aarch64/setjmp.S
+++ b/ports/sysdeps/aarch64/setjmp.S
@@ -39,13 +39,25 @@ ENTRY (__sigsetjmp)
stp x23, x24, [x0, #JB_X23<<3]
stp x25, x26, [x0, #JB_X25<<3]
stp x27, x28, [x0, #JB_X27<<3]
+
+#ifdef PTR_MANGLE
+ PTR_MANGLE (x4, x30, x3, x2)
+ stp x29, x4, [x0, #JB_X29<<3]
+#else
stp x29, x30, [x0, #JB_X29<<3]
+#endif
stp d8, d9, [x0, #JB_D8<<3]
stp d10, d11, [x0, #JB_D10<<3]
stp d12, d13, [x0, #JB_D12<<3]
stp d14, d15, [x0, #JB_D14<<3]
+#ifdef PTR_MANGLE
+ mov x4, sp
+ PTR_MANGLE (x5, x4, x3, x2)
+ str x5, [x0, #JB_SP<<3]
+#else
mov x2, sp
str x2, [x0, #JB_SP<<3]
+#endif
#if defined NOT_IN_libc && defined IS_IN_rtld
/* In ld.so we never save the signal mask */
mov w0, #0
diff --git a/ports/sysdeps/aarch64/sysdep.h b/ports/sysdeps/aarch64/sysdep.h
index 9349471..5fb7173 100644
--- a/ports/sysdeps/aarch64/sysdep.h
+++ b/ports/sysdeps/aarch64/sysdep.h
@@ -78,6 +78,17 @@
# define L(name) .L##name
#endif
+/* Load or store to/from a pc-relative EXPR into/from R, using T. */
+#define LDST_PCREL(OP, R, T, EXPR) \
+ adrp T, EXPR; \
+ OP R, [T, #:lo12:EXPR];\
+
+/* Load or store to/from a got-relative EXPR into/from R, using T. */
+#define LDST_GLOBAL(OP, R, T, EXPR) \
+ adrp T, :got:EXPR; \
+ ldr T, [T, #:got_lo12:EXPR];\
+ OP R, [T];
+
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h
index 9a7b167..c596055 100644
--- a/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h
@@ -371,8 +371,44 @@ __local_syscall_error: \
#endif /* __ASSEMBLER__ */
-/* Pointer mangling is not yet supported for AArch64. */
-#define PTR_MANGLE(var) (void) (var)
-#define PTR_DEMANGLE(var) (void) (var)
+/* Pointer mangling is supported for AArch64. */
+#if (defined NOT_IN_libc && defined IS_IN_rtld) || \
+ (!defined SHARED && (!defined NOT_IN_libc || defined IS_IN_libpthread))
+# ifdef __ASSEMBLER__
+# define PTR_MANGLE(dst, src, guard, tmp) \
+ LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
+ PTR_MANGLE2 (dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
+# define PTR_MANGLE2(dst, src, guard)\
+ eor dst, src, guard
+# define PTR_DEMANGLE(dst, src, guard, tmp)\
+ PTR_MANGLE (dst, src, guard, tmp)
+# define PTR_DEMANGLE2(dst, src, guard)\
+ PTR_MANGLE2 (dst, src, guard)
+# else
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+# define PTR_MANGLE(var) \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+# define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#else
+# ifdef __ASSEMBLER__
+# define PTR_MANGLE(dst, src, guard, tmp) \
+ LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); \
+ PTR_MANGLE2 (dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
+# define PTR_MANGLE2(dst, src, guard)\
+ eor dst, src, guard
+# define PTR_DEMANGLE(dst, src, guard, tmp)\
+ PTR_MANGLE (dst, src, guard, tmp)
+# define PTR_DEMANGLE2(dst, src, guard)\
+ PTR_MANGLE2 (dst, src, guard)
+# else
+extern uintptr_t __pointer_chk_guard attribute_relro;
+# define PTR_MANGLE(var) \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
+# define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#endif
#endif /* linux/aarch64/sysdep.h */
next prev parent reply other threads:[~2013-12-31 5:15 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-26 12:25 Venkataramanan Kumar
2013-12-26 19:33 ` Richard Henderson
2013-12-27 7:48 ` Venkataramanan Kumar
2013-12-27 15:09 ` Richard Henderson
2013-12-30 5:00 ` Venkataramanan Kumar
2013-12-30 14:45 ` Richard Henderson
2013-12-30 15:36 ` Venkataramanan Kumar
2013-12-30 22:20 ` Marcus Shawcroft
2013-12-31 5:15 ` Venkataramanan Kumar [this message]
2014-01-01 17:42 ` Marcus Shawcroft
2014-01-06 18:11 ` Tom Tromey
2014-01-07 11:05 ` Venkataramanan Kumar
2014-01-07 12:17 ` Marcus Shawcroft
2014-01-07 18:10 ` Tom Tromey
2014-01-10 9:54 ` Will Newton
2014-01-20 9:01 ` Will Newton
2014-01-20 16:45 ` Tom Tromey
2014-01-20 17:02 ` Will Newton
2014-01-08 10:32 ` Venkataramanan Kumar
2014-01-10 10:40 ` Marcus Shawcroft
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAJK_mQ0QwoSEJU+GWG=zibWQ8VAmj6+gvB3FqY9Y7jEBa6w8gQ@mail.gmail.com' \
--to=venkataramanan.kumar@linaro.org \
--cc=libc-ports@sourceware.org \
--cc=marcus.shawcroft@gmail.com \
--cc=patch@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).