]> Zhao Yanbai Git Server - minix.git/commitdiff
VBOX: update current time immediately at startup 05/3405/1
authorDavid van Moolenbroek <david@minix3.org>
Mon, 20 Feb 2017 19:13:04 +0000 (19:13 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Wed, 22 Feb 2017 17:18:12 +0000 (17:18 +0000)
Performing the update at any later time may cause rc scripts to work
with a wrong date, which may have side effects, such as databse files
getting regenerated on every boot.

Change-Id: Idfdbf67ad285300c982d95769007dc88c522b908

minix/drivers/vmm_guest/vbox/vbox.c

index 346c96eb11f76f60ac33ac9108c2c30aeeab82b7..95896f5d2b62f1ec91d443434d04807a74ea2b9e 100644 (file)
@@ -53,6 +53,33 @@ int vbox_request(struct VMMDevRequestHeader *header, phys_bytes addr,
        return header->result;
 }
 
+/*===========================================================================*
+ *                             vbox_update_time                             *
+ *===========================================================================*/
+static void vbox_update_time(void)
+{
+       /* Update the current time if it has drifted too far. */
+       struct VMMDevReqHostTime *req;
+       time_t otime, ntime;
+
+       req = (struct VMMDevReqHostTime *) vir_ptr;
+
+       if (vbox_request(&req->header, phys_ptr, VMMDEV_REQ_HOSTTIME,
+                       sizeof(*req)) == VMMDEV_ERR_OK) {
+               time(&otime);                           /* old time */
+
+               ntime = req->time / 1000;               /* new time */
+
+               /* Make time go forward, if the difference exceeds the drift
+                * threshold. Never make time go backward.
+                */
+               if ((ntime - otime) >= drift)
+                       stime(&ntime);
+       }
+
+       sys_setalarm(ticks, 0);
+}
+
 /*===========================================================================*
  *                             vbox_init                                    *
  *===========================================================================*/
@@ -111,7 +138,11 @@ static int vbox_init(int UNUSED(type), sef_init_info_t *UNUSED(info))
 
        ticks = sys_hz() * interval;
 
-       sys_setalarm(ticks, 0);
+       /*
+        * Do the first time update immediately.  If the time changes
+        * significantly, there may otherwise be interference with rc scripts.
+        */
+       vbox_update_time();
 
        return OK;
 }
@@ -147,33 +178,6 @@ static void vbox_intr(void)
                panic("unable to reenable IRQ: %d", r);
 }
 
-/*===========================================================================*
- *                             vbox_update_time                             *
- *===========================================================================*/
-static void vbox_update_time(void)
-{
-       /* Update the current time if it has drifted too far. */
-       struct VMMDevReqHostTime *req;
-       time_t otime, ntime;
-
-       req = (struct VMMDevReqHostTime *) vir_ptr;
-
-       if (vbox_request(&req->header, phys_ptr, VMMDEV_REQ_HOSTTIME,
-                       sizeof(*req)) == VMMDEV_ERR_OK) {
-               time(&otime);                           /* old time */
-
-               ntime = req->time / 1000;               /* new time */
-
-               /* Make time go forward, if the difference exceeds the drift
-                * threshold. Never make time go backward.
-                */
-               if ((ntime - otime) >= drift)
-                       stime(&ntime);
-       }
-
-       sys_setalarm(ticks, 0);
-}
-
 /*===========================================================================*
  *                             vbox_signal                                  *
  *===========================================================================*/