diff options
Diffstat (limited to '')
-rw-r--r-- | bsps/shared/irq/irq-affinity.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/bsps/shared/irq/irq-affinity.c b/bsps/shared/irq/irq-affinity.c index d8ac6d55c1..7e9250a948 100644 --- a/bsps/shared/irq/irq-affinity.c +++ b/bsps/shared/irq/irq-affinity.c @@ -3,14 +3,14 @@ /** * @file * - * @ingroup bsp_interrupt + * @ingroup RTEMSImplClassicIntr * * @brief This source file contains the implementation of * rtems_interrupt_get_affinity() and rtems_interrupt_set_affinity(). */ /* - * Copyright (C) 2017 embedded brains GmbH (http://www.embedded-brains.de) + * Copyright (C) 2017, 2022 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -36,7 +36,7 @@ #include <bsp/irq-generic.h> -#include <rtems/score/processormask.h> +#include <rtems/score/smpimpl.h> rtems_status_code rtems_interrupt_set_affinity( rtems_vector_number vector, @@ -51,17 +51,22 @@ rtems_status_code rtems_interrupt_set_affinity( return RTEMS_INVALID_ADDRESS; } - if (!bsp_interrupt_is_valid_vector(vector)) { + if ( !bsp_interrupt_is_valid_vector( vector ) ) { return RTEMS_INVALID_ID; } - status = _Processor_mask_From_cpu_set_t(&set, affinity_size, affinity); + status = _Processor_mask_From_cpu_set_t( &set, affinity_size, affinity ); if ( !_Processor_mask_Is_at_most_partial_loss( status ) ) { return RTEMS_INVALID_NUMBER; } + _Processor_mask_And( &set, _SMP_Get_online_processors(), &set ); + if ( _Processor_mask_Is_zero( &set ) ) { + return RTEMS_INVALID_NUMBER; + } + #if defined(RTEMS_SMP) - return bsp_interrupt_set_affinity(vector, &set); + return bsp_interrupt_set_affinity( vector, &set ); #else return RTEMS_SUCCESSFUL; #endif |