在 2021/6/1 下午8:16, Florian Bezdeka 写道:
On 29.04.21 09:45, Song Chen wrote:
add test case for clock_adjtime64 in testsuite

Signed-off-by: Song Chen <chensong_2...@189.cn>
---
  testsuite/smokey/y2038/syscall-tests.c | 71 ++++++++++++++++++++++++++++++++++
  1 file changed, 71 insertions(+)

diff --git a/testsuite/smokey/y2038/syscall-tests.c 
b/testsuite/smokey/y2038/syscall-tests.c
index c59a9d6..22fd9b6 100644
--- a/testsuite/smokey/y2038/syscall-tests.c
+++ b/testsuite/smokey/y2038/syscall-tests.c
@@ -25,6 +25,43 @@ struct xn_timespec64 {
        int64_t tv_nsec;
  };
+struct xn_timex_timeval {
+       int64_t tv_sec;
+       int64_t tv_usec;
+};
+
+struct xn_timex64 {
+       unsigned int modes;     /* mode selector */
+       int:32;            /* pad */
+       long long offset;       /* time offset (usec) */
+       long long freq; /* frequency offset (scaled ppm) */
+       long long maxerror;/* maximum error (usec) */
+       long long esterror;/* estimated error (usec) */
+       int status;             /* clock command/status */
+       int:32;            /* pad */
+       long long constant;/* pll time constant */
+       long long precision;/* clock precision (usec) (read only) */
+       long long tolerance;/* clock frequency tolerance (ppm) (read only) */
+       struct xn_timex_timeval time;   /* (read only, except for 
ADJ_SETOFFSET) */
+       long long tick; /* (modified) usecs between clock ticks */
+
+       long long ppsfreq;/* pps frequency (scaled ppm) (ro) */
+       long long jitter; /* pps jitter (us) (ro) */
+       int shift;              /* interval duration (s) (shift) (ro) */
+       int:32;            /* pad */
+       long long stabil;            /* pps stability (scaled ppm) (ro) */
+       long long jitcnt; /* jitter limit exceeded (ro) */
+       long long calcnt; /* calibration intervals (ro) */
+       long long errcnt; /* calibration errors (ro) */
+       long long stbcnt; /* stability limit exceeded (ro) */
+
+       int tai;                /* TAI offset (ro) */
+
+       int:32; int:32; int:32; int:32;
+       int:32; int:32; int:32; int:32;
+       int:32; int:32; int:32;
+};
+
  #define NSEC_PER_SEC 1000000000
static void ts_normalise(struct xn_timespec64 *ts)
@@ -326,6 +363,36 @@ static int test_sc_cobalt_clock_getres64(void)
        return 0;
  }
+static int test_sc_cobalt_clock_adjtime64(void)
+{
+       long ret;
+       int code = __xn_syscode(sc_cobalt_clock_adjtime64);
+       struct xn_timex64 tx64 = {};
+
+       /* Make sure we don't crash because of NULL pointers */
+       ret = syscall(code, NULL, NULL);
+       if (ret == -1 && errno == ENOSYS) {
+               smokey_note("clock_adjtime64: skipped. (no kernel support)");
+               return 0; // Not implemented, nothing to test, success
+       }
+       if (!smokey_assert(ret == -1) || !smokey_assert(errno == EFAULT))
+               return errno;
+
+       /* Providing an invalid address has to deliver EFAULT */
+       ret = syscall(code, CLOCK_REALTIME, (void *)0xdeadbeefUL);
+       if (!smokey_assert(ret == -1) || !smokey_assert(errno == EFAULT))
+               return errno;
+
+       /* Provide a valid 64bit timex*/
+       tx64.modes = ADJ_SETOFFSET;
+       tx64.time.tv_usec = 123;
+       ret = syscall(code, CLOCK_REALTIME, &tx64);

In int __cobalt_clock_adjtime() we have

        switch (clock_id) {
        case CLOCK_REALTIME:
        case CLOCK_MONOTONIC:
        case CLOCK_MONOTONIC_RAW:
        case CLOCK_HOST_REALTIME:
                return -EOPNOTSUPP;

So the test-failure I see on x86 is fully expected. How did you get this
test running successfully?

In this revision, i got this:
root@kylin-Lenovo:/home/kylin/workspace/y2038/xenomai-hacker-space# ./testsuite/smokey/smokey --run=27
syscall-tests.c:391, assertion failed: !ret
/home/kylin/workspace/y2038/xenomai-hacker-space/testsuite/smokey/.libs/lt-smokey: test y2038 failed: Unknown error -95 (which is EOPNOTSUPP)

In my last revision, which replaced syscall with XENOMAI_SYSCALL, it returns -95, i'm afraid it will terminate smokey test, i turned it to if !smokey_assert(ret) for now.

when __cobalt_clock_adjtime becomes supported, i will turn it back.



+       if (!smokey_assert(!ret))
+               return errno;
+
+       return 0;
+}
+
  static int run_y2038(struct smokey_test *t, int argc, char *const argv[])
  {
@@ -351,5 +418,9 @@ static int run_y2038(struct smokey_test *t, int argc, char *const argv[])
        if (ret)
                return ret;
+ ret = test_sc_cobalt_clock_adjtime64();
+       if (ret)
+               return ret;
+
        return 0;
  }




Reply via email to