[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 6/9] target/arm: Factor out code for setting MTE TCF0 fiel
From: |
Alex Bennée |
Subject: |
Re: [PATCH v2 6/9] target/arm: Factor out code for setting MTE TCF0 field |
Date: |
Fri, 14 Jun 2024 12:21:10 +0100 |
Gustavo Romero <gustavo.romero@linaro.org> writes:
> Factor out the code used for setting the MTE TCF0 field from the prctl
> code into a convenient function. Other subsystems, like gdbstub, need to
> set this field as well, so keep it as a separate function to avoid
> duplication and ensure consistency in how this field is set across the
> board.
>
> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
> ---
> linux-user/aarch64/target_prctl.h | 22 ++-----------
> target/arm/mte.h | 53 +++++++++++++++++++++++++++++++
> 2 files changed, 55 insertions(+), 20 deletions(-)
> create mode 100644 target/arm/mte.h
>
> diff --git a/linux-user/aarch64/target_prctl.h
> b/linux-user/aarch64/target_prctl.h
> index aa8e203c15..8a11404222 100644
> --- a/linux-user/aarch64/target_prctl.h
> +++ b/linux-user/aarch64/target_prctl.h
> @@ -7,6 +7,7 @@
> #define AARCH64_TARGET_PRCTL_H
>
> #include "target/arm/cpu-features.h"
> +#include "target/arm/mte.h"
We are moving a helper that is TCG only but using the common code path.
I suspect the prototype better belongs in target/arm/tcg/mte_helper.h or
possibly target/arm/tcg/mte_user_helper.h if we are just using it for
user-mode.
>
> static abi_long do_prctl_sve_get_vl(CPUArchState *env)
> {
> @@ -173,26 +174,7 @@ static abi_long
> do_prctl_set_tagged_addr_ctrl(CPUArchState *env, abi_long arg2)
> env->tagged_addr_enable = arg2 & PR_TAGGED_ADDR_ENABLE;
>
> if (cpu_isar_feature(aa64_mte, cpu)) {
> - /*
> - * Write PR_MTE_TCF to SCTLR_EL1[TCF0].
> - *
> - * The kernel has a per-cpu configuration for the sysadmin,
> - * /sys/devices/system/cpu/cpu<N>/mte_tcf_preferred,
> - * which qemu does not implement.
> - *
> - * Because there is no performance difference between the modes, and
> - * because SYNC is most useful for debugging MTE errors, choose SYNC
> - * as the preferred mode. With this preference, and the way the API
> - * uses only two bits, there is no way for the program to select
> - * ASYMM mode.
> - */
> - unsigned tcf = 0;
> - if (arg2 & PR_MTE_TCF_SYNC) {
> - tcf = 1;
> - } else if (arg2 & PR_MTE_TCF_ASYNC) {
> - tcf = 2;
> - }
> - env->cp15.sctlr_el[1] = deposit64(env->cp15.sctlr_el[1], 38, 2, tcf);
> + set_mte_tcf0(env, arg2);
>
> /*
> * Write PR_MTE_TAG to GCR_EL1[Exclude].
> diff --git a/target/arm/mte.h b/target/arm/mte.h
> new file mode 100644
> index 0000000000..89712aad70
> --- /dev/null
> +++ b/target/arm/mte.h
> @@ -0,0 +1,53 @@
> +/*
> + * ARM MemTag convenience functions.
> + *
> + * Copyright (c) 2024 Linaro, Ltd.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see
> <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef MTE_H
> +#define MTE_H
> +
> +#ifdef CONFIG_TCG
> +#ifdef CONFIG_USER_ONLY
> +#include "sys/prctl.h"
> +
> +static void set_mte_tcf0(CPUArchState *env, abi_long value)
Same comments as Phil regarding should it be inline, add a prefix etc...
> +{
> + /*
> + * Write PR_MTE_TCF to SCTLR_EL1[TCF0].
> + *
> + * The kernel has a per-cpu configuration for the sysadmin,
> + * /sys/devices/system/cpu/cpu<N>/mte_tcf_preferred,
> + * which qemu does not implement.
> + *
> + * Because there is no performance difference between the modes, and
> + * because SYNC is most useful for debugging MTE errors, choose SYNC
> + * as the preferred mode. With this preference, and the way the API
> + * uses only two bits, there is no way for the program to select
> + * ASYMM mode.
> + */
> + unsigned tcf = 0;
> + if (value & PR_MTE_TCF_SYNC) {
> + tcf = 1;
> + } else if (value & PR_MTE_TCF_ASYNC) {
> + tcf = 2;
> + }
> + env->cp15.sctlr_el[1] = deposit64(env->cp15.sctlr_el[1], 38, 2, tcf);
> +}
> +#endif /* CONFIG_USER_ONLY */
> +#endif /* CONFIG_TCG */
> +
> +#endif /* MTE_H */
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
- [PATCH v2 5/9] target/arm: Make some MTE helpers widely available, (continued)
[PATCH v2 6/9] target/arm: Factor out code for setting MTE TCF0 field, Gustavo Romero, 2024/06/13
Re: [PATCH v2 6/9] target/arm: Factor out code for setting MTE TCF0 field,
Alex Bennée <=
[PATCH v2 7/9] gdbstub: Make get cpu and hex conversion functions non-internal, Gustavo Romero, 2024/06/13
[PATCH v2 8/9] gdbstub: Add support for MTE in user mode, Gustavo Romero, 2024/06/13
[PATCH v2 9/9] tests/tcg/aarch64: Add MTE gdbstub tests, Gustavo Romero, 2024/06/13
Re: [PATCH v2 0/9] Add MTE stubs for aarch64 user mode, Alex Bennée, 2024/06/14