unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Carlos O'Donell <codonell@redhat.com>
To: "H.J. Lu" <hjl.tools@gmail.com>,
	GNU C Library <libc-alpha@sourceware.org>
Subject: Re: V3 [PATCH] i386: Enable CET support in ucontext functions
Date: Fri, 14 Feb 2020 17:10:14 -0500	[thread overview]
Message-ID: <8bec1ea2-6ea5-90d5-db37-67e5b4920b7d@redhat.com> (raw)
In-Reply-To: <CAMe9rOqNnuUjgYA96ZLO1TyrZ=onRM_sdDYVJh-NwuyWFpP5kg@mail.gmail.com>

On 2/1/20 9:09 AM, H.J. Lu wrote:
> On Wed, Jan 8, 2020 at 8:15 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>>
>> 1. getcontext and swapcontext are updated to save the caller's shadow
>> stack pointer and return address.
>> 2. setcontext and swapcontext are updated to restore shadow stack and
>> jump to new context directly.
>> 3. makecontext is updated to allocate a new shadow stack and set the
>> caller's return address to the helper code, L(exitcode).
>>
>> Since makecontext allocates a new shadow stack when making a new
>> context and kernel allocates a new shadow stack for clone/fork/vfork
>> syscalls, we track the current shadow stack base.  In setcontext and
>> swapcontext, if the target shadow stack base is the same as the current
>> shadow stack base, we unwind the shadow stack.  Otherwise it is a stack
>> switch and we look for a restore token.
>>
>> We enable shadow stack at run-time only if program and all used shared
>> objects, including dlopened ones, are shadow stack enabled, which means
>> that they must be compiled with GCC 8 or above and glibc 2.28 or above.
>> We need to save and restore shadow stack only if shadow stack is enabled.
>> When caller of getcontext, setcontext, swapcontext and makecontext is
>> compiled with smaller ucontext_t, shadow stack won't be enabled at
>> run-time.  We check if shadow stack is enabled before accessing the
>> extended field in ucontext_t.
>>

LGTM.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>

> This is the updated patch.  The only change is to use
> 
> +oSCRATCH1 mreg (EAX)
> +oSCRATCH2 mreg (ECX)
> +oSCRATCH3 mreg (EDX)
> 
> to replace oEAX, oECX and -oEDX.
> 
> OK for master?
> 
> Thanks.
> 

> From 33165282a09877e2da7b71745fb49b12c648acf1 Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <hjl.tools@gmail.com>
> Date: Fri, 6 Dec 2019 16:45:17 -0800
> Subject: [PATCH] i386: Enable CET support in ucontext functions
> 
> 1. getcontext and swapcontext are updated to save the caller's shadow
> stack pointer and return address.
> 2. setcontext and swapcontext are updated to restore shadow stack and
> jump to new context directly.
> 3. makecontext is updated to allocate a new shadow stack and set the
> caller's return address to the helper code, L(exitcode).
> 4. Since we no longer save and restore EAX, ECX and EDX in getcontext,
> setcontext and swapcontext, we can use them as scratch register slots
> to enable CET in ucontext functions.
> 
> Since makecontext allocates a new shadow stack when making a new
> context and kernel allocates a new shadow stack for clone/fork/vfork
> syscalls, we track the current shadow stack base.  In setcontext and
> swapcontext, if the target shadow stack base is the same as the current
> shadow stack base, we unwind the shadow stack.  Otherwise it is a stack
> switch and we look for a restore token.
> 
> We enable shadow stack at run-time only if program and all used shared
> objects, including dlopened ones, are shadow stack enabled, which means
> that they must be compiled with GCC 8 or above and glibc 2.28 or above.
> We need to save and restore shadow stack only if shadow stack is enabled.
> When caller of getcontext, setcontext, swapcontext and makecontext is
> compiled with smaller ucontext_t, shadow stack won't be enabled at
> run-time.  We check if shadow stack is enabled before accessing the
> extended field in ucontext_t.
> 
> Tested on i386 CET/non-CET machines.

OK.

> ---
>  sysdeps/unix/sysv/linux/i386/getcontext.S   |  56 ++++++++
>  sysdeps/unix/sysv/linux/i386/makecontext.S  | 123 +++++++++++++++++
>  sysdeps/unix/sysv/linux/i386/setcontext.S   | 101 +++++++++++++-
>  sysdeps/unix/sysv/linux/i386/swapcontext.S  | 139 ++++++++++++++++++++
>  sysdeps/unix/sysv/linux/i386/sysdep.h       |   5 +
>  sysdeps/unix/sysv/linux/i386/ucontext_i.sym |   4 +
>  6 files changed, 425 insertions(+), 3 deletions(-)
> 
> diff --git a/sysdeps/unix/sysv/linux/i386/getcontext.S b/sysdeps/unix/sysv/linux/i386/getcontext.S
> index 9c1df9a2aa..d91cfe4b1d 100644
> --- a/sysdeps/unix/sysv/linux/i386/getcontext.S
> +++ b/sysdeps/unix/sysv/linux/i386/getcontext.S
> @@ -18,6 +18,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <asm/prctl.h>
>  
>  #include "ucontext_i.h"
>  
> @@ -42,6 +43,61 @@ ENTRY(__getcontext)
>  	movw	%fs, %dx
>  	movl	%edx, oFS(%eax)
>  
> +#if SHSTK_ENABLED
> +	/* Check if shadow stack is enabled.  */
> +	testl	$X86_FEATURE_1_SHSTK, %gs:FEATURE_1_OFFSET
> +	jz	L(no_shstk)

OK. Like x86_64

> +
> +	/* Save EAX in EDX.  */
> +	movl	%eax, %edx
> +
> +	xorl	%eax, %eax
> +	cmpl	%gs:SSP_BASE_OFFSET, %eax
> +	jnz	L(shadow_stack_bound_recorded)

OK. Check ssp_base from tcbhead_t.

> +
> +	/* Save EBX in the first scratch register slot.  */
> +	movl	%ebx, oSCRATCH1(%edx)
> +
> +	/* Get the base address and size of the default shadow stack
> +	   which must be the current shadow stack since nothing has
> +	   been recorded yet.  */
> +	sub	$24, %esp
> +	mov	%esp, %ecx
> +	movl	$ARCH_CET_STATUS, %ebx
> +	movl	$__NR_arch_prctl, %eax
> +	ENTER_KERNEL
> +	testl	%eax, %eax
> +	jz	L(continue_no_err)
> +
> +	/* This should never happen.  */
> +	hlt

OK. Might have been nice to put this in abort-instr.h as ABORT_INSTRUCTION_ASM,
but almost nobody does this.

> +
> +L(continue_no_err):
> +	/* Restore EBX from the first scratch register slot.  */
> +	movl	oSCRATCH1(%edx), %ebx
> +
> +	/* Record the base of the current shadow stack.  */
> +	movl	8(%esp), %eax
> +	movl	%eax, %gs:SSP_BASE_OFFSET
> +	add	$24, %esp
> +
> +L(shadow_stack_bound_recorded):
> +	/* Load address of the context data structure.  */
> +	movl	4(%esp), %eax
> +
> +	/* Get the current shadow stack pointer.  */
> +	rdsspd	%edx
> +	/* NB: Save the caller's shadow stack so that we can jump back
> +	   to the caller directly.  */
> +	addl	$4, %edx
> +	movl	%edx, oSSP(%eax)
> +
> +	/* Save the current shadow stack base in ucontext.  */
> +	movl	%gs:SSP_BASE_OFFSET, %edx
> +	movl	%edx, (oSSP + 4)(%eax)
> +
> +L(no_shstk):
> +#endif
>  	/* We have separate floating-point register content memory on the
>  	   stack.  We use the __fpregs_mem block in the context.  Set the
>  	   links up correctly.  */
> diff --git a/sysdeps/unix/sysv/linux/i386/makecontext.S b/sysdeps/unix/sysv/linux/i386/makecontext.S
> index ad9ce5f977..91009675d1 100644
> --- a/sysdeps/unix/sysv/linux/i386/makecontext.S
> +++ b/sysdeps/unix/sysv/linux/i386/makecontext.S
> @@ -18,6 +18,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <asm/prctl.h>
>  
>  #include "ucontext_i.h"
>  
> @@ -68,6 +69,127 @@ ENTRY(__makecontext)
>  	jnz	1b
>  2:
>  
> +#if SHSTK_ENABLED

OK.

> +	/* Check if Shadow Stack is enabled.  */
> +	testl	$X86_FEATURE_1_SHSTK, %gs:FEATURE_1_OFFSET
> +	jz	L(skip_ssp)
> +
> +	/* Reload the pointer to ucontext.  */
> +	movl	4(%esp), %eax
> +
> +	/* Shadow stack is enabled.  We need to allocate a new shadow
> +	   stack.  */
> +	subl	oSS_SP(%eax), %edx
> +	shrl	$STACK_SIZE_TO_SHADOW_STACK_SIZE_SHIFT, %edx
> +
> +	/* Align shadow stack size to 8 bytes.  */
> +	addl	$7, %edx
> +	andl	$-8, %edx
> +
> +	/* Store shadow stack size in __ssp[2].  */
> +	movl	%edx, (oSSP + 8)(%eax)
> +
> +	/* Save ESI in the second scratch register slot.  */
> +	movl	%esi, oSCRATCH2(%eax)
> +	/* Save EDI in the third scratch register slot.  */
> +	movl	%edi, oSCRATCH3(%eax)
> +
> +	/* Save the pointer to ucontext.  */
> +	movl	%eax, %edi
> +
> +	/* Get the original shadow stack pointer.  */
> +	rdsspd	%esi
> +
> +	/* Align the saved original shadow stack pointer to the next
> +	   8 byte aligned boundary.  */
> +	andl	$-8, %esi
> +
> +	/* Load the top of the new stack into EDX.  */
> +	movl	oESP(%eax), %edx
> +
> +	/* We need to terminate the FDE here because the unwinder looks
> +	   at ra-1 for unwind information.  */
> +	cfi_endproc
> +
> +	/* Swap the original stack pointer with the top of the new
> +	   stack.  */
> +	xchgl	%esp, %edx
> +
> +	/* Add 4 bytes since CALL will push the 4-byte return address
> +	   onto stack.  */
> +	addl	$4, %esp
> +
> +	/* Allocate the new shadow stack.  Save EBX in the first scratch
> +	   register slot.  */
> +	movl	%ebx, oSCRATCH1(%eax)
> +
> +	/* CET syscall takes 64-bit sizes.  */
> +	subl	$16, %esp
> +	movl	(oSSP + 8)(%eax), %ecx
> +	movl	%ecx, (%esp)
> +	movl	$0, 4(%esp)
> +	movl	%ecx, 8(%esp)
> +	movl	$0, 12(%esp)
> +	movl	%esp, %ecx
> +
> +	movl	$ARCH_CET_ALLOC_SHSTK, %ebx
> +	movl	$__NR_arch_prctl, %eax
> +	ENTER_KERNEL
> +	testl	%eax, %eax
> +	jne	L(hlt)		/* This should never happen.  */
> +
> +	/* Copy the base address of the new shadow stack to __ssp[1].  */
> +	movl	(%esp), %eax
> +	movl	%eax, (oSSP + 4)(%edi)
> +
> +	addl	$16, %esp
> +
> +	/* Restore EBX from the first scratch register slot.  */
> +	movl	oSCRATCH1(%edi), %ebx
> +
> +	/* Get the size of the new shadow stack.  */
> +	movl	(oSSP + 8)(%edi), %ecx
> +
> +	/* Use the restore stoken to restore the new shadow stack.  */
> +	rstorssp -8(%eax, %ecx)
> +
> +	/* Save the restore token at the next 8 byte aligned boundary
> +	   on the original shadow stack.  */
> +	saveprevssp
> +
> +	/* Push the address of "jmp exitcode" onto the new stack as
> +	   well as the new shadow stack.  */
> +	call	1f
> +	jmp	L(exitcode)
> +1:
> +
> +	/* Get the new shadow stack pointer.  */
> +	rdsspd	%eax
> +
> +	/* Use the restore stoken to restore the original shadow stack.  */
> +	rstorssp -8(%esi)
> +
> +	/* Save the restore token on the new shadow stack.  */
> +	saveprevssp
> +
> +	/* Store the new shadow stack pointer in __ssp[0].  */
> +	movl	%eax, oSSP(%edi)
> +
> +	/* Restore the original stack.  */
> +	mov	%edx, %esp
> +
> +	cfi_startproc
> +
> +	/* Restore ESI from the second scratch register slot.  */
> +	movl	oSCRATCH2(%edi), %esi
> +	/* Restore EDI from the third scratch register slot.  */
> +	movl	oSCRATCH3(%edi), %edi
> +
> +	ret
> +
> +L(skip_ssp):
> +#endif
> +
>  	/* If the function we call returns we must continue with the
>  	   context which is given in the uc_link element.  To do this
>  	   set the return address for the function the user provides
> @@ -123,6 +245,7 @@ L(call_exit):
>  	call	HIDDEN_JUMPTARGET(exit)
>  	/* The 'exit' call should never return.  In case it does cause
>  	   the process to terminate.  */
> +L(hlt):
>  	hlt
>  	cfi_startproc
>  END(__makecontext)
> diff --git a/sysdeps/unix/sysv/linux/i386/setcontext.S b/sysdeps/unix/sysv/linux/i386/setcontext.S
> index f042d80bf4..9bc7d68a1a 100644
> --- a/sysdeps/unix/sysv/linux/i386/setcontext.S
> +++ b/sysdeps/unix/sysv/linux/i386/setcontext.S
> @@ -18,6 +18,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <asm/prctl.h>
>  
>  #include "ucontext_i.h"
>  
> @@ -56,9 +57,6 @@ ENTRY(__setcontext)
>  	movl	oFS(%eax), %ecx
>  	movw	%cx, %fs
>  
> -	/* Fetch the address to return to.  */
> -	movl	oEIP(%eax), %ecx
> -
>  	/* Load the new stack pointer.  */
>  	cfi_def_cfa (eax, 0)
>  	cfi_offset (edi, oEDI)
> @@ -67,6 +65,103 @@ ENTRY(__setcontext)
>  	cfi_offset (ebx, oEBX)
>  	movl	oESP(%eax), %esp
>  
> +#if SHSTK_ENABLED

OK.

> +	/* Check if Shadow Stack is enabled.  */
> +	testl	$X86_FEATURE_1_SHSTK, %gs:FEATURE_1_OFFSET
> +	jz	L(no_shstk)
> +
> +	/* If the base of the target shadow stack is the same as the
> +	   base of the current shadow stack, we unwind the shadow
> +	   stack.  Otherwise it is a stack switch and we look for a
> +	   restore token.  */
> +	movl	oSSP(%eax), %esi
> +	movl	%esi, %edi
> +
> +	/* Get the base of the target shadow stack.  */
> +	movl	(oSSP + 4)(%eax), %ecx
> +	cmpl	%gs:SSP_BASE_OFFSET, %ecx
> +	je	L(unwind_shadow_stack)
> +
> +L(find_restore_token_loop):
> +	/* Align the saved original shadow stack pointer to the next
> +	   8 byte aligned boundary.  */
> +	andl	$-8, %esi
> +
> +	/* Look for a restore token.  */
> +	movl	-8(%esi), %ebx
> +	andl	$-8, %ebx
> +	cmpl	%esi, %ebx
> +	je	L(restore_shadow_stack)
> +
> +	/* Try the next slot.  */
> +	subl	$8, %esi
> +	jmp	L(find_restore_token_loop)
> +
> +L(restore_shadow_stack):
> +	/* Pop return address from the shadow stack since setcontext
> +	   will not return.  */
> +	movl	$1, %ebx
> +	incsspd	%ebx
> +
> +	/* Use the restore stoken to restore the target shadow stack.  */
> +	rstorssp -8(%esi)
> +
> +	/* Save the restore token on the old shadow stack.  NB: This
> +	   restore token may be checked by setcontext or swapcontext
> +	   later.  */
> +	saveprevssp
> +
> +	/* Record the new shadow stack base that was switched to.  */
> +	movl	(oSSP + 4)(%eax), %ebx
> +	movl	%ebx, %gs:SSP_BASE_OFFSET
> +
> +L(unwind_shadow_stack):
> +	rdsspd	%ebx
> +	subl	%edi, %ebx
> +	je	L(skip_unwind_shadow_stack)
> +	negl	%ebx
> +	shrl	$2, %ebx
> +	movl	$255, %esi
> +L(loop):
> +	cmpl	%esi, %ebx
> +	cmovb	%ebx, %esi
> +	incsspd	%esi
> +	subl	%esi, %ebx
> +	ja	L(loop)
> +
> +L(skip_unwind_shadow_stack):
> +
> +	/* Load the values of all the preserved registers (except ESP).  */
> +	movl	oEDI(%eax), %edi
> +	movl	oESI(%eax), %esi
> +	movl	oEBP(%eax), %ebp
> +	movl	oEBX(%eax), %ebx
> +
> +	/* Get the return address set with getcontext.  */
> +	movl	oEIP(%eax), %ecx
> +
> +	/* Check if return address is valid for the case when setcontext
> +	   is invoked from L(exitcode) with linked context.  */
> +	rdsspd	%eax
> +	cmpl	(%eax), %ecx
> +	/* Clear EAX to indicate success.  NB: Don't use xorl to keep
> +	   EFLAGS for jne.  */
> +	movl	$0, %eax
> +	jne	L(jmp)
> +	/* Return to the new context if return address valid.  */
> +	pushl	%ecx
> +	ret
> +
> +L(jmp):
> +	/* Jump to the new context directly.  */
> +	jmp	*%ecx
> +
> +L(no_shstk):
> +#endif
> +
> +	/* Fetch the address to return to.  */
> +	movl	oEIP(%eax), %ecx
> +
>  	/* Push the return address on the new stack so we can return there.  */
>  	pushl	%ecx
>  
> diff --git a/sysdeps/unix/sysv/linux/i386/swapcontext.S b/sysdeps/unix/sysv/linux/i386/swapcontext.S
> index 090c2d8c3e..28d057599e 100644
> --- a/sysdeps/unix/sysv/linux/i386/swapcontext.S
> +++ b/sysdeps/unix/sysv/linux/i386/swapcontext.S
> @@ -18,6 +18,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <asm/prctl.h>
>  
>  #include "ucontext_i.h"
>  
> @@ -76,6 +77,144 @@ ENTRY(__swapcontext)
>  	movl	oFS(%eax), %edx
>  	movw	%dx, %fs
>  
> +#if SHSTK_ENABLED

OK.

> +	/* Check if Shadow Stack is enabled.  */
> +	testl	$X86_FEATURE_1_SHSTK, %gs:FEATURE_1_OFFSET
> +	jz	L(no_shstk)
> +
> +	xorl	%eax, %eax
> +	cmpl	%gs:SSP_BASE_OFFSET, %eax
> +	jnz	L(shadow_stack_bound_recorded)
> +
> +	/* Get the base address and size of the default shadow stack
> +	   which must be the current shadow stack since nothing has
> +	   been recorded yet.  */
> +	sub	$24, %esp
> +	mov	%esp, %ecx
> +	movl	$ARCH_CET_STATUS, %ebx
> +	movl	$__NR_arch_prctl, %eax
> +	ENTER_KERNEL
> +	testl	%eax, %eax
> +	jz	L(continue_no_err)
> +
> +	/* This should never happen.  */
> +	hlt
> +
> +L(continue_no_err):
> +	/* Record the base of the current shadow stack.  */
> +	movl	8(%esp), %eax
> +	movl	%eax, %gs:SSP_BASE_OFFSET
> +	add	$24, %esp
> +
> +L(shadow_stack_bound_recorded):
> +	/* Load address of the context data structure we save in.  */
> +	movl	4(%esp), %eax
> +
> +	/* Load address of the context data structure we swap in  */
> +	movl	8(%esp), %edx
> +
> +       /* If we unwind the stack, we can't undo stack unwinding.  Just
> +	   save the target shadow stack pointer as the current shadow
> +	   stack pointer.   */
> +	movl	oSSP(%edx), %ecx
> +	movl	%ecx, oSSP(%eax)
> +
> +	/* Save the current shadow stack base in ucontext.  */
> +	movl	%gs:SSP_BASE_OFFSET, %ecx
> +	movl	%ecx, (oSSP + 4)(%eax)
> +
> +	/* If the base of the target shadow stack is the same as the
> +	   base of the current shadow stack, we unwind the shadow
> +	   stack.  Otherwise it is a stack switch and we look for a
> +	   restore token.  */
> +	movl	oSSP(%edx), %esi
> +	movl	%esi, %edi
> +
> +	/* Get the base of the target shadow stack.  */
> +	movl	(oSSP + 4)(%edx), %ecx
> +	cmpl	%gs:SSP_BASE_OFFSET, %ecx
> +	je	L(unwind_shadow_stack)
> +
> +L(find_restore_token_loop):
> +	/* Align the saved original shadow stack pointer to the next
> +	   8 byte aligned boundary.  */
> +	andl	$-8, %esi
> +
> +	/* Look for a restore token.  */
> +	movl	-8(%esi), %ebx
> +	andl	$-8, %ebx
> +	cmpl	%esi, %ebx
> +	je	L(restore_shadow_stack)
> +
> +	/* Try the next slot.  */
> +	subl	$8, %esi
> +	jmp	L(find_restore_token_loop)
> +
> +L(restore_shadow_stack):
> +	/* The target shadow stack will be restored.  Save the current
> +	   shadow stack pointer.  */
> +	rdsspd	%ecx
> +	movl	%ecx, oSSP(%eax)
> +
> +	/* Use the restore stoken to restore the target shadow stack.  */
> +	rstorssp -8(%esi)
> +
> +	/* Save the restore token on the old shadow stack.  NB: This
> +	   restore token may be checked by setcontext or swapcontext
> +	   later.  */
> +	saveprevssp
> +
> +	/* Record the new shadow stack base that was switched to.  */
> +	movl	(oSSP + 4)(%edx), %ebx
> +	movl	%ebx, %gs:SSP_BASE_OFFSET
> +
> +L(unwind_shadow_stack):
> +	rdsspd	%ebx
> +	subl	%edi, %ebx
> +	je	L(skip_unwind_shadow_stack)
> +	negl	%ebx
> +	shrl	$2, %ebx
> +	movl	$255, %esi
> +L(loop):
> +	cmpl	%esi, %ebx
> +	cmovb	%ebx, %esi
> +	incsspd	%esi
> +	subl	%esi, %ebx
> +	ja	L(loop)
> +
> +L(skip_unwind_shadow_stack):
> +
> +	/* Load the new stack pointer.  */
> +	movl	oESP(%edx), %esp
> +
> +	/* Load the values of all the preserved registers (except ESP).  */
> +	movl	oEDI(%edx), %edi
> +	movl	oESI(%edx), %esi
> +	movl	oEBP(%edx), %ebp
> +	movl	oEBX(%edx), %ebx
> +
> +	/* Get the return address set with getcontext.  */
> +	movl	oEIP(%edx), %ecx
> +
> +	/* Check if return address is valid for the case when setcontext
> +	   is invoked from L(exitcode) with linked context.  */
> +	rdsspd	%eax
> +	cmpl	(%eax), %ecx
> +	/* Clear EAX to indicate success.  NB: Don't use xorl to keep
> +	   EFLAGS for jne.  */
> +	movl	$0, %eax
> +	jne	L(jmp)
> +	/* Return to the new context if return address valid.  */
> +	pushl	%ecx
> +	ret
> +
> +L(jmp):
> +	/* Jump to the new context directly.  */
> +	jmp	*%ecx
> +
> +L(no_shstk):
> +#endif
> +
>  	/* Fetch the address to return to.  */
>  	movl	oEIP(%eax), %ecx
>  
> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
> index 4aa7bb496a..420b6a7912 100644
> --- a/sysdeps/unix/sysv/linux/i386/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
> @@ -662,4 +662,9 @@ struct libc_do_syscall_args
>  # endif
>  #endif
>  
> +/* Each shadow stack slot takes 4 bytes.  Assuming that each stack
> +   frame takes 128 bytes, this is used to compute shadow stack size
> +   from stack size.  */
> +#define STACK_SIZE_TO_SHADOW_STACK_SIZE_SHIFT 5

OK.

> +
>  #endif /* linux/i386/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/i386/ucontext_i.sym b/sysdeps/unix/sysv/linux/i386/ucontext_i.sym
> index 1dfe03d2cc..1d8608eafc 100644
> --- a/sysdeps/unix/sysv/linux/i386/ucontext_i.sym
> +++ b/sysdeps/unix/sysv/linux/i386/ucontext_i.sym
> @@ -22,6 +22,10 @@ oEBP		mreg (EBP)
>  oESP		mreg (ESP)
>  oEBX		mreg (EBX)
>  oEIP		mreg (EIP)
> +oSCRATCH1	mreg (EAX)
> +oSCRATCH2	mreg (ECX)
> +oSCRATCH3	mreg (EDX)

OK. Just adding a macro.

>  oFPREGS		mcontext (fpregs)
>  oSIGMASK	ucontext (uc_sigmask)
>  oFPREGSMEM	ucontext (__fpregs_mem)
> +oSSP		ucontext (__ssp)

OK. Already have __ssp present since 25123a1c5c96429d70e75b85a9749b405909d7f2.

> -- 
> 2.24.1
> 



-- 
Cheers,
Carlos.


      parent reply	other threads:[~2020-02-14 22:10 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-08 16:15 V2 [PATCH 0/5] i386: Finish CET support H.J. Lu
2020-01-08 16:15 ` V2 [PATCH 1/5] i386: Don't unnecessarily save and restore EAX, ECX and EDX [BZ# 25262] H.J. Lu
2020-01-09 21:13   ` Adhemerval Zanella
2020-01-08 16:15 ` V2 [PATCH 2/5] i386/sub_n.S: Add a missing _CET_ENDBR to indirect jump target H.J. Lu
2020-01-09 21:13   ` Adhemerval Zanella
2020-01-08 16:15 ` V2 [PATCH 3/5] i386: Add _CET_ENDBR to assembly files without ENTRY H.J. Lu
2020-01-09 21:13   ` Adhemerval Zanella
2020-01-08 16:15 ` V2 [PATCH 4/5] i386: Remove _exit.S H.J. Lu
2020-01-09 21:14   ` Adhemerval Zanella
2020-01-08 16:15 ` V2 [PATCH 5/5] i386: Enable CET support in ucontext functions H.J. Lu
2020-02-01 14:09   ` V3 [PATCH] " H.J. Lu
2020-02-13 17:04     ` V4 " H.J. Lu
2020-02-14 22:10     ` Carlos O'Donell [this message]

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

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8bec1ea2-6ea5-90d5-db37-67e5b4920b7d@redhat.com \
    --to=codonell@redhat.com \
    --cc=hjl.tools@gmail.com \
    --cc=libc-alpha@sourceware.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).