From patchwork Thu Apr 26 12:17:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Lu, Hongjiu" X-Patchwork-Id: 26989 Received: (qmail 115955 invoked by alias); 26 Apr 2018 12:17:47 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 115834 invoked by uid 89); 26 Apr 2018 12:17:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, NO_DNS_FOR_FROM autolearn=ham version=3.3.2 spammy= X-HELO: mga07.intel.com X-Amp-Result: UNSCANNABLE X-Amp-File-Uploaded: False X-ExtLoop1: 1 Date: Thu, 26 Apr 2018 05:17:44 -0700 From: "H.J. Lu" To: GNU C Library Subject: [PATCH 2/2] x86-64/swapcontext: Restore the pointer into %rdx after syscall Message-ID: <20180426121744.GB30766@intel.com> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.9.2 (2017-12-15) To prepare for shadow stack support, restore the pointer into %rdx after syscall and use %rdx, instead of %rsi, to restore context. There is no functional change. Any comments? H.J. ---- * sysdeps/unix/sysv/linux/x86_64/swapcontext.S (__swapcontext): Restore the pointer into %rdx, after syscall and use %rdx, instead of %rsi, to restore context. Reviewed-by: Carlos O'Donell --- sysdeps/unix/sysv/linux/x86_64/swapcontext.S | 41 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/sysdeps/unix/sysv/linux/x86_64/swapcontext.S b/sysdeps/unix/sysv/linux/x86_64/swapcontext.S index e577c209b9..e2bb50308a 100644 --- a/sysdeps/unix/sysv/linux/x86_64/swapcontext.S +++ b/sysdeps/unix/sysv/linux/x86_64/swapcontext.S @@ -79,38 +79,39 @@ ENTRY(__swapcontext) cmpq $-4095, %rax /* Check %rax for error. */ jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ - /* Restore destroyed registers. */ - movq %r12, %rsi + /* Restore destroyed register into RDX which is preserved by + the syscall. */ + movq %r12, %rdx /* Restore the floating-point context. Not the registers, only the rest. */ - movq oFPREGS(%rsi), %rcx + movq oFPREGS(%rdx), %rcx fldenv (%rcx) - ldmxcsr oMXCSR(%rsi) + ldmxcsr oMXCSR(%rdx) /* Load the new stack pointer and the preserved registers. */ - movq oRSP(%rsi), %rsp - movq oRBX(%rsi), %rbx - movq oRBP(%rsi), %rbp - movq oR12(%rsi), %r12 - movq oR13(%rsi), %r13 - movq oR14(%rsi), %r14 - movq oR15(%rsi), %r15 + movq oRSP(%rdx), %rsp + movq oRBX(%rdx), %rbx + movq oRBP(%rdx), %rbp + movq oR12(%rdx), %r12 + movq oR13(%rdx), %r13 + movq oR14(%rdx), %r14 + movq oR15(%rdx), %r15 /* The following ret should return to the address set with getcontext. Therefore push the address on the stack. */ - movq oRIP(%rsi), %rcx + movq oRIP(%rdx), %rcx pushq %rcx /* Setup registers used for passing args. */ - movq oRDI(%rsi), %rdi - movq oRDX(%rsi), %rdx - movq oRCX(%rsi), %rcx - movq oR8(%rsi), %r8 - movq oR9(%rsi), %r9 - - /* Setup finally %rsi. */ - movq oRSI(%rsi), %rsi + movq oRDI(%rdx), %rdi + movq oRSI(%rdx), %rsi + movq oRCX(%rdx), %rcx + movq oR8(%rdx), %r8 + movq oR9(%rdx), %r9 + + /* Setup finally %rdx. */ + movq oRDX(%rdx), %rdx /* Clear rax to indicate success. */ xorl %eax, %eax