On 11/13/2017 02:44 PM, Tsimbalist, Igor V wrote:
> New patch is attached. The difference is that all newly introduced macro
> are removed except of _Unwind_Frames_Extra macro. They are replaced
> with new parameters and local variables.
> 
> Igor
> 
> 
> 0008-Add-Intel-CET-support-for-EH-in-libgcc.patch
> 
> 
> From 47fe033b2a23397be50455b7661ad499c42209be Mon Sep 17 00:00:00 2001
> From: Igor Tsimbalist <igor.v.tsimbal...@intel.com>
> Date: Wed, 19 Jul 2017 03:04:46 +0300
> Subject: [PATCH 08/22] Add Intel CET support for EH in libgcc.
> 
> Control-flow Enforcement Technology (CET), published by Intel,
> introduces the Shadow Stack feature, which ensures a return from a
> function is done to exactly the same location from where the function
> was called. When EH is present the control-flow transfer may skip some
> stack frames and the shadow stack has to be adjusted not to signal a
> violation of a control-flow transfer. It's done by counting a number
> of skiping frames and adjasting shadow stack pointer by this number.
> 
> Having new semantic of the 'ret' instruction if CET is supported in HW
> the 'ret' instruction cannot be generated in ix86_expand_epilogue when
> we are returning after EH is processed. Added a code in
> ix86_expand_epilogue to adjust Shadow Stack pointer and to generate an
> indirect jump instead of 'ret'. As sp register is used during this
> adjustment thus the argument in pro_epilogue_adjust_stack is changed
> to update cfa_reg based on whether control-flow instrumentation is set.
> Without updating the cfa_reg field there is an assert later in dwarf2
> pass related to mismatch the stack register and cfa_reg value.
> 
> gcc/
>       * config/i386/i386.c (ix86_expand_epilogue): Change simple
>       return to indirect jump for EH return. Change explicit 'false'
>       argument in pro_epilogue_adjust_stack with a value of
>       flag_cf_protection.
>       * config/i386/i386.md (simple_return_indirect_internal): Remove
>       SImode restriction to support 64-bit.
> 
> libgcc/
>       * config/i386/linux-unwind.h: Include
>       config/i386/shadow-stack-unwind.h.
>       * config/i386/shadow-stack-unwind.h: New file.
>       * unwind-dw2.c: (uw_install_context): Add a frame parameter and
>       pass it to _Unwind_Frames_Extra.
>       * unwind-generic.h (_Unwind_Frames_Extra): New.
>       * unwind.inc (_Unwind_RaiseException_Phase2): Add frames_p
>       parameter. Add local variable frames to count number of frames.
>       (_Unwind_ForcedUnwind_Phase2): Likewise.
>       (_Unwind_RaiseException): Add local variable frames to count
>       number of frames, pass it to _Unwind_RaiseException_Phase2 and
>       uw_install_context.
>       (_Unwind_ForcedUnwind): Likewise.
>       (_Unwind_Resume): Likewise.
>       (_Unwind_Resume_or_Rethrow): Likewise.
This version looks much better  :-)

OK.
jeff

Reply via email to