mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-11-16 12:34:45 +00:00
bsps/aarch64: Set interrupt level correctly
The existing code is functional but inccorrect and blindly modifies the other masking bits. It is important to preserve those other bits since they control masking of important system events.
This commit is contained in:
committed by
Joel Sherrill
parent
55a93ae3b4
commit
2d27725838
@@ -49,7 +49,7 @@ extern "C" {
|
||||
static inline void arm_interrupt_handler_dispatch(rtems_vector_number vector)
|
||||
{
|
||||
uint32_t interrupt_level = _CPU_ISR_Get_level();
|
||||
AArch64_interrupt_enable(1);
|
||||
_CPU_ISR_Set_level(1);
|
||||
bsp_interrupt_handler_dispatch(vector);
|
||||
_CPU_ISR_Set_level(interrupt_level);
|
||||
}
|
||||
|
||||
@@ -149,11 +149,17 @@ void _CPU_Context_Initialize(
|
||||
void _CPU_ISR_Set_level( uint32_t level )
|
||||
{
|
||||
/* Set the mask bit if interrupts are disabled */
|
||||
level = level ? AARCH64_PSTATE_I : 0;
|
||||
__asm__ volatile (
|
||||
"msr DAIF, %[level]\n"
|
||||
: : [level] "r" (level)
|
||||
);
|
||||
if ( level ) {
|
||||
__asm__ volatile (
|
||||
"msr DAIFSet, #0x2\n"
|
||||
: : [level] "r" (level)
|
||||
);
|
||||
} else {
|
||||
__asm__ volatile (
|
||||
"msr DAIFClr, #0x2\n"
|
||||
: : [level] "r" (level)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t _CPU_ISR_Get_level( void )
|
||||
|
||||
Reference in New Issue
Block a user