This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: PATCH: Use R*_LP, sizeSS, oSS_FLAGS, oSS_SP and oSS_SIZE
On Tue, May 15, 2012 at 4:09 PM, Roland McGrath <roland@hack.frob.com> wrote:
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/x86_64/sigaltstack.sym
>
> Call it sigaltstack-offsets.sym instead.
>
>> +sizeSS ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sizeof(stack_t)
>> +oSS_SP ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sigaltstack(ss_sp)
>> +oSS_SIZE ? ? ? ? ? ? ? ? ? ? sigaltstack(ss_size)
>> +oSS_FLAGS ? ? ? ? ? ? ? ? ? ?sigaltstack(ss_flags)
>
> Space before paren in all cases.
>
Does it look OK?
Thanks.
--
H.J.
---
* sysdeps/unix/sysv/linux/x86_64/Makefile (gen-as-const-headers):
Add sigaltstack.sym.
* sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S: Include
"sigaltstack.h".
(CALL_FAIL): Use RSP_LP to operate on stack. Use RDI_LP on
longjmp_msg pointer.
(____longjmp_chk): Use R8_LP and RDX_LP on SP and PC. Use
R*_LP, sizeSS, oSS_FLAGS, oSS_SP and oSS_SIZE for alternate
signal stack.
* sysdeps/unix/sysv/linux/x86_64/sigaltstack.sym: New.
diff --git a/sysdeps/unix/sysv/linux/x86_64/Makefile
b/sysdeps/unix/sysv/linux/x86_64/Makefile
index 9c9e615..b692212 100644
--- a/sysdeps/unix/sysv/linux/x86_64/Makefile
+++ b/sysdeps/unix/sysv/linux/x86_64/Makefile
@@ -17,6 +17,10 @@ ifeq ($(subdir),csu)
gen-as-const-headers += ucontext_i.sym
endif
+ifeq ($(subdir),misc)
+gen-as-const-headers += sigaltstack-offsets.sym
+endif
+
ifeq ($(subdir),elf)
sysdep_routines += dl-vdso
endif
diff --git a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
index 1de7e09..9f92cd2 100644
--- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
@@ -19,6 +19,8 @@
#include <jmpbuf-offsets.h>
#include <asm-syntax.h>
+#include "sigaltstack-offsets.h"
+
.section .rodata.str1.1,"aMS",@progbits,1
.type longjmp_msg,@object
longjmp_msg:
@@ -29,18 +31,18 @@ longjmp_msg:
//#define __longjmp ____longjmp_chk
#ifdef PIC
-# define CALL_FAIL subq $8, %rsp; \
+# define CALL_FAIL sub $8, %RSP_LP; \
cfi_remember_state; \
cfi_def_cfa_offset(16); \
- leaq longjmp_msg(%rip), %rdi; \
+ lea longjmp_msg(%rip), %RDI_LP; \
call HIDDEN_JUMPTARGET(__fortify_fail); \
nop; \
cfi_restore_state
#else
-# define CALL_FAIL subq $8, %rsp; \
+# define CALL_FAIL sub $8, %RSP_LP; \
cfi_remember_state; \
cfi_def_cfa_offset(16); \
- movq $longjmp_msg, %rdi; \
+ mov $longjmp_msg, %RDI_LP; \
call HIDDEN_JUMPTARGET(__fortify_fail); \
nop; \
cfi_restore_state
@@ -52,16 +54,16 @@ longjmp_msg:
.text
ENTRY(____longjmp_chk)
/* Restore registers. */
- movq (JB_RSP*8)(%rdi), %r8
+ mov (JB_RSP*8)(%rdi), %R8_LP
movq (JB_RBP*8)(%rdi), %r9
- movq (JB_PC*8)(%rdi), %rdx
+ mov (JB_PC*8)(%rdi), %RDX_LP
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (%r8)
+ PTR_DEMANGLE (%R8_LP)
PTR_DEMANGLE (%r9)
- PTR_DEMANGLE (%rdx)
+ PTR_DEMANGLE (%RDX_LP)
#endif
- cmpq %r8, %rsp
+ cmp %R8_LP, %RSP_LP
jbe .Lok
/* Save function parameters. */
@@ -71,19 +73,19 @@ ENTRY(____longjmp_chk)
cfi_register (%rsi, %rbx)
xorl %edi, %edi
- leaq -24(%rsp), %rsi
+ lea -sizeSS(%rsp), %RSI_LP
movl $__NR_sigaltstack, %eax
syscall
/* Without working sigaltstack we cannot perform the test. */
testl %eax, %eax
jne .Lok2
- testl $1, -16(%rsp)
+ testl $1, (-sizeSS + oSS_FLAGS)(%rsp)
jz .Lfail
- movq -24(%rsp), %rax
- addq -8(%rsp), %rax
- subq %r8, %rax
- cmpq -8(%rsp), %rax
+ mov (-sizeSS + oSS_SP)(%rsp), %RAX_LP
+ add (-sizeSS + oSS_SIZE)(%rsp), %RAX_LP
+ sub %R8_LP, %RAX_LP
+ cmp (-sizeSS + oSS_SIZE)(%rsp), %RAX_LP
jae .Lok2
.Lfail: CALL_FAIL
@@ -110,7 +112,7 @@ ENTRY(____longjmp_chk)
movq (JB_R15*8)(%rdi), %r15
/* Set return value for setjmp. */
movl %esi, %eax
- movq %r8,%rsp
+ mov %R8_LP, %RSP_LP
movq %r9,%rbp
jmpq *%rdx
END (____longjmp_chk)
diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaltstack-offsets.sym
b/sysdeps/unix/sysv/linux/x86_64/sigaltstack-offsets.sym
new file mode 100644
index 0000000..5ff3af4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86_64/sigaltstack-offsets.sym
@@ -0,0 +1,15 @@
+#ifndef _XOPEN_EXTENDED
+# define _XOPEN_EXTENDED
+#endif
+
+#include <stddef.h>
+#include <signal.h>
+
+--
+
+#define sigaltstack(member) offsetof (stack_t, member)
+
+sizeSS sizeof (stack_t)
+oSS_SP sigaltstack (ss_sp)
+oSS_SIZE sigaltstack (ss_size)
+oSS_FLAGS sigaltstack (ss_flags)