Fix portSET_INTERRUPT_MASK_FROM_ISR definition for atomic operation (#940)

* Introduce portHAS_NESTED_INTERRUPTS to identify if port has nested interrupt or not.
* Update atomic.h to use portHAS_NESTED_INTERRUPTS instead of portSET_INTERRUPT_MASK_FROM_ISR definition.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>
Co-authored-by: ActoryOu <jay2002824@gmail.com>
diff --git a/.github/.cSpellWords.txt b/.github/.cSpellWords.txt
index 9e0f656..49a91c3 100644
--- a/.github/.cSpellWords.txt
+++ b/.github/.cSpellWords.txt
@@ -59,6 +59,7 @@
 brne
 bswtrg
 BSWTRG
+Bytesto
 CANEN
 CANRX
 CANTX
@@ -89,13 +90,16 @@
 CKLO
 CKPS
 CLDIV
+CLEARINTENA
 CLKA
 CLKB
+CLKDIS
 CLKEN
 clki
 CLKI
 CLKP
 CLKS
+CLKSOURCE
 CLKSTA
 CLRB
 CLRF
@@ -690,6 +694,7 @@
 RTAR
 RTCEN
 RTCSC
+RTICTL
 RTIE
 RTIF
 RTIFRC
@@ -713,6 +718,7 @@
 RXSETUP
 RXSUSP
 RXSYN
+RXTDIS
 RXTEN
 RXUBR
 SBYCR
@@ -726,6 +732,7 @@
 SENDA
 SETB
 SETEN
+SETINTENA
 SETPSW
 SETR
 setvect
@@ -849,6 +856,7 @@
 TXVDIS
 UDCP
 uncrustify
+UNDADD
 UNRE
 unsuspended
 URAD
@@ -867,6 +875,7 @@
 vect
 VECT
 VECTACTIVE
+VECTKEY
 visualisation
 vldmdbeq
 vldmia
diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h
index 23526bb..6eb498c 100644
--- a/include/FreeRTOS.h
+++ b/include/FreeRTOS.h
@@ -509,12 +509,36 @@
 
 #endif /* configUSE_TIMERS */
 
+#ifndef portHAS_NESTED_INTERRUPTS
+    #if defined( portSET_INTERRUPT_MASK_FROM_ISR ) && defined( portCLEAR_INTERRUPT_MASK_FROM_ISR )
+        #define portHAS_NESTED_INTERRUPTS    1
+    #else
+        #define portHAS_NESTED_INTERRUPTS    0
+    #endif
+#endif
+
 #ifndef portSET_INTERRUPT_MASK_FROM_ISR
-    #define portSET_INTERRUPT_MASK_FROM_ISR()    0
+    #if ( portHAS_NESTED_INTERRUPTS == 1 )
+        #error portSET_INTERRUPT_MASK_FROM_ISR must be defined for ports that support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 1)
+    #else
+        #define portSET_INTERRUPT_MASK_FROM_ISR()    0
+    #endif
+#else
+    #if ( portHAS_NESTED_INTERRUPTS == 0 )
+        #error portSET_INTERRUPT_MASK_FROM_ISR must not be defined for ports that do not support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 0)
+    #endif
 #endif
 
 #ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR
-    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue )    ( void ) ( uxSavedStatusValue )
+    #if ( portHAS_NESTED_INTERRUPTS == 1 )
+        #error portCLEAR_INTERRUPT_MASK_FROM_ISR must be defined for ports that support nested interrupts  (i.e. portHAS_NESTED_INTERRUPTS is set to 1)
+    #else
+        #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue )    ( void ) ( uxSavedStatusValue )
+    #endif
+#else
+    #if ( portHAS_NESTED_INTERRUPTS == 0 )
+        #error portCLEAR_INTERRUPT_MASK_FROM_ISR must not be defined for ports that do not support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 0)
+    #endif
 #endif
 
 #ifndef portCLEAN_UP_TCB
diff --git a/include/atomic.h b/include/atomic.h
index 8feb652..ef487b4 100644
--- a/include/atomic.h
+++ b/include/atomic.h
@@ -33,6 +33,14 @@
  * This file implements atomic functions by disabling interrupts globally.
  * Implementations with architecture specific atomic instructions can be
  * provided under each compiler directory.
+ *
+ * The atomic interface can be used in FreeRTOS tasks on all FreeRTOS ports. It
+ * can also be used in Interrupt Service Routines (ISRs) on FreeRTOS ports that
+ * support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 1). The
+ * atomic interface must not be used in ISRs on FreeRTOS ports that do not
+ * support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 0)
+ * because ISRs on these ports cannot be interrupted and therefore, do not need
+ * atomics in ISRs.
  */
 
 #ifndef ATOMIC_H
@@ -59,7 +67,7 @@
  * ATOMIC_ENTER_CRITICAL().
  *
  */
-#if defined( portSET_INTERRUPT_MASK_FROM_ISR )
+#if ( portHAS_NESTED_INTERRUPTS == 1 )
 
 /* Nested interrupt scheme is supported in this port. */
     #define ATOMIC_ENTER_CRITICAL() \
diff --git a/portable/GCC/RISC-V/portmacro.h b/portable/GCC/RISC-V/portmacro.h
index e40af66..05386c3 100644
--- a/portable/GCC/RISC-V/portmacro.h
+++ b/portable/GCC/RISC-V/portmacro.h
@@ -111,9 +111,6 @@
 /* Critical section management. */
 #define portCRITICAL_NESTING_IN_TCB    0
 
-#define portSET_INTERRUPT_MASK_FROM_ISR()                          0
-#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue )    ( void ) uxSavedStatusValue
-
 #define portDISABLE_INTERRUPTS()                                   __asm volatile ( "csrc mstatus, 8" )
 #define portENABLE_INTERRUPTS()                                    __asm volatile ( "csrs mstatus, 8" )
 
diff --git a/portable/IAR/RISC-V/portmacro.h b/portable/IAR/RISC-V/portmacro.h
index eba9eb6..9a9141c 100644
--- a/portable/IAR/RISC-V/portmacro.h
+++ b/portable/IAR/RISC-V/portmacro.h
@@ -113,9 +113,6 @@
 /* Critical section management. */
 #define portCRITICAL_NESTING_IN_TCB    0
 
-#define portSET_INTERRUPT_MASK_FROM_ISR()                          0
-#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue )    ( void ) uxSavedStatusValue
-
 #define portDISABLE_INTERRUPTS()                                   __disable_interrupt()
 #define portENABLE_INTERRUPTS()                                    __enable_interrupt()
 
diff --git a/portable/ThirdParty/xClang/XCOREAI/portmacro.h b/portable/ThirdParty/xClang/XCOREAI/portmacro.h
index 06f2b75..82da953 100644
--- a/portable/ThirdParty/xClang/XCOREAI/portmacro.h
+++ b/portable/ThirdParty/xClang/XCOREAI/portmacro.h
@@ -139,9 +139,6 @@
         #define portSET_INTERRUPT_MASK()                  rtos_interrupt_mask_all()
         #define portCLEAR_INTERRUPT_MASK( ulState )       rtos_interrupt_mask_set( ulState )
 
-        #define portSET_INTERRUPT_MASK_FROM_ISR()         ( 0 )
-        #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    ( ( void ) x )
-
 /*
  * Will enable interrupts if ulState is non-zero.
  */