[RFC] Kernel livepatching support in GCC
Szabolcs Nagy
szabolcs.nagy@arm.com
Thu Oct 22 10:16:00 GMT 2015
On 22/10/15 10:23, libin wrote:
> From: Jiangjiji <jiangjiji@huawei.com>
> Date: Sat, 10 Oct 2015 15:29:57 +0800
> Subject: [PATCH] * gcc/config/aarch64/aarch64.opt: Add a new option.
> * gcc/config/aarch64/aarch64.c: Add some new functions and Macros.
> * gcc/config/aarch64/aarch64.h: Modify PROFILE_HOOK and FUNCTION_PROFILER.
>
this patch might be worth submitting to gcc-patches.
i assume this is not redundant with respect to the
nop-padding work.
> Signed-off-by: Jiangjiji <jiangjiji@huawei.com>
> Signed-off-by: Li Bin <huawei.libin@huawei.com>
> ---
> gcc/config/aarch64/aarch64.c | 23 +++++++++++++++++++++++
> gcc/config/aarch64/aarch64.h | 13 ++++++++-----
> gcc/config/aarch64/aarch64.opt | 4 ++++
> 3 files changed, 35 insertions(+), 5 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
> index 752df4e..c70b161 100644
> --- a/gcc/config/aarch64/aarch64.c
> +++ b/gcc/config/aarch64/aarch64.c
> @@ -440,6 +440,17 @@ aarch64_is_long_call_p (rtx sym)
> return aarch64_decl_is_long_call_p (SYMBOL_REF_DECL (sym));
> }
>
> +void
> +aarch64_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
> +{
> + if (flag_fentry)
> + {
> + fprintf (file, "\tmov\tx9, x30\n");
> + fprintf (file, "\tbl\t__fentry__\n");
> + fprintf (file, "\tmov\tx30, x9\n");
> + }
> +}
> +
you can even omit the mov x30,x9 at the call site if
__fentry__ does
stp x9,x30,[sp,#-16]!
//... profiling
ldp x30,x9,[sp],#16
ret x9
is there a problem with this?
i think the rest of the patch means that -pg retains
the old behaviour and -pg -mfentry emits this new entry.
note that -pg rejects -fomit-frame-pointer (for no good
reason), that should be fixed separately (it seems the
kernel now relies on frame pointers on aarch64, but the
mcount abi does not require this and e.g. the glibc
mcount does not use it.)
> /* Return true if the offsets to a zero/sign-extract operation
> represent an expression that matches an extend operation. The
> operands represent the paramters from
> @@ -7414,6 +7425,15 @@ aarch64_emit_unlikely_jump (rtx insn)
> add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
> }
>
> +/* Return true, if profiling code should be emitted before
> + * prologue. Otherwise it returns false.
> + * Note: For x86 with "hotfix" it is sorried. */
> +static bool
> +aarch64_profile_before_prologue (void)
> +{
> + return flag_fentry != 0;
> +}
> +
> /* Expand a compare and swap pattern. */
>
> void
> @@ -8454,6 +8474,9 @@ aarch64_cannot_change_mode_class (enum machine_mode from,
> #undef TARGET_ASM_ALIGNED_SI_OP
> #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
>
> +#undef TARGET_PROFILE_BEFORE_PROLOGUE
> +#define TARGET_PROFILE_BEFORE_PROLOGUE aarch64_profile_before_prologue
> +
> #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
> #define TARGET_ASM_CAN_OUTPUT_MI_THUNK \
> hook_bool_const_tree_hwi_hwi_const_tree_true
> diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
> index 77b2bb9..65e34fc 100644
> --- a/gcc/config/aarch64/aarch64.h
> +++ b/gcc/config/aarch64/aarch64.h
> @@ -804,13 +804,16 @@ do { \
> #define PROFILE_HOOK(LABEL) \
> { \
> rtx fun, lr; \
> - lr = get_hard_reg_initial_val (Pmode, LR_REGNUM); \
> - fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \
> - emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lr, Pmode); \
> + if (!flag_fentry)
> + {
> + lr = get_hard_reg_initial_val (Pmode, LR_REGNUM); \
> + fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \
> + emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lr, Pmode); \
> + }
> }
>
> -/* All the work done in PROFILE_HOOK, but still required. */
> -#define FUNCTION_PROFILER(STREAM, LABELNO) do { } while (0)
> +#define FUNCTION_PROFILER(STREAM, LABELNO)
> + aarch64_function_profiler(STREAM, LABELNO)
>
> /* For some reason, the Linux headers think they know how to define
> these macros. They don't!!! */
> diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
> index 266d873..9e4b408 100644
> --- a/gcc/config/aarch64/aarch64.opt
> +++ b/gcc/config/aarch64/aarch64.opt
> @@ -124,3 +124,7 @@ Enum(aarch64_abi) String(ilp32) Value(AARCH64_ABI_ILP32)
>
> EnumValue
> Enum(aarch64_abi) String(lp64) Value(AARCH64_ABI_LP64)
> +
> +mfentry
> +Target Report Var(flag_fentry) Init(0)
> +Emit profiling counter call at function entry immediately after prologue.
>
More information about the Gcc
mailing list