]> Zhao Yanbai Git Server - minix.git/commitdiff
libc: add clock_getres()/clock_gettime() system calls. 67/467/1
authorThomas Cort <tcort@minix3.org>
Fri, 29 Mar 2013 21:48:22 +0000 (21:48 +0000)
committerBen Gras <ben@minix3.org>
Thu, 4 Apr 2013 13:04:53 +0000 (15:04 +0200)
In order to make it more clear that ticks should be used for timers
and realtime should be used for timestamps / displaying the date/time,
getuptime() was renamed to getticks() and getuptime2() was renamed to
getuptime().

Servers, drivers, libraries, tests, etc that use getuptime()/getuptime2()
have been updated. In instances where a realtime was calculated, the
calculation was changed to use realtime.

System calls clock_getres() and clock_gettime() were added to PM/libc.

44 files changed:
drivers/dpeth/3c501.c
drivers/dpeth/3c509.c
drivers/fbd/fbd.c
drivers/filter/util.c
drivers/orinoco/orinoco.c
include/minix/callnr.h
include/minix/com.h
include/minix/sysutil.h
include/time.h
kernel/system/do_times.c
lib/libc/sys-minix/MISSING_SYSCALLS
lib/libc/sys-minix/Makefile.inc
lib/libc/sys-minix/clock_getres.c [new file with mode: 0644]
lib/libc/sys-minix/clock_gettime.c [new file with mode: 0644]
lib/libddekit/src/timer.c
lib/liblwip/sys_arch.c
lib/libpuffs/utility.c
lib/libsys/Makefile
lib/libsys/arch/earm/spin.c
lib/libsys/arch/i386/spin.c
lib/libsys/getticks.c [moved from lib/libsys/getuptime2.c with 69% similarity]
lib/libsys/getuptime.c
lib/libsys/timers.c
servers/ext2/utility.c
servers/inet/clock.c
servers/is/dmp_pm.c
servers/iso9660fs/glo.h
servers/mfs/utility.c
servers/pfs/utility.c
servers/pm/alarm.c
servers/pm/param.h
servers/pm/proto.h
servers/pm/table.c
servers/pm/time.c
servers/procfs/root.c
servers/procfs/tree.c
servers/rs/main.c
servers/rs/manager.c
servers/rs/request.c
servers/vfs/table.c
servers/vfs/utility.c
servers/vm/region.c
sys/sys/time.h
test/blocktest/blocktest.c

index 429ea5844150e70f93ad3b07972d42fd8936bd47..14c43bc05a6fc509d5eae97cd19337324906a6a8 100644 (file)
@@ -169,7 +169,7 @@ static void el1_send(dpeth_t * dep, int from_int, int pktsize)
 
   if ((dep->de_flags & DEF_XMIT_BUSY)) {
        if (from_int) panic("should not be sending ");
-       getuptime(&now);
+       getticks(&now);
        if ((now - dep->de_xmit_start) > 4) {
                /* Transmitter timed out */
                DEBUG(printf("3c501: transmitter timed out ... \n"));
@@ -206,7 +206,7 @@ static void el1_send(dpeth_t * dep, int from_int, int pktsize)
        outb_el1(dep, EL1_CSR, ECSR_RIDE | ECSR_XMIT);  /* There it goes... */
        unlock();
 
-       getuptime(&dep->de_xmit_start);
+       getticks(&dep->de_xmit_start);
        dep->de_flags &= NOT(DEF_SENDING);
   }
   return;
index c7739b2ba483f09ed8387ecb911033e676943ab5..74e66982a7e46cbaf30009cf1048e589a127fdb5 100644 (file)
@@ -238,7 +238,7 @@ static void el3_send(dpeth_t * dep, int from_int, int count)
   int ix;
   short int TxStatus;
 
-  getuptime(&now);
+  getticks(&now);
   if ((dep->de_flags & DEF_XMIT_BUSY) &&
       (now - dep->de_xmit_start) > 4) {
 
@@ -258,7 +258,7 @@ static void el3_send(dpeth_t * dep, int from_int, int count)
        /* Writes packet */
        el3_write_fifo(dep, count);
 
-       getuptime(&dep->de_xmit_start);
+       getticks(&dep->de_xmit_start);
        dep->de_flags |= (DEF_XMIT_BUSY | DEF_ACK_SEND);
        if (inw_el3(dep, REG_TxFree) > ETH_MAX_PACK_SIZE) {
                /* Tx has enough room for a packet of maximum size */
index 87faf6b65e1f66677ac13f625c47e23138c2afd5..700fe92b91f293dc35c5224e2d7abf0bf3b4a522 100644 (file)
@@ -83,7 +83,7 @@ static int sef_cb_init_fresh(int type, sef_init_info_t *UNUSED(info))
 
        assert(fbd_buf != NULL);
 
-       if ((r = getuptime(&uptime)) != OK)
+       if ((r = getticks(&uptime)) != OK)
                panic("getuptime failed (%d)\n", r);
 
        srand48(uptime);
index f573198744817ddfb14d4c02975d5a1d187876f3..f9ffd9dc18aac687925c15567c901572eb8c2310 100644 (file)
@@ -60,7 +60,7 @@ clock_t flt_alarm(clock_t dt)
        } else {
                if(next_alarm)
                        panic("overwriting alarm: %d", r);
-               if ((r = getuptime(&next_alarm)) != OK)
+               if ((r = getticks(&next_alarm)) != OK)
                        panic("getuptime failed: %d", r);
                next_alarm += dt;
        }
index 0958ed7240da7e43d6264b99d48b168e4d9517eb..ced338f696ec7694a8a9f36e7c65c6dab91b50eb 100644 (file)
@@ -346,7 +346,7 @@ static void or_reset() {
        t_or *orp;
        int i, r;
 
-       if (OK != (r = getuptime(&now)))
+       if (OK != (r = getticks(&now)))
                panic("orinoco: getuptime() failed: %d", r);
 
        if(now - last_reset < system_hz * 10) {
index aedf3d3df0e7e7eca3c314abaaea0a8136d4a7f2..d3c9e35298c278200b28c8b5eedb5bbb2f7ec06c 100644 (file)
@@ -1,4 +1,4 @@
-#define NCALLS          114    /* number of system calls allowed */
+#define NCALLS          116    /* number of system calls allowed */
 
 /* In case it isn't obvious enough: this list is sorted numerically. */
 #define EXIT              1 
 #define GCOV_FLUSH     112     /* flush gcov data from server to gcov files */
 
 #define PM_GETSID      113     /* PM getsid() */
+#define CLOCK_GETRES   114     /* clock_getres() */
+#define CLOCK_GETTIME  115     /* clock_gettime() */
 
 #define TASK_REPLY     121     /* to VFS: reply code from drivers, not 
                                 * really a standalone call.
index 7d57e7b349e2091febbc930d72321fd14ac8ab4e..327c3dcba568a80cafd429ccfb244c044c9d772c 100644 (file)
 #define T_USER_TIME    m4_l1   /* user time consumed by process */
 #define T_SYSTEM_TIME  m4_l2   /* system time consumed by process */
 #define T_BOOTTIME     m4_l3   /* Boottime in seconds (also for SYS_STIME) */
-#define T_BOOT_TICKS   m4_l5   /* number of clock ticks since boot time */
+#define T_REAL_TICKS   m4_l4   /* number of wall clock ticks since boottime */
+#define T_BOOT_TICKS   m4_l5   /* number of hard clock ticks since boottime */
 
 /* Field names for SYS_TRACE, SYS_PRIVCTL, SYS_STATECTL. */
 #define CTL_ENDPT      m2_i1   /* process number of the caller */
index 426e5a1b87ee618611d4f6026b3ad606d841452c..102ff575846648c7bed04a804303c1d51b4328b5 100644 (file)
@@ -49,8 +49,8 @@ int fkey_ctl(int req, int *fkeys, int *sfkeys);
 int printf(const char *fmt, ...);
 void kputc(int c);
 __dead void panic(const char *fmt, ...);
-int getuptime(clock_t *ticks);
-int getuptime2(clock_t *ticks, time_t *boottime);
+int getuptime(clock_t *ticks, clock_t *realtime, time_t *boottime);
+int getticks(clock_t *ticks);
 int tickdelay(clock_t ticks);
 int tsc_calibrate(void);
 u32_t sys_hz(void);
index 563168074f48aaecdc913cf4282db0848a568aff..1a9d425437caecec6238be783e3867fe7c787d90 100644 (file)
@@ -158,11 +158,11 @@ struct sigevent;
 struct itimerspec;
 int clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
 #ifndef __LIBC12_SOURCE__
-#ifndef __minix
 int clock_getres(clockid_t, struct timespec *)
     __RENAME(__clock_getres50);
 int clock_gettime(clockid_t, struct timespec *)
     __RENAME(__clock_gettime50);
+#ifndef __minix
 int clock_settime(clockid_t, const struct timespec *)
     __RENAME(__clock_settime50);
 #endif /* !__minix */
index 9d388cc2213fa2186371a1d58b5952a13e4a9223..0205cf62c57ca2beafdf7012aa45b4a18abe72da 100644 (file)
@@ -36,6 +36,7 @@ int do_times(struct proc * caller, message * m_ptr)
       m_ptr->T_SYSTEM_TIME = rp->p_sys_time;
   }
   m_ptr->T_BOOT_TICKS = get_monotonic();  
+  m_ptr->T_REAL_TICKS = get_realtime();
   m_ptr->T_BOOTTIME = boottime;  
   return(OK);
 }
index 7093d1a2040523d483fd01f9862fe70c0c9b837d..54b519863a01de77a860cebb95a706f67e995288 100644 (file)
@@ -4,8 +4,6 @@ adjtime
 lchmod
 lchown
 clone
-clock_getres
-clock_gettime
 clock_settime
 extattr_*
 fhopen
index 6f520970190db3ecb8e07b427777f66c8ea0d591..f47cd87e939832a8e1ba1c84e0a9c094ec8bc4ad 100644 (file)
@@ -2,6 +2,7 @@
 
 SRCS+=         accept.c access.c bind.c brk.c sbrk.c m_closefrom.c getsid.c \
        chdir.c chmod.c fchmod.c chown.c fchown.c chroot.c close.c \
+       clock_getres.c clock_gettime.c \
        connect.c dup.c dup2.c execve.c fcntl.c flock.c fpathconf.c fork.c \
        fstatfs.c fstatvfs.c fsync.c ftruncate.c getdents.c getegid.c getgid.c \
        getgroups.c getitimer.c setitimer.c __getlogin.c getpeername.c \
diff --git a/lib/libc/sys-minix/clock_getres.c b/lib/libc/sys-minix/clock_getres.c
new file mode 100644 (file)
index 0000000..a40177e
--- /dev/null
@@ -0,0 +1,25 @@
+#include <sys/cdefs.h>
+#include <lib.h>
+#include "namespace.h"
+
+#include <sys/time.h>
+
+#ifdef __weak_alias
+__weak_alias(clock_getres, __clock_getres50);
+#endif
+
+int clock_getres(clockid_t clock_id, struct timespec *res)
+{
+  message m;
+
+  m.m2_l1 = (clockid_t) clock_id;
+
+  if (_syscall(PM_PROC_NR, CLOCK_GETRES, &m) < 0)
+       return -1;
+
+  res->tv_sec = (time_t) m.m2_l1;
+  res->tv_nsec = (long) m.m2_l2;
+
+  return 0;
+}
+
diff --git a/lib/libc/sys-minix/clock_gettime.c b/lib/libc/sys-minix/clock_gettime.c
new file mode 100644 (file)
index 0000000..01ed16c
--- /dev/null
@@ -0,0 +1,25 @@
+#include <sys/cdefs.h>
+#include <lib.h>
+#include "namespace.h"
+
+#include <sys/time.h>
+
+#ifdef __weak_alias
+__weak_alias(clock_gettime, __clock_gettime50);
+#endif
+
+int clock_gettime(clockid_t clock_id, struct timespec *res)
+{
+  message m;
+
+  m.m2_l1 = (clockid_t) clock_id;
+
+  if (_syscall(PM_PROC_NR, CLOCK_GETTIME, &m) < 0)
+       return -1;
+
+  res->tv_sec = (time_t) m.m2_l1;
+  res->tv_nsec = (long) m.m2_l2;
+
+  return 0;
+}
+
index 818fd419c4bb6e6610e0985909c0d0e354f4a60e..da75b2347f5f28f3a70215aacaa0b191e7d88880 100644 (file)
@@ -76,7 +76,7 @@ static myclock_t get_current_clock()
 { 
        /* returns the current clock tick */
        myclock_t ret;
-       getuptime(&ret);
+       getticks(&ret);
        return ret;
 }
 
index 2a1e7e53d0804f21033e733d1971d004d6be141d..7d4fc49af1826848c113ba3c2b4fa0849d7189b2 100644 (file)
@@ -6,7 +6,7 @@ u32_t sys_jiffies(void)
 {
        clock_t ticks;
 
-       if (getuptime(&ticks) == OK)
+       if (getticks(&ticks) == OK)
                return  ticks;
        else
                panic("getuptime() failed\n");
@@ -20,6 +20,7 @@ u32_t sys_now(void)
        if (!hz)
                hz = sys_hz();
 
+       /* use ticks not realtime as sys_now() is used to calculate timers */
        jiffs = sys_jiffies();
 
        return jiffs * (1000 / hz);
index 0985c587d7be2d858c36609017e66b1f46bdc9dc..401df9c2ec62b13b942245a3bed2368e77f69cf6 100644 (file)
@@ -46,12 +46,13 @@ time_t clock_time()
 
   register int k;
   clock_t uptime;
+  clock_t realtime;
   time_t boottime;
 
-  if ((k=getuptime2(&uptime, &boottime)) != OK)
+  if ((k=getuptime(&uptime, &realtime, &boottime)) != OK)
        panic("clock_time: getuptme2 failed: %d", k);
 
-  return( (time_t) (boottime + (uptime/sys_hz())));
+  return( (time_t) (boottime + (realtime/sys_hz())));
 }
 
 
index 47343cc72d6f236586d4cd4e15739969c52ad9df..4d36abbaaf105e08b83109df2f83c43dc4930293 100644 (file)
@@ -15,9 +15,9 @@ SRCS+=  \
        env_parse.c \
        env_prefix.c \
        fkey_ctl.c \
+       getticks.c \
        getsysinfo.c \
        getuptime.c \
-       getuptime2.c \
        input.c \
        kernel_call.c \
        kprintf.c \
index 3e2115f03ecd3debff723a90d7a20f6ad7e3b99d..967f2a68dc2157d5360ea00caff14677e218a3dc 100644 (file)
@@ -70,14 +70,14 @@ int spin_check(spin_t *s)
 
                if (micro_delta >= TSC_SPIN) {
                        s->s_usecs -= micro_delta;
-                       getuptime(&s->s_base_uptime);
+                       getticks(&s->s_base_uptime);
                        s->s_state = STATE_UPTIME;
                }
 
                break;
 
        case STATE_UPTIME:
-               getuptime(&now);
+               getticks(&now);
 
                /* We assume that sys_hz() caches its return value. */
                micro_delta = ((now - s->s_base_uptime) * 1000 / sys_hz()) *
index 3e47c0d96d88c8278436abfe831ed73132ace1b5..2724f1447db6a4ae6ff1f8413a8387d7fec5feca 100644 (file)
@@ -72,14 +72,14 @@ int spin_check(spin_t *s)
 
                if (micro_delta >= TSC_SPIN) {
                        s->s_usecs -= micro_delta;
-                       getuptime(&s->s_base_uptime);
+                       getticks(&s->s_base_uptime);
                        s->s_state = STATE_UPTIME;
                }
 
                break;
 
        case STATE_UPTIME:
-               getuptime(&now);
+               getticks(&now);
 
                /* We assume that sys_hz() caches its return value. */
                micro_delta = ((now - s->s_base_uptime) * 1000 / sys_hz()) *
similarity index 69%
rename from lib/libsys/getuptime2.c
rename to lib/libsys/getticks.c
index 2526646023495132a21e0a0b3a4d9fb2619af05c..d4ffe5b9f6456eaf2c32916d1be7fafc0b13f927 100644 (file)
@@ -1,11 +1,10 @@
 #include "sysutil.h"
 
 /*===========================================================================*
- *                               getuptime2                                 *
+ *                               getuptime                                  *
  *===========================================================================*/
-int getuptime2(ticks, boottime)
-clock_t *ticks;                                /* uptime in ticks */
-time_t *boottime;
+int getticks(ticks)
+clock_t *ticks;                                /* monotonic time in ticks */
 {
     message m;
     int s;
@@ -14,7 +13,6 @@ time_t *boottime;
     m.T_ENDPT = NONE;                  /* ignore process times */
     s = _kernel_call(SYS_TIMES, &m);
     *ticks = m.T_BOOT_TICKS;
-    *boottime = m.T_BOOTTIME;
     return(s);
 }
 
index 24d2eb5e624bfea392edcfbdc30bc16934004910..1d7743842d655d9eb8f6fdbb10072e021977c742 100644 (file)
@@ -3,8 +3,10 @@
 /*===========================================================================*
  *                               getuptime                                  *
  *===========================================================================*/
-int getuptime(ticks)
-clock_t *ticks;                                /* uptime in ticks */
+int getuptime(ticks, realtime, boottime)
+clock_t *ticks;                                /* monotonic time in ticks */
+clock_t *realtime;                     /* wall time in ticks */
+time_t *boottime;
 {
     message m;
     int s;
@@ -13,6 +15,8 @@ clock_t *ticks;                               /* uptime in ticks */
     m.T_ENDPT = NONE;                  /* ignore process times */
     s = _kernel_call(SYS_TIMES, &m);
     *ticks = m.T_BOOT_TICKS;
+    *realtime = m.T_REAL_TICKS;
+    *boottime = m.T_BOOTTIME;
     return(s);
 }
 
index d794b812a8219527589b3cdc7a4a84bb5a76dc0d..7cf67b920d9b7bd116d986f0c9b0656986c1cdc7 100644 (file)
@@ -34,7 +34,7 @@ void set_timer(timer_t *tp, int ticks, tmr_func_t watchdog, int arg)
         int r;
         clock_t now, prev_time = 0, next_time;
 
-        if ((r = getuptime(&now)) != OK)
+        if ((r = getticks(&now)) != OK)
                 panic("set_timer: couldn't get uptime");
 
         /* Set timer argument and add timer to the list. */
index b55514625b56dc6a404c317072ba0486c997d21b..dd3d56d13fe262f7a415ba65dde9a0f9b6b3f7e3 100644 (file)
@@ -63,12 +63,13 @@ time_t clock_time()
 
   register int k;
   clock_t uptime;
+  clock_t realtime;
   time_t boottime;
 
-  if ( (k=getuptime2(&uptime, &boottime)) != OK)
+  if ( (k=getuptime(&uptime, &realtime, &boottime)) != OK)
                panic("clock_time: getuptme2 failed: %d", k);
 
-  return( (time_t) (boottime + (uptime/sys_hz())));
+  return( (time_t) (boottime + (realtime/sys_hz())));
 }
 
 
index 42f59ce752132e5a595f471548188d8979d9ede5..71517845efe7b97137db0bf6c87c03a90048350e 100644 (file)
@@ -35,7 +35,7 @@ time_t get_time()
 {
        if (!curr_time)
        {
-               if (getuptime(&curr_time) != OK)
+               if (getticks(&curr_time) != OK)
                        ip_panic(("can't read clock"));
                assert(curr_time >= prev_time);
        }
index 4799b588ac81609486ee72700ae555514e734169..9be20a05405d0e969375759bf171bbed7cfd93ba 100644 (file)
@@ -83,7 +83,7 @@ void sigaction_dmp()
        printf("Error obtaining table from PM. Perhaps recompile IS?\n");
        return;
   }
-  getuptime(&uptime);
+  getticks(&uptime);
 
   printf("Process manager (PM) signal action dump\n");
   printf("-process- -nr- --ignore- --catch- --block- -pending- -alarm---\n");
index bb84c902a28f3ddd68e2487ac712a90ec651134d..9ddf8b2df25d61ab293042511b402dae252a8c57 100644 (file)
@@ -33,4 +33,3 @@ EXTERN int unmountdone;
 EXTERN dev_t fs_dev;    /* the device that is handled by this FS proc */
 EXTERN char fs_dev_label[16]; /* Name of the device driver that is handled */
 
-EXTERN int use_getuptime2; /* Should be removed togetherwith boottime */
index 3a2ecd5619a06439bbb4b15fca791d5fd2ac8112..9ded34d047b9acf308375e18605501057eeb7f37 100644 (file)
@@ -59,12 +59,13 @@ time_t clock_time()
 
   register int k;
   clock_t uptime;
+  clock_t realtime;
   time_t boottime;
 
-  if ( (k=getuptime2(&uptime, &boottime)) != OK)
+  if ( (k=getuptime(&uptime, &realtime, &boottime)) != OK)
                panic("clock_time: getuptme2 failed: %d", k);
   
-  return( (time_t) (boottime + (uptime/sys_hz())));
+  return( (time_t) (boottime + (realtime/sys_hz())));
 }
 
 
index 8101990b7b70a8e643e5430a6d1d10a732b1c4ff..f1c4849abc3da43255d1166fbb59011568953061 100644 (file)
@@ -24,10 +24,11 @@ time_t clock_time()
 
   int r;
   clock_t uptime;      /* Uptime in ticks */
+  clock_t realtime;
   time_t boottime;
 
-  if ((r = getuptime2(&uptime, &boottime)) != OK)
+  if ((r = getuptime(&uptime, &realtime, &boottime)) != OK)
                panic("clock_time: getuptme2 failed: %d", r);
 
-  return( (time_t) (boottime + (uptime/sys_hz())));
+  return( (time_t) (boottime + (realtime/sys_hz())));
 }
index 884a04b82ba110d882f3c76566008120cdce9e6c..c0a5fa0ce8b0a4cb588c7d606533f78931e3bdb4 100644 (file)
@@ -283,7 +283,7 @@ struct itimerval *value;
 
   /* First determine remaining time, in ticks, of previous alarm, if set. */
   if (rmp->mp_flags & ALARM_ON) {
-       if ( (s = getuptime(&uptime)) != OK)
+       if ( (s = getticks(&uptime)) != OK)
                panic("get_realtimer couldn't get uptime: %d", s);
        exptime = *tmr_exp_time(&rmp->mp_timer);
 
index a659ff11de29577bdc32a8d1136f1ccc4a3c4ef2..33a15cb71992694af8f2f655bf0f92231d4d1109 100644 (file)
@@ -30,6 +30,7 @@
 #define svrctl_req     m2_i1
 #define svrctl_argp    m2_p1
 #define stime          m2_l1
+#define clk_id         m2_l1
 #define memsize        m4_l1
 #define membase        m4_l2
 #define sysuname_req   m1_i1
@@ -46,6 +47,7 @@
 #define reply_trace    m2_l2   
 #define reply_time      m2_l1
 #define reply_utime     m2_l2
+#define reply_ntime    m2_l2
 #define reply_t1       m4_l1
 #define reply_t2       m4_l2
 #define reply_t3       m4_l3
index 00646d3ed201a937b3259bee363e80882630ff42..2b86bad6651bf772d89ecd4dc01b1ca252afd612 100644 (file)
@@ -86,6 +86,8 @@ void vm_notify_sig_wrapper(endpoint_t ep);
 int do_stime(void);
 int do_time(void);
 int do_times(void);
+int do_getres(void);
+int do_gettime(void);
 
 /* trace.c */
 int do_trace(void);
index 5051cec7d5038eea06c438d8fc478c0ad0c6732c..4c253dabc52f3c3068c7a2c323b5c2aedd9c6584 100644 (file)
@@ -125,6 +125,8 @@ int (*call_vec[])(void) = {
        do_srv_kill,    /* 111 = srv_kill */
        no_sys,         /* 112 = gcov_flush */
        do_get,         /* 113 = getsid */
+       do_getres,      /* 114 = clock_getres */
+       do_gettime,     /* 115 = clock_gettime */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index 747a0bd652b66a383bf72305b40cba8d40e62e18..61fca33ebbdfb1c3104bb8da1822f2b3641a1dd6 100644 (file)
@@ -1,6 +1,8 @@
 /* This file takes care of those system calls that deal with time.
  *
  * The entry points into this file are
+ *   do_getres:                perform the CLOCK_GETRES system call
+ *   do_gettime:       perform the CLOCK_GETTIME system call
  *   do_time:          perform the TIME system call
  *   do_stime:         perform the STIME system call
  *   do_times:         perform the TIMES system call
 #include <minix/callnr.h>
 #include <minix/com.h>
 #include <signal.h>
+#include <sys/time.h>
 #include "mproc.h"
 #include "param.h"
 
+/*===========================================================================*
+ *                             do_gettime                                   *
+ *===========================================================================*/
+int do_gettime()
+{
+  clock_t ticks, realtime, clock;
+  time_t boottime;
+  int s;
+
+  if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
+       panic("do_time couldn't get uptime: %d", s);
+
+  switch (m_in.clk_id) {
+       case CLOCK_REALTIME:
+               clock = realtime;
+               break;
+       case CLOCK_MONOTONIC:
+               clock = ticks;
+               break;
+       default:
+               return EINVAL; /* invalid/unsupported clock_id */
+  }
+
+  mp->mp_reply.reply_time = (time_t) (boottime + (clock / system_hz));
+  mp->mp_reply.reply_ntime = (clock % system_hz) * 1000000000 / system_hz;
+
+  return(OK);
+}
+
+/*===========================================================================*
+ *                             do_getres                                    *
+ *===========================================================================*/
+int do_getres()
+{
+  switch (m_in.clk_id) {
+       case CLOCK_REALTIME:
+       case CLOCK_MONOTONIC:
+               /* tv_sec is always 0 since system_hz is an int */
+               mp->mp_reply.reply_time = (time_t) 0;
+               mp->mp_reply.reply_ntime = 1000000000 / system_hz;
+               return(OK);
+       default:
+               return EINVAL; /* invalid/unsupported clock_id */
+  }
+}
+
 /*===========================================================================*
  *                             do_time                                      *
  *===========================================================================*/
@@ -23,14 +72,15 @@ int do_time()
  * rotates at a constant rate and that such things as leap seconds do not 
  * exist.
  */
-  clock_t uptime, boottime;
+  clock_t ticks, realtime;
+  time_t boottime;
   int s;
 
-  if ( (s=getuptime2(&uptime, &boottime)) != OK) 
+  if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
        panic("do_time couldn't get uptime: %d", s);
 
-  mp->mp_reply.reply_time = (time_t) (boottime + (uptime/system_hz));
-  mp->mp_reply.reply_utime = (uptime%system_hz)*1000000/system_hz;
+  mp->mp_reply.reply_time = (time_t) (boottime + (realtime / system_hz));
+  mp->mp_reply.reply_utime = (realtime % system_hz) * 1000000 / system_hz;
   return(OK);
 }
 
@@ -42,15 +92,16 @@ int do_stime()
 /* Perform the stime(tp) system call. Retrieve the system's uptime (ticks 
  * since boot) and pass the new time in seconds at system boot to the kernel.
  */
-  clock_t uptime, boottime;
+  clock_t uptime, realtime;
+  time_t boottime;
   int s;
 
   if (mp->mp_effuid != SUPER_USER) { 
       return(EPERM);
   }
-  if ( (s=getuptime(&uptime)) != OK) 
+  if ( (s=getuptime(&uptime, &realtime, &boottime)) != OK) 
       panic("do_stime couldn't get uptime: %d", s);
-  boottime = (long) m_in.stime - (uptime/system_hz);
+  boottime = (long) m_in.stime - (realtime/system_hz);
 
   s= sys_stime(boottime);              /* Tell kernel about boottime */
   if (s != OK)
index 653d8c32fcb6673cde9e1164236705bfd833a6aa..7629c0ad6fb4f52c77cd549601d670878eda0cd5 100644 (file)
@@ -81,7 +81,7 @@ static void root_uptime(void)
        clock_t ticks;
        ldiv_t division;
 
-       if (getuptime(&ticks) != OK)
+       if (getticks(&ticks) != OK)
                return;
        division = ldiv(100L * ticks / sys_hz(), 100L);
 
index f4dfa49ce1e5f4b542f24bb9849f3655ad027c46..5365ca20cf984f703ee80572a009d6e58aa4ff2f 100644 (file)
@@ -440,7 +440,7 @@ int lookup_hook(struct inode *parent, char *name,
        /* Update lazily for lookups, as this gets too expensive otherwise.
         * Alternative: pull in only PM's table?
         */
-       if ((r = getuptime(&now)) != OK)
+       if ((r = getticks(&now)) != OK)
                panic(__FILE__, "unable to get uptime", r);
 
        if (last_update != now) {
index bc77b0aaf41db319b5454bfb63bd045a97e3b2d2..dc1caf797b300a0a6030fae3cfa479a0b6c7b79d 100644 (file)
@@ -328,7 +328,7 @@ static int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
       rp->r_next_rp = NULL;                    /* no next replica yet */
       rp->r_uid = 0;                           /* root */
       rp->r_check_tm = 0;                      /* not checked yet */
-      getuptime(&rp->r_alive_tm);              /* currently alive */
+      getticks(&rp->r_alive_tm);               /* currently alive */
       rp->r_stop_tm = 0;                       /* not exiting yet */
       rp->r_restarts = 0;                      /* no restarts so far */
       rp->r_period = 0;                        /* no period yet */
@@ -669,7 +669,7 @@ endpoint_t endpoint;
   /* Mark the slot as no longer initializing. */
   rp->r_flags &= ~RS_INITIALIZING;
   rp->r_check_tm = 0;
-  getuptime(&rp->r_alive_tm);
+  getticks(&rp->r_alive_tm);
 }
 
 /*===========================================================================*
index 266023b4ba00706031d7a054e441392a6b64de6c..89bf45ba722369ffb0bfa9e65494711fffa9d3af 100644 (file)
@@ -496,7 +496,7 @@ struct rproc *rp;
   rpub->endpoint = child_proc_nr_e;            /* set child endpoint */
   rp->r_pid = child_pid;                       /* set child pid */
   rp->r_check_tm = 0;                          /* not checked yet */
-  getuptime(&rp->r_alive_tm);                  /* currently alive */
+  getticks(&rp->r_alive_tm);                   /* currently alive */
   rp->r_stop_tm = 0;                           /* not exiting yet */
   rp->r_backoff = 0;                           /* not to be restarted */
   rproc_ptr[child_proc_nr_n] = rp;             /* mapping for fast access */
@@ -867,7 +867,7 @@ void stop_service(struct rproc *rp,int how)
 
   rp->r_flags |= how;                          /* what to on exit? */
   sys_kill(rpub->endpoint, signo);             /* first try friendly */
-  getuptime(&rp->r_stop_tm);                   /* record current time */
+  getticks(&rp->r_stop_tm);                    /* record current time */
 }
 
 /*===========================================================================*
index e659c712ada02b033e248a50fefb63dc7ba1852b..5096071deead36ea7a08cb7688f404811bdcd862 100755 (executable)
@@ -431,7 +431,7 @@ int do_init_ready(message *m_ptr)
   /* Mark the slot as no longer initializing. */
   rp->r_flags &= ~RS_INITIALIZING;
   rp->r_check_tm = 0;
-  getuptime(&rp->r_alive_tm);
+  getticks(&rp->r_alive_tm);
 
   /* Reply and unblock the service before doing anything else. */
   m.m_type = OK;
@@ -597,7 +597,7 @@ int do_update(message *m_ptr)
   rp->r_flags |= RS_UPDATING;
   rp->r_new_rp->r_flags |= RS_UPDATING;
   rupdate.flags |= RS_UPDATING;
-  getuptime(&rupdate.prepare_tm);
+  getticks(&rupdate.prepare_tm);
   rupdate.prepare_maxtime = prepare_maxtime;
   rupdate.rp = rp;
 
index 61bd517dc1147536235f483d8446f996c373cb0c..d27b070c4e9a3b27de0b409667673bed5d324ad2 100644 (file)
@@ -129,6 +129,8 @@ int (*call_vec[])(void) = {
        no_sys,         /* 111 = (srv_kill) */
        do_gcov_flush,  /* 112 = gcov_flush */
        no_sys,         /* 113 = (getsid) */
+       no_sys,         /* 114 = (clock_getres) */
+       no_sys,         /* 115 = (clock_gettime) */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index b3f078c53e8f42f2041884326a07840aa762aad3..f4476f679a768023540ffce17478cf7d13b5b55d 100644 (file)
@@ -152,13 +152,14 @@ time_t clock_time()
 
   register int r;
   clock_t uptime;
+  clock_t realtime;
   time_t boottime;
 
-  r = getuptime2(&uptime, &boottime);
+  r = getuptime(&uptime, &realtime, &boottime);
   if (r != OK)
        panic("clock_time err: %d", r);
 
-  return( (time_t) (boottime + (uptime/system_hz)));
+  return( (time_t) (boottime + (realtime/system_hz)));
 }
 
 /*===========================================================================*
index 78ad03f31ef363152f2e04999407f93af1470713..5f46a0fa451e00802c47043acdfee7c47ce214bc 100644 (file)
@@ -315,7 +315,7 @@ void blockstats(void)
        clock_t ticks;
        int s;
 
-       s = getuptime(&ticks);
+       s = getticks(&ticks);
 
        assert(s == OK);
 
index eeec2cd78a23d104f4cb129164d521efe21b7c10..6cda042ff5f26481f9c0aa54ed4eadc2d9057db6 100644 (file)
@@ -248,11 +248,12 @@ struct    itimerspec {
        struct  timespec it_value;
 };
 
-#ifndef __minix
 #define        CLOCK_REALTIME  0
+#define        CLOCK_MONOTONIC 3
+
+#ifndef __minix
 #define        CLOCK_VIRTUAL   1
 #define        CLOCK_PROF      2
-#define        CLOCK_MONOTONIC 3
 #endif
 
 #if defined(_NETBSD_SOURCE)
index dc87f0f7ee59b07010d133956db15879528d7de8..9804a1c1705cbf09816cc8f59e3e4c3df115c332 100644 (file)
@@ -2632,7 +2632,7 @@ static int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
        if (driver_minor > 255)
                panic("invalid or no driver minor given");
 
-       if ((r = getuptime(&now)) != OK)
+       if ((r = getticks(&now)) != OK)
                panic("unable to get uptime: %d", r);
 
        srand48(now);