]> Zhao Yanbai Git Server - minix.git/commitdiff
Message type for PM_ time-related calls
authorLionel Sambuc <lionel@minix3.org>
Mon, 12 May 2014 21:40:11 +0000 (23:40 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:35 +0000 (17:05 +0200)
 - Message type for PM_CLOCK_SETTIME, PM_CLOCK_GETTIME,
   PM_CLOCK_GETRES, PM_GETTIMEOFDAY, PM_SETTIME.

 - Small adaptation, message only transfert sub-second time in
   nanoseconds, instead of both nano- and micro-seconds. Conversion
   is done in userland, as required.

Change-Id: Ie4a6e0c457cc12626e85d2102c086a95311cf3e7

include/minix/callnr.h
include/minix/ipc.h
lib/libc/sys-minix/adjtime.c
lib/libc/sys-minix/clock_getres.c
lib/libc/sys-minix/clock_gettime.c
lib/libc/sys-minix/clock_settime.c
lib/libc/sys-minix/gettimeofday.c
lib/libc/sys-minix/stime.c
servers/pm/time.c

index 4e5f0ed3a538352c9b7704c1721c53c1d002212c..1f674f673773895dcf0129c37099868ce51d4f71 100644 (file)
 /* Field names for the exit(2) call. */
 #define PM_EXIT_STATUS         m1_i1   /* int */
 
-/* Field names for the gettimeofday(2), clock_*(2), adjtime(2), stime(2) calls.
- */
-#define PM_TIME_CLK_ID         m2_i1   /* clockid_t */
-#define PM_TIME_NOW            m2_i2   /* int */
-#define PM_TIME_SEC            m2_ll1  /* time_t */
-#define PM_TIME_USEC           m2_l2   /* long */
-#define PM_TIME_NSEC           m2_l2   /* long */
-
 /* Field names for the ptrace(2) call. */
 #define PM_PTRACE_PID          m2_i1   /* pid_t */
 #define PM_PTRACE_REQ          m2_i2   /* int */
index 0239e2f99f582214c01684da54b359511a5b241a..cff4bfa2dd59b6641da77ae318f69021d159bc97 100644 (file)
@@ -145,6 +145,26 @@ typedef struct {
 } mess_sigcalls;
 _ASSERT_MSG_SIZE(mess_sigcalls);
 
+typedef struct {
+       time_t sec;
+
+       clockid_t clk_id;
+       int now;
+       long nsec;
+
+       uint8_t padding[36];
+} mess_lc_pm_time;
+_ASSERT_MSG_SIZE(mess_lc_pm_time);
+
+typedef struct {
+       time_t sec;
+
+       long nsec;
+
+       uint8_t padding[44];
+} mess_pm_lc_time;
+_ASSERT_MSG_SIZE(mess_pm_lc_time);
+
 typedef struct {
        pid_t pid;
        int options;
@@ -902,6 +922,7 @@ typedef struct {
                mess_fs_vfs_readsuper   m_fs_vfs_readsuper;
                mess_fs_vfs_readwrite   m_fs_vfs_readwrite;
 
+               mess_lc_pm_time         m_lc_pm_time;
                mess_lc_pm_waitpid      m_lc_pm_waitpid;
 
                mess_lc_vfs_chown       m_lc_vfs_chown;
@@ -936,6 +957,7 @@ typedef struct {
                mess_lsys_vfs_copyfd    m_lsys_vfs_copyfd;
                mess_lsys_vfs_mapdriver m_lsys_vfs_mapdriver;
 
+               mess_pm_lc_time         m_pm_lc_time;
                mess_pm_lc_waitpid      m_pm_lc_waitpid;
 
                mess_pm_lsys_getepinfo  m_pm_lsys_getepinfo;
index 2aaa17b67c0b6ef98bd91e7938b613d2f79ff2fc..37db1aa0b0d3be6ebbf2c36a78c1d9038c26b7d3 100644 (file)
@@ -15,10 +15,10 @@ int adjtime(const struct timeval *delta, struct timeval *olddelta)
   message m;
 
   memset(&m, 0, sizeof(m));
-  m.PM_TIME_CLK_ID = (clockid_t) CLOCK_REALTIME;
-  m.PM_TIME_NOW = 0; /* use adjtime() method to slowly adjust the clock. */
-  m.PM_TIME_SEC = delta->tv_sec;
-  m.PM_TIME_NSEC = delta->tv_usec * 1000; /* convert usec to nsec */
+  m.m_lc_pm_time.clk_id = CLOCK_REALTIME;
+  m.m_lc_pm_time.now = 0; /* use adjtime() method to slowly adjust the clock. */
+  m.m_lc_pm_time.sec = delta->tv_sec;
+  m.m_lc_pm_time.nsec = delta->tv_usec * 1000; /* convert usec to nsec */
 
   if (_syscall(PM_PROC_NR, PM_CLOCK_SETTIME, &m) < 0)
        return -1;
index 3e58be7c62048a0b71d6ed99f9eb08fda74431e4..5c19d8c37f8ce8f19324607a7c95b20baa844cf1 100644 (file)
@@ -14,13 +14,13 @@ int clock_getres(clockid_t clock_id, struct timespec *res)
   message m;
 
   memset(&m, 0, sizeof(m));
-  m.PM_TIME_CLK_ID = clock_id;
+  m.m_lc_pm_time.clk_id = clock_id;
 
   if (_syscall(PM_PROC_NR, PM_CLOCK_GETRES, &m) < 0)
        return -1;
 
-  res->tv_sec = m.PM_TIME_SEC;
-  res->tv_nsec = m.PM_TIME_NSEC;
+  res->tv_sec = m.m_pm_lc_time.sec;
+  res->tv_nsec = m.m_pm_lc_time.nsec;
 
   return 0;
 }
index bef4a063ae4082dc945e6a58bdd647673ec8e7ce..cad496c7039c38898cb43dc4cc6bfd154adf82fe 100644 (file)
@@ -14,13 +14,13 @@ int clock_gettime(clockid_t clock_id, struct timespec *res)
   message m;
 
   memset(&m, 0, sizeof(m));
-  m.PM_TIME_CLK_ID = clock_id;
+  m.m_lc_pm_time.clk_id = clock_id;
 
   if (_syscall(PM_PROC_NR, PM_CLOCK_GETTIME, &m) < 0)
        return -1;
 
-  res->tv_sec = m.PM_TIME_SEC;
-  res->tv_nsec = m.PM_TIME_NSEC;
+  res->tv_sec = m.m_pm_lc_time.sec;
+  res->tv_nsec = m.m_pm_lc_time.nsec;
 
   return 0;
 }
index 0b18ef5c314db22509453e460312b4d29fcf89e0..6e4d1fc002031d2ab744279db1d3bfe99c5e0a34 100644 (file)
@@ -14,10 +14,10 @@ int clock_settime(clockid_t clock_id, const struct timespec *ts)
   message m;
 
   memset(&m, 0, sizeof(m));
-  m.PM_TIME_CLK_ID = clock_id;
-  m.PM_TIME_NOW = 1; /* set time immediately. don't use adjtime() method. */
-  m.PM_TIME_SEC = ts->tv_sec;
-  m.PM_TIME_NSEC = ts->tv_nsec;
+  m.m_lc_pm_time.clk_id = clock_id;
+  m.m_lc_pm_time.now = 1; /* set time immediately. don't use adjtime() method. */
+  m.m_lc_pm_time.sec = ts->tv_sec;
+  m.m_lc_pm_time.nsec = ts->tv_nsec;
 
   if (_syscall(PM_PROC_NR, PM_CLOCK_SETTIME, &m) < 0)
        return -1;
index 4c851fdba13f0d1f8288596505b3c61f8680a834..a7ecf4844fc9a74b1f7fea2b91bc8b5a59b27b98 100644 (file)
@@ -18,8 +18,8 @@ int gettimeofday(struct timeval *__restrict tp, void *__restrict tzp)
   if (_syscall(PM_PROC_NR, PM_GETTIMEOFDAY, &m) < 0)
        return -1;
 
-  tp->tv_sec = m.PM_TIME_SEC;
-  tp->tv_usec = m.PM_TIME_USEC;
+  tp->tv_sec = m.m_pm_lc_time.sec;
+  tp->tv_usec = m.m_pm_lc_time.nsec / 1000;
 
   return 0;
 }
index 6846be83428084a65d76733153f274b40adcce7a..67527dd83efee65972c7a31bc24a09285daa7665 100644 (file)
@@ -12,6 +12,6 @@ int stime(time_t *top)
   message m;
 
   memset(&m, 0, sizeof(m));
-  m.PM_TIME_SEC = *top;
+  m.m_lc_pm_time.sec = *top;
   return(_syscall(PM_PROC_NR, PM_STIME, &m));
 }
index dcc610fd0260576e9de1a883b94cc51e958d9acb..c002ba671f608ea80b04e90608339491638111ea 100644 (file)
@@ -27,7 +27,7 @@ int do_gettime()
   if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
        panic("do_time couldn't get uptime: %d", s);
 
-  switch (m_in.PM_TIME_CLK_ID) {
+  switch (m_in.m_lc_pm_time.clk_id) {
        case CLOCK_REALTIME:
                clock = realtime;
                break;
@@ -38,8 +38,8 @@ int do_gettime()
                return EINVAL; /* invalid/unsupported clock_id */
   }
 
-  mp->mp_reply.PM_TIME_SEC = boottime + (clock / system_hz);
-  mp->mp_reply.PM_TIME_NSEC =
+  mp->mp_reply.m_pm_lc_time.sec = boottime + (clock / system_hz);
+  mp->mp_reply.m_pm_lc_time.nsec =
        (uint32_t) ((clock % system_hz) * 1000000000ULL / system_hz);
 
   return(OK);
@@ -50,12 +50,12 @@ int do_gettime()
  *===========================================================================*/
 int do_getres()
 {
-  switch (m_in.PM_TIME_CLK_ID) {
+  switch (m_in.m_lc_pm_time.clk_id) {
        case CLOCK_REALTIME:
        case CLOCK_MONOTONIC:
                /* tv_sec is always 0 since system_hz is an int */
-               mp->mp_reply.PM_TIME_SEC = 0;
-               mp->mp_reply.PM_TIME_NSEC = 1000000000 / system_hz;
+               mp->mp_reply.m_pm_lc_time.sec = 0;
+               mp->mp_reply.m_pm_lc_time.nsec = 1000000000 / system_hz;
                return(OK);
        default:
                return EINVAL; /* invalid/unsupported clock_id */
@@ -73,10 +73,10 @@ int do_settime()
       return(EPERM);
   }
 
-  switch (m_in.PM_TIME_CLK_ID) {
+  switch (m_in.m_lc_pm_time.clk_id) {
        case CLOCK_REALTIME:
-               s= sys_settime(m_in.PM_TIME_NOW, m_in.PM_TIME_CLK_ID,
-                       m_in.PM_TIME_SEC, m_in.PM_TIME_NSEC);
+               s = sys_settime(m_in.m_lc_pm_time.now, m_in.m_lc_pm_time.clk_id,
+                       m_in.m_lc_pm_time.sec, m_in.m_lc_pm_time.nsec);
                return(s);
        case CLOCK_MONOTONIC: /* monotonic cannot be changed */
        default:
@@ -101,9 +101,9 @@ int do_time()
   if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
        panic("do_time couldn't get uptime: %d", s);
 
-  mp->mp_reply.PM_TIME_SEC = boottime + (realtime / system_hz);
-  mp->mp_reply.PM_TIME_USEC =
-       (uint32_t) ((realtime % system_hz) * 1000000ULL / system_hz);
+  mp->mp_reply.m_pm_lc_time.sec = boottime + (realtime / system_hz);
+  mp->mp_reply.m_pm_lc_time.nsec =
+       (uint32_t) ((realtime % system_hz) * 1000000000ULL / system_hz);
   return(OK);
 }
 
@@ -124,7 +124,7 @@ int do_stime()
   }
   if ( (s=getuptime(&uptime, &realtime, &boottime)) != OK) 
       panic("do_stime couldn't get uptime: %d", s);
-  boottime = m_in.PM_TIME_SEC - (realtime/system_hz);
+  boottime = m_in.m_lc_pm_time.sec - (realtime/system_hz);
 
   s= sys_stime(boottime);              /* Tell kernel about boottime */
   if (s != OK)