This is an automated email from the ASF dual-hosted git repository.

masayuki pushed a commit to branch releases/10.0
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/releases/10.0 by this push:
     new 13db23b  Revert "arch/sim: Make the SIGUSR1 host signal to use the 
NuttX irq logic"
13db23b is described below

commit 13db23bd40331903a89fcabe239f9e00ff658630
Author: Masayuki Ishikawa <[email protected]>
AuthorDate: Mon Oct 26 07:36:58 2020 +0900

    Revert "arch/sim: Make the SIGUSR1 host signal to use the NuttX irq logic"
    
    This reverts commit d6210fcd84dfd7b3bc3bac6cd6d3ee00c4f92239.
---
 arch/sim/include/arch.h         | 33 +++++++++++++++++++++++++
 arch/sim/src/sim/up_internal.h  |  1 -
 arch/sim/src/sim/up_simsmp.c    | 55 +++++++++++++++++++++++++++++++++++++++--
 arch/sim/src/sim/up_smpsignal.c | 45 ---------------------------------
 4 files changed, 86 insertions(+), 48 deletions(-)

diff --git a/arch/sim/include/arch.h b/arch/sim/include/arch.h
index 3fca681..4798968 100644
--- a/arch/sim/include/arch.h
+++ b/arch/sim/include/arch.h
@@ -41,6 +41,14 @@
 #define __ARCH_SIM_INCLUDE_ARCH_H
 
 /****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
  * Inline functions
  ****************************************************************************/
 
@@ -53,4 +61,29 @@ static inline uintptr_t sim_getsp(void)
   return (uintptr_t)__builtin_frame_address(0);
 }
 
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* __ARCH_SIM_INCLUDE_ARCH_H */
diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h
index ac7d221..2741c64 100644
--- a/arch/sim/src/sim/up_internal.h
+++ b/arch/sim/src/sim/up_internal.h
@@ -242,7 +242,6 @@ void sim_cpu0_start(void);
 void up_cpu_started(void);
 int up_cpu_paused(int cpu);
 struct tcb_s *up_this_task(void);
-int up_cpu_set_pause_handler(int irq);
 #endif
 
 /* up_oneshot.c *************************************************************/
diff --git a/arch/sim/src/sim/up_simsmp.c b/arch/sim/src/sim/up_simsmp.c
index 478b4d7..56f8ac6 100644
--- a/arch/sim/src/sim/up_simsmp.c
+++ b/arch/sim/src/sim/up_simsmp.c
@@ -123,6 +123,7 @@ static void *sim_idle_trampoline(void *arg)
 #ifdef CONFIG_SIM_WALLTIME
   uint64_t now = 0;
 #endif
+  sigset_t set;
   int ret;
 
   /* Set the CPU number for the CPU thread */
@@ -136,7 +137,14 @@ static void *sim_idle_trampoline(void *arg)
 
   /* Make sure the SIGUSR1 is not masked */
 
-  up_cpu_set_pause_handler(SIGUSR1);
+  sigemptyset(&set);
+  sigaddset(&set, SIGUSR1);
+
+  ret = pthread_sigmask(SIG_UNBLOCK, &set, NULL);
+  if (ret < 0)
+    {
+      return NULL;
+    }
 
   /* Let up_cpu_start() continue */
 
@@ -173,6 +181,28 @@ static void *sim_idle_trampoline(void *arg)
 }
 
 /****************************************************************************
+ * Name: sim_handle_signal
+ *
+ * Description:
+ *   This is the SIGUSR signal handler.  It implements the core logic of
+ *   up_cpu_pause() on the thread of execution the simulated CPU.
+ *
+ * Input Parameters:
+ *   arg - Standard sigaction arguments
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+static void sim_handle_signal(int signo, siginfo_t *info, void *context)
+{
+  int cpu = (int)((uintptr_t)pthread_getspecific(g_cpu_key));
+
+  up_cpu_paused(cpu);
+}
+
+/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -193,6 +223,8 @@ static void *sim_idle_trampoline(void *arg)
 
 void sim_cpu0_start(void)
 {
+  struct sigaction act;
+  sigset_t set;
   int ret;
 
   g_cpu_thread[0] = pthread_self();
@@ -215,7 +247,26 @@ void sim_cpu0_start(void)
 
   /* Register the common signal handler for all threads */
 
-  up_cpu_set_pause_handler(SIGUSR1);
+  act.sa_sigaction = sim_handle_signal;
+  act.sa_flags     = SA_SIGINFO;
+  sigemptyset(&act.sa_mask);
+
+  ret = sigaction(SIGUSR1, &act, NULL);
+  if (ret < 0)
+    {
+      return;
+    }
+
+  /* Make sure the SIGUSR1 is not masked */
+
+  sigemptyset(&set);
+  sigaddset(&set, SIGUSR1);
+
+  ret = pthread_sigmask(SIG_UNBLOCK, &set, NULL);
+  if (ret < 0)
+    {
+      return;
+    }
 }
 
 /****************************************************************************
diff --git a/arch/sim/src/sim/up_smpsignal.c b/arch/sim/src/sim/up_smpsignal.c
index 7417a87..0179bbc 100644
--- a/arch/sim/src/sim/up_smpsignal.c
+++ b/arch/sim/src/sim/up_smpsignal.c
@@ -47,32 +47,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: sim_cpupause_handler
- *
- * Description:
- *   This is the SIGUSR signal handler.  It implements the core logic of
- *   up_cpu_pause() on the thread of execution the simulated CPU.
- *
- * Input Parameters:
- *   irq - the interrupt number
- *   context  - not used
- *   arg      - not used
- *
- * Returned Value:
- *   In case of success OK (0) is returned otherwise a negative value.
- *
- ****************************************************************************/
-
-static int sim_cpupause_handler(int irq, FAR void *context, FAR void *arg)
-{
-  return up_cpu_paused(this_cpu());
-}
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -230,22 +204,3 @@ struct tcb_s *up_this_task(void)
 {
   return this_task();
 }
-
-/****************************************************************************
- * Name: up_cpu_set_pause_handler
- *
- * Description:
- *   Attach the CPU pause request interrupt to the NuttX logic.
- *
- * Input Parameters:
- *   irq - the SIGUSR1 interrupt number
- *
- * Returned Value:
- *   On success returns OK (0), otherwise a negative value.
- ****************************************************************************/
-
-int up_cpu_set_pause_handler(int irq)
-{
-  up_enable_irq(irq);
-  return irq_attach(irq, sim_cpupause_handler, NULL);
-}

Reply via email to