]> Zhao Yanbai Git Server - minix.git/commitdiff
Message type for SYS_FORK
authorLionel Sambuc <lionel@minix3.org>
Mon, 26 May 2014 09:42:00 +0000 (11:42 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:49 +0000 (17:05 +0200)
Change-Id: Ibcf4fdfec51129b2be3d667ec07aea0f42e3fd89

include/minix/com.h
include/minix/ipc.h
kernel/system/do_fork.c
lib/libsys/sys_fork.c

index 3516d0be42c2ed4f0d4bc949c5cf64202c6b4c3c..13c27237a2ce8bcda4b54810f992cb487e7792eb 100644 (file)
 #define PR_NAME_PTR     m1_p2  /* tells where program name is for dmp */
 #define PR_IP_PTR       m1_p3  /* initial value for ip after exec */
 #define PR_PS_STR_PTR   m1_p4  /* pointer to ps_strings, expected by __start */
-#define PR_FORK_FLAGS  m1_i3   /* optional flags for fork operation */
-#define PR_FORK_MSGADDR m1_p1  /* reply message address of forked child */
 
 /* Constants for exec. FIXME: these do not belong here. */
 #define PMEF_AUXVECTORS        20
index f11364aebc8b749ab6c7db69b3f1eb1daf5db44e..62fa2174be72cb3050c42007388f4c5fd807e3af 100644 (file)
@@ -719,6 +719,23 @@ typedef struct {
 } mess_lsys_krn_sys_copy;
 _ASSERT_MSG_SIZE(mess_lsys_krn_sys_copy);
 
+typedef struct {
+       endpoint_t endpt;
+       endpoint_t slot;
+       uint32_t flags;
+
+       uint8_t padding[44];
+} mess_lsys_krn_sys_fork;
+_ASSERT_MSG_SIZE(mess_lsys_krn_sys_fork);
+
+typedef struct {
+       endpoint_t endpt;
+       vir_bytes msgaddr;
+
+       uint8_t padding[48];
+} mess_krn_lsys_sys_fork;
+_ASSERT_MSG_SIZE(mess_krn_lsys_sys_fork);
+
 typedef struct {
        int request;
        endpoint_t endpt;
@@ -1582,6 +1599,7 @@ typedef struct {
                mess_sigcalls           m_sigcalls;
 
                mess_krn_lsys_schedule  m_krn_lsys_schedule;
+               mess_krn_lsys_sys_fork m_krn_lsys_sys_fork;
                mess_krn_lsys_sys_getwhoami m_krn_lsys_sys_getwhoami;
                mess_krn_lsys_sys_irqctl m_krn_lsys_sys_irqctl;
                mess_krn_lsys_sys_times m_krn_lsys_sys_times;
@@ -1666,6 +1684,7 @@ typedef struct {
                mess_lsys_krn_schedule  m_lsys_krn_schedule;
                mess_lsys_krn_sys_abort m_lsys_krn_sys_abort;
                mess_lsys_krn_sys_copy  m_lsys_krn_sys_copy;
+               mess_lsys_krn_sys_fork  m_lsys_krn_sys_fork;
                mess_lsys_krn_sys_getinfo m_lsys_krn_sys_getinfo;
                mess_lsys_krn_sys_getmcontext m_lsys_krn_sys_getmcontext;
                mess_lsys_krn_sys_iopenable m_lsys_krn_sys_iopenable;
index 49a9424cd19032fbfd3dd1dc16d7168f79eea28d..3873a2a2cff46a21901d4517a2dfb7cc68f4fed5 100644 (file)
@@ -2,10 +2,11 @@
  *   m_type:   SYS_FORK
  *
  * The parameters for this kernel call are:
- *    m1_i1:   PR_ENDPT        (parent, process that forked)
- *    m1_i2:   PR_SLOT         (child's process table slot)
- *    m1_p1:   PR_MEM_PTR      (new memory map for the child)
- *    m1_i3:   PR_FORK_FLAGS   (fork flags)
+ *   m_lsys_krn_sys_fork.endpt         (parent, process that forked)
+ *   m_lsys_krn_sys_fork.slot          (child's process table slot)
+ *   m_lsys_krn_sys_fork.flags         (fork flags)
+ *   m_krn_lsys_sys_fork.endpt         (endpoint of the child)
+ *   m_krn_lsys_sys_fork.msgaddr       (new memory map for the child)
  */
 
 #include "kernel/system.h"
  *===========================================================================*/
 int do_fork(struct proc * caller, message * m_ptr)
 {
-/* Handle sys_fork().  PR_ENDPT has forked.  The child is PR_SLOT. */
+/* Handle sys_fork().
+ * m_lsys_krn_sys_fork.endpt has forked.
+ * The child is m_lsys_krn_sys_fork.slot.
+ */
 #if defined(__i386__)
   char *old_fpu_save_area_p;
 #endif
@@ -34,11 +38,11 @@ int do_fork(struct proc * caller, message * m_ptr)
   int p_proc;
   int namelen;
 
-  if(!isokendpt(m_ptr->PR_ENDPT, &p_proc))
+  if(!isokendpt(m_ptr->m_lsys_krn_sys_fork.endpt, &p_proc))
        return EINVAL;
 
   rpp = proc_addr(p_proc);
-  rpc = proc_addr(m_ptr->PR_SLOT);
+  rpc = proc_addr(m_ptr->m_lsys_krn_sys_fork.slot);
   if (isemptyp(rpp) || ! isemptyp(rpc)) return(EINVAL);
 
   assert(!(rpp->p_misc_flags & MF_DELIVERMSG));
@@ -64,7 +68,7 @@ int do_fork(struct proc * caller, message * m_ptr)
 #endif
   if(++gen >= _ENDPOINT_MAX_GENERATION)        /* increase generation */
        gen = 1;                        /* generation number wraparound */
-  rpc->p_nr = m_ptr->PR_SLOT;          /* this was obliterated by copy */
+  rpc->p_nr = m_ptr->m_lsys_krn_sys_fork.slot; /* this was obliterated by copy */
   rpc->p_endpoint = _ENDPOINT(gen, rpc->p_nr); /* new endpoint of slot */
 
   rpc->p_reg.retreg = 0;       /* child sees pid = 0 to know it is child */
@@ -102,11 +106,11 @@ int do_fork(struct proc * caller, message * m_ptr)
   }
 
   /* Calculate endpoint identifier, so caller knows what it is. */
-  m_ptr->PR_ENDPT = rpc->p_endpoint;
-  m_ptr->PR_FORK_MSGADDR = (char *) rpp->p_delivermsg_vir;
+  m_ptr->m_krn_lsys_sys_fork.endpt = rpc->p_endpoint;
+  m_ptr->m_krn_lsys_sys_fork.msgaddr = rpp->p_delivermsg_vir;
 
   /* Don't schedule process in VM mode until it has a new pagetable. */
-  if(m_ptr->PR_FORK_FLAGS & PFF_VMINHIBIT) {
+  if(m_ptr->m_lsys_krn_sys_fork.flags & PFF_VMINHIBIT) {
        RTS_SET(rpc, RTS_VMINHIBIT);
   }
 
@@ -128,4 +132,3 @@ int do_fork(struct proc * caller, message * m_ptr)
 }
 
 #endif /* USE_FORK */
-
index 811e2301d1699be7c8451c5c6ae72903a6561b2c..4eab41fa97f9abc9d8f7250c0e8cba2e117c28e3 100644 (file)
@@ -12,11 +12,11 @@ vir_bytes *msgaddr;
   message m;
   int r;
 
-  m.PR_ENDPT = parent;
-  m.PR_SLOT = child;
-  m.PR_FORK_FLAGS = flags;
+  m.m_lsys_krn_sys_fork.endpt = parent;
+  m.m_lsys_krn_sys_fork.slot = child;
+  m.m_lsys_krn_sys_fork.flags = flags;
   r = _kernel_call(SYS_FORK, &m);
-  *child_endpoint = m.PR_ENDPT;
-  *msgaddr = (vir_bytes) m.PR_FORK_MSGADDR;
+  *child_endpoint = m.m_krn_lsys_sys_fork.endpt;
+  *msgaddr = m.m_krn_lsys_sys_fork.msgaddr;
   return r;
 }