arm64/irq: Add mask for DAIF and SPSR DAIF bits
Use them for critical section handling, removes a bit of copy&pasted code behind CONFIG_ARM64_DECODEFIQ flag
This commit is contained in:
parent
fc5a029e44
commit
498275ca43
@ -220,6 +220,14 @@
|
|||||||
#define XCPTCONTEXT_REGS (XCPTCONTEXT_GP_REGS + XCPTCONTEXT_FPU_REGS)
|
#define XCPTCONTEXT_REGS (XCPTCONTEXT_GP_REGS + XCPTCONTEXT_FPU_REGS)
|
||||||
#define XCPTCONTEXT_SIZE (8 * XCPTCONTEXT_REGS)
|
#define XCPTCONTEXT_SIZE (8 * XCPTCONTEXT_REGS)
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM64_DECODEFIQ
|
||||||
|
# define IRQ_DAIF_MASK (3)
|
||||||
|
#else
|
||||||
|
# define IRQ_DAIF_MASK (2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IRQ_SPSR_MASK (IRQ_DAIF_MASK << 6)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -349,13 +357,9 @@ static inline irqstate_t up_irq_save(void)
|
|||||||
__asm__ __volatile__
|
__asm__ __volatile__
|
||||||
(
|
(
|
||||||
"mrs %0, daif\n"
|
"mrs %0, daif\n"
|
||||||
#ifdef CONFIG_ARM64_DECODEFIQ
|
"msr daifset, %1\n"
|
||||||
"msr daifset, #3\n"
|
|
||||||
#else
|
|
||||||
"msr daifset, #2\n"
|
|
||||||
#endif
|
|
||||||
: "=r" (flags)
|
: "=r" (flags)
|
||||||
:
|
: "i" (IRQ_DAIF_MASK)
|
||||||
: "memory"
|
: "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -371,13 +375,9 @@ static inline irqstate_t up_irq_enable(void)
|
|||||||
__asm__ __volatile__
|
__asm__ __volatile__
|
||||||
(
|
(
|
||||||
"mrs %0, daif\n"
|
"mrs %0, daif\n"
|
||||||
#ifdef CONFIG_ARM64_DECODEFIQ
|
"msr daifclr, %1\n"
|
||||||
"msr daifclr, #3\n"
|
|
||||||
#else
|
|
||||||
"msr daifclr, #2\n"
|
|
||||||
#endif
|
|
||||||
: "=r" (flags)
|
: "=r" (flags)
|
||||||
:
|
: "i" (IRQ_DAIF_MASK)
|
||||||
: "memory"
|
: "memory"
|
||||||
);
|
);
|
||||||
return flags;
|
return flags;
|
||||||
|
@ -56,22 +56,6 @@
|
|||||||
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro enable_irq
|
|
||||||
#ifdef CONFIG_ARM64_DECODEFIQ
|
|
||||||
msr daifclr, #3
|
|
||||||
#else
|
|
||||||
msr daifclr, #2
|
|
||||||
#endif
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro disable_irq
|
|
||||||
#ifdef CONFIG_ARM64_DECODEFIQ
|
|
||||||
msr daifset, #3
|
|
||||||
#else
|
|
||||||
msr daifset, #2
|
|
||||||
#endif
|
|
||||||
.endm
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -238,9 +222,9 @@ SECTION_FUNC(text, arm64_sync_exc)
|
|||||||
|
|
||||||
/* Call dispatch_syscall() on the kernel stack with interrupts enabled */
|
/* Call dispatch_syscall() on the kernel stack with interrupts enabled */
|
||||||
|
|
||||||
enable_irq
|
msr daifclr, #IRQ_DAIF_MASK /* Re-enable interrupts */
|
||||||
bl dispatch_syscall
|
bl dispatch_syscall
|
||||||
disable_irq
|
msr daifset, #IRQ_DAIF_MASK /* Disable interrupts */
|
||||||
|
|
||||||
/* Save the return value into the user context */
|
/* Save the return value into the user context */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user