]> Zhao Yanbai Git Server - minix.git/commitdiff
kernel: Extend the {sys,vm}_update() interfaces. 78/3078/2
authorCristiano Giuffrida <giuffrida@cs.vu.nl>
Sun, 2 Mar 2014 00:15:08 +0000 (01:15 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Wed, 16 Sep 2015 11:01:47 +0000 (11:01 +0000)
Change-Id: I9ada3c04c08d219b198e9081f4e1942b11c722f6

minix/include/minix/com.h
minix/include/minix/ipc.h
minix/include/minix/syslib.h
minix/include/minix/vm.h
minix/kernel/system/do_update.c
minix/lib/libsys/sef.c
minix/lib/libsys/sys_update.c
minix/lib/libsys/vm_update.c
minix/servers/rs/manager.c
minix/servers/vm/rs.c

index 2b2d33bf9e1193a68059ca9d4d21e114e6c0e3b2..2082eb59dcf67bd3380bb26d304d45a21bb1031b 100644 (file)
 /* Field names for SYS_UPDATE. */
 #define SYS_UPD_SRC_ENDPT      m1_i1   /* source endpoint */
 #define SYS_UPD_DST_ENDPT      m1_i2   /* destination endpoint */
+#define SYS_UPD_FLAGS          m1_i3   /* update flags */
+#  define SYS_UPD_ROLLBACK        0x1  /* update is rollback */
+
 
 /* Subfunctions for SYS_STATECTL */
 #define SYS_STATE_CLEAR_IPC_REFS    1  /* clear IPC references */
index 2515a5f5575368a2fe76773c714e25d755bb80c6..97a42221d800aef26695b8718824ee620a8a3300 100644 (file)
@@ -1377,7 +1377,8 @@ _ASSERT_MSG_SIZE(mess_lsys_vm_unmap_phys);
 typedef struct {
        endpoint_t src;
        endpoint_t dst;
-       uint8_t         padding[48];
+       int flags;
+       uint8_t         padding[44];
 } mess_lsys_vm_update;
 _ASSERT_MSG_SIZE(mess_lsys_vm_update);
 
index 9b783fe0bfa4450c550ce9ad435b39e782a9bb0d..37b3f0f5acd97b48ab6864a14d88e12c50f1555a 100644 (file)
@@ -48,7 +48,7 @@ int sys_schedctl(unsigned flags, endpoint_t proc_ep, int priority, int
 #define sys_resume(proc_ep) sys_runctl(proc_ep, RC_RESUME, 0)
 int sys_runctl(endpoint_t proc_ep, int action, int flags);
 
-int sys_update(endpoint_t src_ep, endpoint_t dst_ep);
+int sys_update(endpoint_t src_ep, endpoint_t dst_ep, int flags);
 int sys_statectl(int request, void* address, int length);
 int sys_privctl(endpoint_t proc_ep, int req, void *p);
 int sys_privquery_mem(endpoint_t proc_ep, phys_bytes physstart,
index b8a1c399ed967d6ea1c8388ec9636ed514c6d37f..9761502a53572070243e60e5d316f09a59b3a9af 100644 (file)
@@ -17,7 +17,7 @@ int vm_unmap_phys(endpoint_t who, void *vaddr, size_t len);
 
 int vm_notify_sig(endpoint_t ep, endpoint_t ipc_ep);
 int vm_set_priv(endpoint_t ep, void *buf, int sys_proc);
-int vm_update(endpoint_t src_e, endpoint_t dst_e);
+int vm_update(endpoint_t src_e, endpoint_t dst_e, int flags);
 int vm_memctl(endpoint_t ep, int req);
 int vm_query_exit(endpoint_t *endpt);
 int vm_watch_exit(endpoint_t ep);
index d0f7ceb9083e5b514fc21cf0fdd99e1682d03858..36559156e2eb175ddae0c4cf0d5c33ac84dd6de9 100644 (file)
@@ -4,6 +4,7 @@
  * The parameters for this kernel call are:
  *    m2_i1:   SYS_UPD_SRC_ENDPT       (source process endpoint)
  *    m2_i2:   SYS_UPD_DST_ENDPT       (destination process endpoint)
+ *    m2_i3:   SYS_UPD_FLAGS           (update flags)
  */
 
 #include "kernel/system.h"
index 2033f1a895a03099ca31899c13242b8ff1d53639..119e8e8016a7fcab4eb46e6d82b1be214b90defb 100644 (file)
@@ -59,6 +59,7 @@ void sef_startup()
   endpoint_t old_endpoint;
   int priv_flags;
   int init_flags;
+  int sys_upd_flags = 0;
 
   /* Get information about self. */
   r = sys_whoami(&sef_self_endpoint, sef_self_name, SEF_SELF_NAME_MAXLEN,
@@ -72,7 +73,7 @@ void sef_startup()
 #if USE_LIVEUPDATE
   /* RS may wake up with the wrong endpoint, perfom the update in that case. */
   if((sef_self_priv_flags & ROOT_SYS_PROC) && sef_self_endpoint != RS_PROC_NR) {
-      r = vm_update(RS_PROC_NR, sef_self_endpoint);
+      r = vm_update(RS_PROC_NR, sef_self_endpoint, sys_upd_flags);
       if(r != OK) {
           panic("unable to update RS from instance %d to %d: %d",
               RS_PROC_NR, sef_self_endpoint, r);
index c93845b62bf6ad0686793d0e4494f5aae45937ac..86274628f12ad09846fbb3c847b21ff42b13f357 100644 (file)
@@ -1,11 +1,12 @@
 #include "syslib.h"
 
-int sys_update(endpoint_t src_ep, endpoint_t dst_ep)
+int sys_update(endpoint_t src_ep, endpoint_t dst_ep, int flags)
 {
   message m;
 
   m.SYS_UPD_SRC_ENDPT = src_ep;
   m.SYS_UPD_DST_ENDPT = dst_ep;
+  m.SYS_UPD_FLAGS = flags;
 
   return _kernel_call(SYS_UPDATE, &m);
 }
index c51cb0120f6bca0928469eeeddbd4bec914e7a7a..a8635ac93df71dbf7bf0e505e1c81313cdbba5a3 100644 (file)
@@ -4,13 +4,14 @@
 #include <string.h>
 
 int
-vm_update(endpoint_t src_e, endpoint_t dst_e)
+vm_update(endpoint_t src_e, endpoint_t dst_e, int flags)
 {
        message m;
 
        memset(&m, 0, sizeof(m));
        m.m_lsys_vm_update.src = src_e;
        m.m_lsys_vm_update.dst = dst_e;
+       m.m_lsys_vm_update.flags = flags;
 
        return _taskcall(VM_PROC_NR, VM_RS_UPDATE, &m);
 }
index 57b8b8a3501293626823b033c81538acdbd616bd..9fb6e2702e7649e6363d05bcc2620eb8139b3971 100644 (file)
@@ -218,6 +218,7 @@ void build_cmd_dep(struct rproc *rp)
 int srv_update(endpoint_t src_e, endpoint_t dst_e)
 {
   int r;
+  int sys_upd_flags = 0;
 
   /* Ask VM to swap the slots of the two processes and tell the kernel to
    * do the same. If VM is the service being updated, only perform the kernel
@@ -225,10 +226,10 @@ int srv_update(endpoint_t src_e, endpoint_t dst_e)
    * initialization time.
    */
   if(src_e != VM_PROC_NR) {
-      r = vm_update(src_e, dst_e);
+      r = vm_update(src_e, dst_e, sys_upd_flags);
   }
   else {
-      r = sys_update(src_e, dst_e);
+      r = sys_update(src_e, dst_e, sys_upd_flags);
   }
 
   return r;
index 5d9971538a8e2b931d39c4725c80470faec00d05..064f8de879292c239e73eaa5869b415a6243c592 100644 (file)
@@ -14,6 +14,7 @@
 #include <minix/syslib.h>
 #include <minix/safecopies.h>
 #include <minix/bitmap.h>
+#include <minix/rs.h>
 
 #include <errno.h>
 #include <string.h>
@@ -71,10 +72,11 @@ int do_rs_update(message *m_ptr)
        endpoint_t src_e, dst_e, reply_e;
        int src_p, dst_p;
        struct vmproc *src_vmp, *dst_vmp;
-       int r;
+       int r, sys_upd_flags;
 
        src_e = m_ptr->m_lsys_vm_update.src;
        dst_e = m_ptr->m_lsys_vm_update.dst;
+        sys_upd_flags = m_ptr->m_lsys_vm_update.flags;
 
        /* Lookup slots for source and destination process. */
        if(vm_isokendpt(src_e, &src_p) != OK) {
@@ -89,7 +91,8 @@ int do_rs_update(message *m_ptr)
        dst_vmp = &vmproc[dst_p];
 
        /* Let the kernel do the update first. */
-       r = sys_update(src_e, dst_e);
+       r = sys_update(src_e, dst_e,
+           sys_upd_flags & SF_VM_ROLLBACK ? SYS_UPD_ROLLBACK : 0);
        if(r != OK) {
                return r;
        }