Message type for PM_ time-related calls
- 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
This commit is contained in:
parent
ee2f1ee4cd
commit
1ae60bd2e8
9 changed files with 52 additions and 38 deletions
|
@ -64,14 +64,6 @@
|
||||||
/* Field names for the exit(2) call. */
|
/* Field names for the exit(2) call. */
|
||||||
#define PM_EXIT_STATUS m1_i1 /* int */
|
#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. */
|
/* Field names for the ptrace(2) call. */
|
||||||
#define PM_PTRACE_PID m2_i1 /* pid_t */
|
#define PM_PTRACE_PID m2_i1 /* pid_t */
|
||||||
#define PM_PTRACE_REQ m2_i2 /* int */
|
#define PM_PTRACE_REQ m2_i2 /* int */
|
||||||
|
|
|
@ -145,6 +145,26 @@ typedef struct {
|
||||||
} mess_sigcalls;
|
} mess_sigcalls;
|
||||||
_ASSERT_MSG_SIZE(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 {
|
typedef struct {
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int options;
|
int options;
|
||||||
|
@ -902,6 +922,7 @@ typedef struct {
|
||||||
mess_fs_vfs_readsuper m_fs_vfs_readsuper;
|
mess_fs_vfs_readsuper m_fs_vfs_readsuper;
|
||||||
mess_fs_vfs_readwrite m_fs_vfs_readwrite;
|
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_pm_waitpid m_lc_pm_waitpid;
|
||||||
|
|
||||||
mess_lc_vfs_chown m_lc_vfs_chown;
|
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_copyfd m_lsys_vfs_copyfd;
|
||||||
mess_lsys_vfs_mapdriver m_lsys_vfs_mapdriver;
|
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_lc_waitpid m_pm_lc_waitpid;
|
||||||
|
|
||||||
mess_pm_lsys_getepinfo m_pm_lsys_getepinfo;
|
mess_pm_lsys_getepinfo m_pm_lsys_getepinfo;
|
||||||
|
|
|
@ -15,10 +15,10 @@ int adjtime(const struct timeval *delta, struct timeval *olddelta)
|
||||||
message m;
|
message m;
|
||||||
|
|
||||||
memset(&m, 0, sizeof(m));
|
memset(&m, 0, sizeof(m));
|
||||||
m.PM_TIME_CLK_ID = (clockid_t) CLOCK_REALTIME;
|
m.m_lc_pm_time.clk_id = CLOCK_REALTIME;
|
||||||
m.PM_TIME_NOW = 0; /* use adjtime() method to slowly adjust the clock. */
|
m.m_lc_pm_time.now = 0; /* use adjtime() method to slowly adjust the clock. */
|
||||||
m.PM_TIME_SEC = delta->tv_sec;
|
m.m_lc_pm_time.sec = delta->tv_sec;
|
||||||
m.PM_TIME_NSEC = delta->tv_usec * 1000; /* convert usec to nsec */
|
m.m_lc_pm_time.nsec = delta->tv_usec * 1000; /* convert usec to nsec */
|
||||||
|
|
||||||
if (_syscall(PM_PROC_NR, PM_CLOCK_SETTIME, &m) < 0)
|
if (_syscall(PM_PROC_NR, PM_CLOCK_SETTIME, &m) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -14,13 +14,13 @@ int clock_getres(clockid_t clock_id, struct timespec *res)
|
||||||
message m;
|
message m;
|
||||||
|
|
||||||
memset(&m, 0, sizeof(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)
|
if (_syscall(PM_PROC_NR, PM_CLOCK_GETRES, &m) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
res->tv_sec = m.PM_TIME_SEC;
|
res->tv_sec = m.m_pm_lc_time.sec;
|
||||||
res->tv_nsec = m.PM_TIME_NSEC;
|
res->tv_nsec = m.m_pm_lc_time.nsec;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,13 +14,13 @@ int clock_gettime(clockid_t clock_id, struct timespec *res)
|
||||||
message m;
|
message m;
|
||||||
|
|
||||||
memset(&m, 0, sizeof(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)
|
if (_syscall(PM_PROC_NR, PM_CLOCK_GETTIME, &m) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
res->tv_sec = m.PM_TIME_SEC;
|
res->tv_sec = m.m_pm_lc_time.sec;
|
||||||
res->tv_nsec = m.PM_TIME_NSEC;
|
res->tv_nsec = m.m_pm_lc_time.nsec;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,10 +14,10 @@ int clock_settime(clockid_t clock_id, const struct timespec *ts)
|
||||||
message m;
|
message m;
|
||||||
|
|
||||||
memset(&m, 0, sizeof(m));
|
memset(&m, 0, sizeof(m));
|
||||||
m.PM_TIME_CLK_ID = clock_id;
|
m.m_lc_pm_time.clk_id = clock_id;
|
||||||
m.PM_TIME_NOW = 1; /* set time immediately. don't use adjtime() method. */
|
m.m_lc_pm_time.now = 1; /* set time immediately. don't use adjtime() method. */
|
||||||
m.PM_TIME_SEC = ts->tv_sec;
|
m.m_lc_pm_time.sec = ts->tv_sec;
|
||||||
m.PM_TIME_NSEC = ts->tv_nsec;
|
m.m_lc_pm_time.nsec = ts->tv_nsec;
|
||||||
|
|
||||||
if (_syscall(PM_PROC_NR, PM_CLOCK_SETTIME, &m) < 0)
|
if (_syscall(PM_PROC_NR, PM_CLOCK_SETTIME, &m) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -18,8 +18,8 @@ int gettimeofday(struct timeval *__restrict tp, void *__restrict tzp)
|
||||||
if (_syscall(PM_PROC_NR, PM_GETTIMEOFDAY, &m) < 0)
|
if (_syscall(PM_PROC_NR, PM_GETTIMEOFDAY, &m) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
tp->tv_sec = m.PM_TIME_SEC;
|
tp->tv_sec = m.m_pm_lc_time.sec;
|
||||||
tp->tv_usec = m.PM_TIME_USEC;
|
tp->tv_usec = m.m_pm_lc_time.nsec / 1000;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,6 @@ int stime(time_t *top)
|
||||||
message m;
|
message m;
|
||||||
|
|
||||||
memset(&m, 0, sizeof(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));
|
return(_syscall(PM_PROC_NR, PM_STIME, &m));
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ int do_gettime()
|
||||||
if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
|
if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
|
||||||
panic("do_time couldn't get uptime: %d", s);
|
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:
|
case CLOCK_REALTIME:
|
||||||
clock = realtime;
|
clock = realtime;
|
||||||
break;
|
break;
|
||||||
|
@ -38,8 +38,8 @@ int do_gettime()
|
||||||
return EINVAL; /* invalid/unsupported clock_id */
|
return EINVAL; /* invalid/unsupported clock_id */
|
||||||
}
|
}
|
||||||
|
|
||||||
mp->mp_reply.PM_TIME_SEC = boottime + (clock / system_hz);
|
mp->mp_reply.m_pm_lc_time.sec = boottime + (clock / system_hz);
|
||||||
mp->mp_reply.PM_TIME_NSEC =
|
mp->mp_reply.m_pm_lc_time.nsec =
|
||||||
(uint32_t) ((clock % system_hz) * 1000000000ULL / system_hz);
|
(uint32_t) ((clock % system_hz) * 1000000000ULL / system_hz);
|
||||||
|
|
||||||
return(OK);
|
return(OK);
|
||||||
|
@ -50,12 +50,12 @@ int do_gettime()
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
int do_getres()
|
int do_getres()
|
||||||
{
|
{
|
||||||
switch (m_in.PM_TIME_CLK_ID) {
|
switch (m_in.m_lc_pm_time.clk_id) {
|
||||||
case CLOCK_REALTIME:
|
case CLOCK_REALTIME:
|
||||||
case CLOCK_MONOTONIC:
|
case CLOCK_MONOTONIC:
|
||||||
/* tv_sec is always 0 since system_hz is an int */
|
/* tv_sec is always 0 since system_hz is an int */
|
||||||
mp->mp_reply.PM_TIME_SEC = 0;
|
mp->mp_reply.m_pm_lc_time.sec = 0;
|
||||||
mp->mp_reply.PM_TIME_NSEC = 1000000000 / system_hz;
|
mp->mp_reply.m_pm_lc_time.nsec = 1000000000 / system_hz;
|
||||||
return(OK);
|
return(OK);
|
||||||
default:
|
default:
|
||||||
return EINVAL; /* invalid/unsupported clock_id */
|
return EINVAL; /* invalid/unsupported clock_id */
|
||||||
|
@ -73,10 +73,10 @@ int do_settime()
|
||||||
return(EPERM);
|
return(EPERM);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (m_in.PM_TIME_CLK_ID) {
|
switch (m_in.m_lc_pm_time.clk_id) {
|
||||||
case CLOCK_REALTIME:
|
case CLOCK_REALTIME:
|
||||||
s= sys_settime(m_in.PM_TIME_NOW, m_in.PM_TIME_CLK_ID,
|
s = sys_settime(m_in.m_lc_pm_time.now, m_in.m_lc_pm_time.clk_id,
|
||||||
m_in.PM_TIME_SEC, m_in.PM_TIME_NSEC);
|
m_in.m_lc_pm_time.sec, m_in.m_lc_pm_time.nsec);
|
||||||
return(s);
|
return(s);
|
||||||
case CLOCK_MONOTONIC: /* monotonic cannot be changed */
|
case CLOCK_MONOTONIC: /* monotonic cannot be changed */
|
||||||
default:
|
default:
|
||||||
|
@ -101,9 +101,9 @@ int do_time()
|
||||||
if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
|
if ( (s=getuptime(&ticks, &realtime, &boottime)) != OK)
|
||||||
panic("do_time couldn't get uptime: %d", s);
|
panic("do_time couldn't get uptime: %d", s);
|
||||||
|
|
||||||
mp->mp_reply.PM_TIME_SEC = boottime + (realtime / system_hz);
|
mp->mp_reply.m_pm_lc_time.sec = boottime + (realtime / system_hz);
|
||||||
mp->mp_reply.PM_TIME_USEC =
|
mp->mp_reply.m_pm_lc_time.nsec =
|
||||||
(uint32_t) ((realtime % system_hz) * 1000000ULL / system_hz);
|
(uint32_t) ((realtime % system_hz) * 1000000000ULL / system_hz);
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ int do_stime()
|
||||||
}
|
}
|
||||||
if ( (s=getuptime(&uptime, &realtime, &boottime)) != OK)
|
if ( (s=getuptime(&uptime, &realtime, &boottime)) != OK)
|
||||||
panic("do_stime couldn't get uptime: %d", s);
|
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 */
|
s= sys_stime(boottime); /* Tell kernel about boottime */
|
||||||
if (s != OK)
|
if (s != OK)
|
||||||
|
|
Loading…
Reference in a new issue