]> Zhao Yanbai Git Server - minix.git/commitdiff
For common calls, give servers unique call numbers
authorDavid van Moolenbroek <david@minix3.org>
Mon, 28 Oct 2013 21:30:41 +0000 (22:30 +0100)
committerLionel Sambuc <lionel@minix3.org>
Sat, 1 Mar 2014 08:05:00 +0000 (09:05 +0100)
The getsysinfo(2), getrusage(2), and svrctl(2) calls used the same
call number to different services. Since we want to give each service
its own call number ranges, this is no longer tenable. This patch
introduces per-service call numbers for these calls.

Note that the remainder of the COMMON_ range is left intact, as these
the remaining requests in it are processed by SEF and thus server-
agnostic. The range should really be prefixed with SEF_ now.

Change-Id: I80d728bbeb98227359c525494c433965b40fefc3

14 files changed:
commands/svrctl/svrctl.c
include/minix/callnr.h
include/minix/com.h
lib/libc/sys-minix/getrusage.c
lib/libminlib/svrctl.c
lib/libsys/getsysinfo.c
servers/ds/main.c
servers/pm/main.c
servers/pm/table.c
servers/rs/main.c
servers/vfs/main.c
servers/vfs/misc.c
servers/vfs/proto.h
servers/vfs/table.c

index 6338281c368efc1dce81db444fdd36869c66cf55..a481eabc18ddd7969d1245a36ba3245eab0de05f 100644 (file)
@@ -18,10 +18,9 @@ static char *bin_name;
 
 int main (int argc, char *argv[])
 {
-  int r, param;
+  int param;
   endpoint_t proc_e = NONE;
   struct sysgetenv sysgetenv;
-  message m;
   char *to_whom, *operation, *what, *value;
   unsigned i;
 
@@ -60,10 +59,7 @@ int main (int argc, char *argv[])
        else
                usage();
 
-       m.m2_i1 = param;
-       m.m2_p1 = (char *) &sysgetenv;
-       r = _syscall(proc_e, SVRCTL, &m);
-       if (r != 0) {
+       if (svrctl(param, &sysgetenv) != 0) {
                if (errno == ESRCH)
                        fprintf(stderr, "invalid parameter: %s\n", what);
                else if (errno == EINVAL)
@@ -87,10 +83,7 @@ int main (int argc, char *argv[])
        else
                usage();
 
-       m.m2_i1 = param;
-       m.m2_p1 = (char *) &sysgetenv;
-       r = _syscall(proc_e, SVRCTL, &m);
-       if (r != 0) {
+       if (svrctl(param, &sysgetenv) != 0) {
                if (errno == ESRCH)
                        fprintf(stderr, "invalid parameter: %s\n", what);
                else
index 9914aafa84a220f6d32a9c90b3cca7d57908d9a0..32c5c3a349b2002a82378ce86a9761436f7e29fa 100644 (file)
@@ -1,4 +1,4 @@
-#define NCALLS          125    /* number of system calls allowed */
+#define NCALLS          129    /* number of system calls allowed */
 
 /* In case it isn't obvious enough: this list is sorted numerically. */
 #define EXIT              1 
@@ -66,7 +66,7 @@
 #define SIGRETURN        75
 
 #define REBOOT           76
-#define SVRCTL           77
+#define PM_SVRCTL        77    /* to PM */
 #define SYSUNAME         78
 #define LLSEEK           81    /* to VFS */
 #define GETVFSSTAT       82    /* to VFS */
 #define VFS_VMCALL     117
 
 #define MAPDRIVER      122     /* to VFS, map a device */
-#define GETRUSAGE      123     /* to PM, VFS */
+#define PM_GETRUSAGE   123     /* to PM */
 
 #define VFS_CHECKPERMS 124     /* to VFS */
+
+#define PM_GETSYSINFO  125     /* to PM */
+#define VFS_GETSYSINFO 126     /* to VFS */
+#define VFS_GETRUSAGE  127     /* to VFS */
+#define VFS_SVRCTL     128     /* to VFS */
index 1638dc568c2cb2581c7cfd36cc03993ecc5538ec..c24df0c70ecdf6ef26092423190b7bf190f45aa7 100644 (file)
 
 #define RS_LOOKUP      (RS_RQ_BASE + 8)        /* lookup server name */
 
+#define RS_GETSYSINFO  (RS_RQ_BASE + 9)        /* get system information */
+
 #define RS_INIT        (RS_RQ_BASE + 20)       /* service init message */
 #define RS_LU_PREPARE  (RS_RQ_BASE + 21)       /* prepare to update message */
 
 #define DS_DELETE      (DS_RQ_BASE + 4)        /* delete data */
 #define DS_SNAPSHOT    (DS_RQ_BASE + 5)        /* take a snapshot */
 #define DS_RETRIEVE_LABEL  (DS_RQ_BASE + 6)    /* retrieve label's name */
+#define DS_GETSYSINFO  (DS_RQ_BASE + 7)        /* get system information */
 
 /* DS field names */
 #  define DS_KEY_GRANT         m2_i1           /* key for the data */
 #      define GCOV_BUFF_P  m1_p1
 #      define GCOV_BUFF_SZ m1_i1
 
-/* Common request to several system servers: retrieve system information. */
-#define COMMON_GETSYSINFO      (COMMON_RQ_BASE+2)
-#      define SI_WHAT          m1_i1
-#      define SI_WHERE         m1_p1
-#      define SI_SIZE          m1_i2
+/* Field names for the getsysinfo(2) call. */
+#define SI_WHAT                        m1_i1
+#define SI_WHERE               m1_p1
+#define SI_SIZE                        m1_i2
 
 /* PM field names */
 /* BRK */
index 271eb241bf7ec0e21c31c5a0787b01a0b6170832..6c983d778f7323ac4eb6f525e5727fbd93ec1f10 100644 (file)
@@ -22,10 +22,10 @@ int getrusage(int who, struct rusage *r_usage)
        }
 
        memset(r_usage, 0, sizeof(struct rusage));
-       if ((rc = _syscall(PM_PROC_NR, GETRUSAGE, &m)) < 0)
+       if ((rc = _syscall(PM_PROC_NR, PM_GETRUSAGE, &m)) < 0)
                return rc;
        m.RU_RUSAGE_ADDR = r_usage;
-       if ((rc = _syscall(VFS_PROC_NR, GETRUSAGE, &m)) < 0)
+       if ((rc = _syscall(VFS_PROC_NR, VFS_GETRUSAGE, &m)) < 0)
                return rc;
        m.RU_RUSAGE_ADDR = r_usage;
        return _syscall(VM_PROC_NR, VM_GETRUSAGE, &m);
index 6d4578c56c16a95b4914188ebf155b00257a797a..e0f43948fb5afd7aac6ee6f6d931c9c630b6db64 100644 (file)
@@ -16,11 +16,11 @@ int svrctl(int request, void *argp)
        case 'M':
        case 'S':
                /* PM handles calls for itself and the kernel. */
-               return _syscall(PM_PROC_NR, SVRCTL, &m);
+               return _syscall(PM_PROC_NR, PM_SVRCTL, &m);
        case 'F':
        case 'I':
                /* VFS handles calls for itself and inet. */
-               return _syscall(VFS_PROC_NR, SVRCTL, &m);
+               return _syscall(VFS_PROC_NR, VFS_SVRCTL, &m);
        default:
                errno = EINVAL;
                return -1;
index 27d0ff3e8242179a3b85a8c21df2b780478afea0..a5a4fbc7d5b783883baa929930cbc272a3f0818e 100644 (file)
@@ -1,5 +1,6 @@
 
 #include "syslib.h"
+
 #include <string.h>
 #include <minix/sysinfo.h>
 #include <minix/com.h>
@@ -12,9 +13,20 @@ int getsysinfo(
 )
 {
   message m;
+  int call_nr;
+
+  switch (who) {
+  case PM_PROC_NR: call_nr = PM_GETSYSINFO; break;
+  case VFS_PROC_NR: call_nr = VFS_GETSYSINFO; break;
+  case RS_PROC_NR: call_nr = RS_GETSYSINFO; break;
+  case DS_PROC_NR: call_nr = DS_GETSYSINFO; break;
+  default:
+       return ENOSYS;
+  }
+
   memset(&m, 0, sizeof(m));
   m.SI_WHAT = what;
   m.SI_WHERE = where;
   m.SI_SIZE = size;
-  return _taskcall(who, COMMON_GETSYSINFO, &m);
+  return _taskcall(who, call_nr, &m);
 }
index a135f8f905559d9b568ab5bbf83159604391ddf4..1d684dcf875232d082d2849c6ff641e766b930b8 100644 (file)
@@ -69,7 +69,7 @@ int main(int argc, char **argv)
       case DS_CHECK:
          result = do_check(&m);
          break;
-      case COMMON_GETSYSINFO:
+      case DS_GETSYSINFO:
          result = do_getsysinfo(&m);
          break;
       default: 
index 141333692622e366c5bb4132e0f3711c3eecfdab..6f1e03810b40ced8ad3a7acde36f470f47022cfd 100644 (file)
@@ -116,9 +116,6 @@ int main()
                else
                        result= ENOSYS;
                break;
-       case COMMON_GETSYSINFO:
-               result = do_getsysinfo();
-               break;
        default:
                /* Else, if the system call number is valid, perform the
                 * call.
index b84c1ff445567ee9297684e95b589680f4f41d80..d352b18b1f852fc20b8926404d765e88f2fb7e3a 100644 (file)
@@ -88,7 +88,7 @@ int (*call_vec[])(void) = {
        do_sigprocmask, /* 74 = sigprocmask */
        do_sigreturn,   /* 75 = sigreturn   */
        do_reboot,      /* 76 = reboot  */
-       do_svrctl,      /* 77 = svrctl  */
+       do_svrctl,      /* 77 = pm_svrctl */
        do_sysuname,    /* 78 = sysuname */
        no_sys,         /* 79 = unused */
        no_sys,         /* 80 = (getdents) */
@@ -134,8 +134,12 @@ int (*call_vec[])(void) = {
        no_sys,         /* 120 = unsused */
        no_sys,         /* 121 = (task reply) */
        no_sys,         /* 122 = (map driver ) */
-       do_getrusage,   /* 123 = getrusage */
+       do_getrusage,   /* 123 = pm_getrusage */
        no_sys,         /* 124 = (checkperms) */
+       do_getsysinfo,  /* 125 = pm_getsysinfo */
+       no_sys,         /* 126 = (vfs_getsysinfo) */
+       no_sys,         /* 127 = (vfs_getrusage) */
+       no_sys,         /* 128 = (vfs_svrctl) */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index 5b1ddcc4c0d51ea3a436517972eb2beaec401080..7488b43667936a563e3ed7ed952262f98beb8fdb 100644 (file)
@@ -93,15 +93,6 @@ int main(void)
        * Handle the request and send a reply to the caller. 
        */
       else {
-         if (call_nr != COMMON_GETSYSINFO && 
-               (call_nr < RS_RQ_BASE || call_nr >= RS_RQ_BASE+0x100))
-         {
-               /* Ignore invalid requests. Do not try to reply. */
-               printf("RS: warning: got invalid request %d from endpoint %d\n",
-                       call_nr, m.m_source);
-               continue;
-         }
-
           /* Handler functions are responsible for permission checking. */
           switch(call_nr) {
           /* User requests. */
@@ -113,8 +104,7 @@ int main(void)
           case RS_UPDATE:      result = do_update(&m);         break;
           case RS_CLONE:       result = do_clone(&m);          break;
           case RS_EDIT:        result = do_edit(&m);           break;
-          case COMMON_GETSYSINFO: 
-                               result = do_getsysinfo(&m);     break;
+          case RS_GETSYSINFO:  result = do_getsysinfo(&m);     break;
          case RS_LOOKUP:       result = do_lookup(&m);         break;
          /* Ready messages. */
          case RS_INIT:         result = do_init_ready(&m);     break;
@@ -122,7 +112,7 @@ int main(void)
           default: 
               printf("RS: warning: got unexpected request %d from %d\n",
                   m.m_type, m.m_source);
-              result = EINVAL;
+              result = ENOSYS;
           }
 
           /* Finally send reply message, unless disabled. */
index d99f39ec3109ff688f6d99cb53b0ff793bdf671e..c8433ca45cb8908323519720dcefe2e82554db10 100644 (file)
@@ -233,27 +233,23 @@ static void do_work(void)
 
   memset(&m_out, 0, sizeof(m_out));
 
-  if (job_call_nr == COMMON_GETSYSINFO) {
-       error = do_getsysinfo();
+  /* At this point we assume that we're dealing with a call that has been
+   * made specifically to VFS. Typically it will be a POSIX call from a
+   * normal process, but we also handle a few calls made by drivers such
+   * such as UDS and VND through here. Call the internal function that
+   * does the work.
+   */
+  if (job_call_nr < 0 || job_call_nr >= NCALLS) {
+       error = ENOSYS;
+  } else if (fp->fp_pid == PID_FREE) {
+       /* Process vanished before we were able to handle request.
+        * Replying has no use. Just drop it. */
+       error = SUSPEND;
   } else {
-       /* At this point we assume that we're dealing with a call that has been
-        * made specifically to VFS. Typically it will be a POSIX call from a
-        * normal process, but we also handle a few calls made by drivers such
-        * such as UDS and VND through here. Call the internal function that
-        * does the work.
-        */
-       if (job_call_nr < 0 || job_call_nr >= NCALLS) {
-               error = ENOSYS;
-       } else if (fp->fp_pid == PID_FREE) {
-               /* Process vanished before we were able to handle request.
-                * Replying has no use. Just drop it. */
-               error = SUSPEND;
-       } else {
 #if ENABLE_SYSCALL_STATS
-               calls_stats[job_call_nr]++;
+       calls_stats[job_call_nr]++;
 #endif
-               error = (*call_vec[job_call_nr])(&m_out);
-       }
+       error = (*call_vec[job_call_nr])(&m_out);
   }
 
   /* Copy the results back to the user and send reply. */
index 81e2df697ed8c56f8ef98337cc64a6817776765f..058abb3245ea072986ce8ec9c46ea275a149f8d7 100644 (file)
@@ -51,7 +51,7 @@ static void free_proc(int flags);
 /*===========================================================================*
  *                             do_getsysinfo                                *
  *===========================================================================*/
-int do_getsysinfo()
+int do_getsysinfo(message *UNUSED(m_out))
 {
   vir_bytes src_addr, dst_addr;
   size_t len, buf_size;
index 06e873b0d1dc7d44c2c371459e07ab0d45ea2a82..89f8b2c3f40cc84b92a769013cc925dab7ab544f 100644 (file)
@@ -115,7 +115,7 @@ int do_sync(message *m_out);
 int do_fsync(message *m_out);
 void pm_reboot(void);
 int do_svrctl(message *m_out);
-int do_getsysinfo(void);
+int do_getsysinfo(message *m_out);
 int do_vm_call(message *m_out);
 int pm_dumpcore(int sig, vir_bytes exe_name);
 void ds_event(void);
index 9a8beb285e97393ee2cb3d77d8cfbf328eecef7c..1abf53e9bc6f68b18461b51e85f51fc98758430b 100644 (file)
@@ -91,7 +91,7 @@ int (*call_vec[])(message *m_out) = {
        no_sys,         /* 74 = (sigprocmask) */
        no_sys,         /* 75 = (sigreturn) */
        no_sys,         /* 76 = (reboot) */
-       do_svrctl,      /* 77 = svrctl */
+       no_sys,         /* 77 = (pm_svrctl) */
        no_sys,         /* 78 = (sysuname) */
        no_sys,         /* 79 = unused */
        no_sys,         /* 80 = unused */
@@ -137,8 +137,12 @@ int (*call_vec[])(message *m_out) = {
        no_sys,         /* 120 = unsused */
        no_sys,         /* 121 = (task reply) */
        do_mapdriver,   /* 122 = mapdriver */
-       do_getrusage,   /* 123 = getrusage */
+       no_sys,         /* 123 = (pm_getrusage) */
        do_checkperms,  /* 124 = checkperms */
+       no_sys,         /* 125 = (pm_getsysinfo) */
+       do_getsysinfo,  /* 126 = vfs_getsysinfo */
+       do_getrusage,   /* 127 = vfs_getrusage */
+       do_svrctl,      /* 128 = vfs_svrctl */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];