[PATCH v3 02/20] arm64: introduce an order for exceptions
Julien Thierry
julien.thierry at arm.com
Wed Oct 11 10:11:19 PDT 2017
On 05/10/17 20:17, James Morse wrote:
> Currently SError is always masked in the kernel. To support RAS exceptions
> using SError on hardware with the v8.2 RAS Extensions we need to unmask
> SError as much as possible.
>
> Let's define an order for masking and unmasking exceptions. 'dai' is
> memorable and effectively what we have today.
>
> Disabling debug exceptions should cause all other exceptions to be masked.
> Masking SError should mask irq, but not disable debug exceptions.
> Masking irqs has no side effects for other flags. Keeping to this order
> makes it easier for entry.S to know which exceptions should be unmasked.
>
> FIQ is never expected, but we mask it when we mask debug exceptions, and
> unmask it at all other times.
>
> Given masking debug exceptions masks everything, we don't need macros
> to save/restore that bit independently. Remove them and switch the last
> caller over to {en,dis}able_daif().
>
> Signed-off-by: James Morse <james.morse at arm.com>
Reviewed-by: Julien Thierry <julien.thierry at arm.com>
> ---
> arch/arm64/include/asm/irqflags.h | 34 +++++++++++++---------------------
> arch/arm64/kernel/debug-monitors.c | 5 +++--
> 2 files changed, 16 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm64/include/asm/irqflags.h b/arch/arm64/include/asm/irqflags.h
> index 8c581281fa12..9ecdca7011f0 100644
> --- a/arch/arm64/include/asm/irqflags.h
> +++ b/arch/arm64/include/asm/irqflags.h
> @@ -21,6 +21,19 @@
> #include <asm/ptrace.h>
>
> /*
> + * Aarch64 has flags for masking: Debug, Asynchronous (serror), Interrupts and
> + * FIQ exceptions, in the 'daif' register. We mask and unmask them in 'dai'
> + * order:
> + * Masking debug exceptions causes all other exceptions to be masked too/
> + * Masking SError masks irq, but not debug exceptions. Masking irqs has no
> + * side effects for other flags. Keeping to this order makes it easier for
> + * entry.S to know which exceptions should be unmasked.
> + *
> + * FIQ is never expected, but we mask it when we disable debug exceptions, and
> + * unmask it at all other times.
> + */
> +
> +/*
> * CPU interrupt mask handling.
> */
> static inline unsigned long arch_local_irq_save(void)
> @@ -89,26 +102,5 @@ static inline int arch_irqs_disabled_flags(unsigned long flags)
> {
> return flags & PSR_I_BIT;
> }
> -
> -/*
> - * save and restore debug state
> - */
> -#define local_dbg_save(flags) \
> - do { \
> - typecheck(unsigned long, flags); \
> - asm volatile( \
> - "mrs %0, daif // local_dbg_save\n" \
> - "msr daifset, #8" \
> - : "=r" (flags) : : "memory"); \
> - } while (0)
> -
> -#define local_dbg_restore(flags) \
> - do { \
> - typecheck(unsigned long, flags); \
> - asm volatile( \
> - "msr daif, %0 // local_dbg_restore\n" \
> - : : "r" (flags) : "memory"); \
> - } while (0)
> -
> #endif
> #endif
> diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c
> index c7ef99904934..bbfa4978b657 100644
> --- a/arch/arm64/kernel/debug-monitors.c
> +++ b/arch/arm64/kernel/debug-monitors.c
> @@ -30,6 +30,7 @@
>
> #include <asm/cpufeature.h>
> #include <asm/cputype.h>
> +#include <asm/daifflags.h>
> #include <asm/debug-monitors.h>
> #include <asm/system_misc.h>
>
> @@ -46,9 +47,9 @@ u8 debug_monitors_arch(void)
> static void mdscr_write(u32 mdscr)
> {
> unsigned long flags;
> - local_dbg_save(flags);
> + flags = local_mask_daif();
> write_sysreg(mdscr, mdscr_el1);
> - local_dbg_restore(flags);
> + local_restore_daif(flags);
> }
> NOKPROBE_SYMBOL(mdscr_write);
>
>
--
Julien Thierry
More information about the linux-arm-kernel
mailing list