]> Zhao Yanbai Git Server - minix.git/commitdiff
Message type for PM_SIG{RETURN,SUSPEND,PROCMASK}
authorLionel Sambuc <lionel@minix3.org>
Tue, 13 May 2014 16:29:11 +0000 (18:29 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:42 +0000 (17:05 +0200)
Change-Id: Id20352db47892eb6b870ea64ba52b3b1a293cbaa

include/minix/callnr.h
include/minix/ipc.h
lib/libc/sys-minix/sigpending.c
lib/libc/sys-minix/sigprocmask.c
lib/libc/sys-minix/sigreturn.c
lib/libc/sys-minix/sigsuspend.c
servers/pm/signal.c

index 76c278d4b48b6e5bfc46db0b644d26da0701fb03..93da5ada7e1d809ea671b0f48bdf4cc1d26a31e3 100644 (file)
 #define PM_SIG_OACT            m1_p2   /* struct sigaction * */
 #define PM_SIG_RET             m1_p3   /* int (*)(void) */
 
-/* Field names for the remaining sigpending(2), sigprocmask(2), sigreturn(2),
- * sigsuspend(2) calls.
- */
-#define PM_SIG_HOW             m2_i1   /* int */
-#define PM_SIG_SET             m2_sigset /* sigset_t */
-#define PM_SIG_CTX             m2_p1   /* struct sigcontext * */
-
 /*===========================================================================*
  *                             Calls to VFS                                 *
  *===========================================================================*/
index 39ca32d9f8556d5bd197884f5d21478f5ee2a4cc..b3224d9edd8e297ad25e57e34af2b0e7e70a42fd 100644 (file)
@@ -251,6 +251,22 @@ typedef struct {
 } mess_lc_pm_sysuname;
 _ASSERT_MSG_SIZE(mess_lc_pm_sysuname);
 
+typedef struct {
+       int how;
+       vir_bytes ctx;
+       sigset_t set;
+
+       uint8_t padding[32];
+} mess_lc_pm_sigset;
+_ASSERT_MSG_SIZE(mess_lc_pm_sigset);
+
+typedef struct {
+       sigset_t set;
+
+       uint8_t padding[40];
+} mess_pm_lc_sigset;
+_ASSERT_MSG_SIZE(mess_pm_lc_sigset);
+
 typedef struct {
        time_t sec;
 
@@ -1093,6 +1109,7 @@ typedef struct {
                mess_lc_pm_reboot       m_lc_pm_reboot;
                mess_lc_pm_setgid       m_lc_pm_setgid;
                mess_lc_pm_setuid       m_lc_pm_setuid;
+               mess_lc_pm_sigset       m_lc_pm_sigset;
                mess_lc_pm_sysuname     m_lc_pm_sysuname;
                mess_lc_pm_time         m_lc_pm_time;
                mess_lc_pm_waitpid      m_lc_pm_waitpid;
@@ -1138,6 +1155,7 @@ typedef struct {
                mess_pm_lc_getpid       m_pm_lc_getpid;
                mess_pm_lc_getuid       m_pm_lc_getuid;
                mess_pm_lc_ptrace       m_pm_lc_ptrace;
+               mess_pm_lc_sigset       m_pm_lc_sigset;
                mess_pm_lc_time         m_pm_lc_time;
                mess_pm_lc_waitpid      m_pm_lc_waitpid;
 
index e851c92282197f343db25c623da9350437546cb3..01b8fffbf6a7d9e2bf57ad19ce9845680434a2d4 100644 (file)
@@ -12,7 +12,7 @@ sigset_t *set;
 
   memset(&m, 0, sizeof(m));
   if (_syscall(PM_PROC_NR, PM_SIGPENDING, &m) < 0) return(-1);
-  *set = m.PM_SIG_SET;
+  *set = m.m_pm_lc_sigset.set;
   return(m.m_type);
 }
 
index ee3f0edf5514faff014a4c83c14c59ea0e2b10cb..b1906d79038063a8a5eb04599a2ffb85ffce35fc 100644 (file)
@@ -18,14 +18,14 @@ sigset_t *oset;
 
   memset(&m, 0, sizeof(m));
   if (set == (sigset_t *) NULL) {
-       m.PM_SIG_HOW = SIG_INQUIRE;
-       sigemptyset(&m.PM_SIG_SET);
+       m.m_lc_pm_sigset.how = SIG_INQUIRE;
+       sigemptyset(&m.m_lc_pm_sigset.set);
   } else {
-       m.PM_SIG_HOW = how;
-       m.PM_SIG_SET = *set;
+       m.m_lc_pm_sigset.how = how;
+       m.m_lc_pm_sigset.set = *set;
   }
   if (_syscall(PM_PROC_NR, PM_SIGPROCMASK, &m) < 0) return(-1);
-  if (oset != (sigset_t *) NULL) *oset = m.PM_SIG_SET;
+  if (oset != NULL) *oset = m.m_pm_lc_sigset.set;
 
   return(m.m_type);
 }
index c2685e7f45eb4845440af329066750cbacf93ae0..f81a0ad5ca0d697b97aee0d2ced79ce83b25e1a9 100644 (file)
@@ -23,10 +23,10 @@ int sigreturn(struct sigcontext *scp)
 
   /* Protect against race conditions by blocking all interrupts. */
   sigfillset(&set);            /* splhi */
-  sigprocmask(SIG_SETMASK, &set, (sigset_t *) NULL);
+  sigprocmask(SIG_SETMASK, &set, NULL);
 
   memset(&m, 0, sizeof(m));
-  m.PM_SIG_SET = scp->sc_mask;
-  m.PM_SIG_CTX = (char *) scp;
+  m.m_lc_pm_sigset.set = scp->sc_mask;
+  m.m_lc_pm_sigset.ctx = (vir_bytes)scp;
   return(_syscall(PM_PROC_NR, PM_SIGRETURN, &m)); /* normally doesn't return */
 }
index abfdc8ff7e27dee9a6ba67b98aadfe11d6d9bff7..34a969521087bdf7164a3bab6bf18fd562031634 100644 (file)
@@ -11,7 +11,7 @@ const sigset_t *set;
   message m;
 
   memset(&m, 0, sizeof(m));
-  m.PM_SIG_SET = *set;
+  m.m_lc_pm_sigset.set = *set;
   return(_syscall(PM_PROC_NR, PM_SIGSUSPEND, &m));
 }
 
index 01623c13ddf6314a5fd4824afcab6499dc3a1023..054f69e9bce1c7bf3de66aa55c43899842a2bf9b 100644 (file)
@@ -92,7 +92,7 @@ int do_sigpending(void)
 {
   assert(!(mp->mp_flags & (PROC_STOPPED | VFS_CALL | UNPAUSED)));
 
-  mp->mp_reply.PM_SIG_SET = mp->mp_sigpending;
+  mp->mp_reply.m_pm_lc_sigset.set = mp->mp_sigpending;
   return OK;
 }
 
@@ -116,10 +116,10 @@ int do_sigprocmask(void)
 
   assert(!(mp->mp_flags & (PROC_STOPPED | VFS_CALL | UNPAUSED)));
 
-  set = m_in.PM_SIG_SET;
-  mp->mp_reply.PM_SIG_SET = mp->mp_sigmask;
+  set = m_in.m_lc_pm_sigset.set;
+  mp->mp_reply.m_pm_lc_sigset.set = mp->mp_sigmask;
 
-  switch (m_in.PM_SIG_HOW) {
+  switch (m_in.m_lc_pm_sigset.how) {
       case SIG_BLOCK:
        sigdelset(&set, SIGKILL);
        sigdelset(&set, SIGSTOP);
@@ -162,7 +162,7 @@ int do_sigsuspend(void)
   assert(!(mp->mp_flags & (PROC_STOPPED | VFS_CALL | UNPAUSED)));
 
   mp->mp_sigmask2 = mp->mp_sigmask;    /* save the old mask */
-  mp->mp_sigmask = m_in.PM_SIG_SET;
+  mp->mp_sigmask = m_in.m_lc_pm_sigset.set;
   sigdelset(&mp->mp_sigmask, SIGKILL);
   sigdelset(&mp->mp_sigmask, SIGSTOP);
   mp->mp_flags |= SIGSUSPENDED;
@@ -182,11 +182,11 @@ int do_sigreturn(void)
 
   assert(!(mp->mp_flags & (PROC_STOPPED | VFS_CALL | UNPAUSED)));
 
-  mp->mp_sigmask = m_in.PM_SIG_SET;
+  mp->mp_sigmask = m_in.m_lc_pm_sigset.set;
   sigdelset(&mp->mp_sigmask, SIGKILL);
   sigdelset(&mp->mp_sigmask, SIGSTOP);
 
-  r = sys_sigreturn(who_e, (struct sigmsg *) m_in.PM_SIG_CTX);
+  r = sys_sigreturn(who_e, (struct sigmsg *)m_in.m_lc_pm_sigset.ctx);
   check_pending(mp);
   return(r);
 }