new test case for clock_settime64 and clock_gettime64 and reorganize
run_2038.

If you want to trigger and verify y2038 problem, please be careful and
make sure it has no impact to your test device.

Signed-off-by: chensong <[email protected]>

---
v3:
1, rename structs, variables
2, reorganize registration in run_y2038
3, remove unnecessary definitions
---
 testsuite/smokey/y2038/syscall-tests.c | 109 ++++++++++++++++++++++++++++++---
 1 file changed, 102 insertions(+), 7 deletions(-)

diff --git a/testsuite/smokey/y2038/syscall-tests.c 
b/testsuite/smokey/y2038/syscall-tests.c
index 1d61bbd..b927a41 100644
--- a/testsuite/smokey/y2038/syscall-tests.c
+++ b/testsuite/smokey/y2038/syscall-tests.c
@@ -17,6 +17,36 @@
 
 smokey_test_plugin(y2038, SMOKEY_NOARGS, "Validate correct y2038 support");
 
+
+#define TEST_NAME(name) test_ ## name
+struct test_info {
+       char *name;
+       int (*test_fn)(void);
+};
+
+static int test_sc_cobalt_sem_timedwait64(void);
+static int test_sc_cobalt_clock_gettime64(void);
+static int test_sc_cobalt_clock_settime64(void);
+
+static struct test_info test_table[] = {
+       {
+               .name = "sc_cobalt_sem_timedwait64",
+               .test_fn = TEST_NAME(sc_cobalt_sem_timedwait64),
+       },
+       {
+               .name = "sc_cobalt_clock_gettime64",
+               .test_fn = TEST_NAME(sc_cobalt_clock_gettime64),
+       },
+       {
+               .name = "sc_cobalt_clock_settime64",
+               .test_fn = TEST_NAME(sc_cobalt_clock_settime64),
+       },
+       {
+               .name = NULL,
+               .test_fn = NULL,
+       },
+};
+
 /*
  * libc independent data type representing a time64_t based struct timespec
  */
@@ -25,7 +55,8 @@ struct xn_timespec64 {
        int64_t tv_nsec;
 };
 
-#define NSEC_PER_SEC 1000000000
+#define NSEC_PER_SEC           1000000000
+#define USEC_PER_SEC           1000000
 
 static void ts_normalise(struct xn_timespec64 *ts)
 {
@@ -114,10 +145,10 @@ static int test_sc_cobalt_sem_timedwait64(void)
 
        /*
         * The semaphore is already exhausted, so calling again will validate
-        * the provided timeout now. Providing an invalid adress has to deliver
+        * the provided timeout now. Providing an invalid address has to deliver
         * EFAULT
         */
-       ret = syscall(code, &sem, (void*) 0xdeadbeefUL);
+       ret = syscall(code, &sem, (void *)0xdeadbeefUL);
        if (!smokey_assert(ret == -1) || !smokey_assert(errno == EFAULT))
                return errno;
 
@@ -163,13 +194,77 @@ static int test_sc_cobalt_sem_timedwait64(void)
        return 0;
 }
 
+static int test_sc_cobalt_clock_gettime64(void)
+{
+       long ret;
+       int code = __xn_syscode(sc_cobalt_clock_gettime64);
+       struct xn_timespec64 ts64;
+
+       /* Make sure we don't crash because of NULL pointers */
+       ret = syscall(code, NULL, NULL);
+       if (ret == -1 && errno == ENOSYS) {
+               smokey_note("clock_gettime64: 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 timespec*/
+       ret = syscall(code, CLOCK_REALTIME, &ts64);
+       if (!smokey_assert(ret == 0) || !smokey_assert(errno == EFAULT))
+               return errno;
+
+       return 0;
+}
+
+static int test_sc_cobalt_clock_settime64(void)
+{
+       long ret;
+       int code = __xn_syscode(sc_cobalt_clock_settime64);
+       struct xn_timespec64 ts64;
+       struct timespec now;
+
+       /*Get current time and set it back at the end of the test*/
+       clock_gettime(CLOCK_REALTIME, &now);
+
+       /* Make sure we don't crash because of NULL pointers */
+       ret = syscall(code, NULL, NULL);
+       if (ret == -1 && errno == ENOSYS) {
+               smokey_note("clock_settime64: skipped. (no kernel support)");
+               return 0; // Not implemented, nothing to test, success
+       }
+       if (!smokey_assert(ret == -1) || !smokey_assert(errno == EFAULT))
+               goto out;
+
+       /* Providing an invalid address has to deliver EFAULT */
+       ret = syscall(code, CLOCK_REALTIME, (void *)0xdeadbeefUL);
+       if (!smokey_assert(ret == -1) || !smokey_assert(errno == EFAULT))
+               goto out;
+
+       /* Provide a valid 64bit timespec*/
+       ts64.tv_sec  = now.tv_sec;
+       ts64.tv_nsec = now.tv_nsec;
+       ret = syscall(code, CLOCK_REALTIME, &ts64);
+       if (!smokey_assert(ret == 0) || !smokey_assert(errno == EFAULT))
+               goto out;
+
+out:
+       clock_settime(CLOCK_REALTIME, &now);
+       return errno;
+}
+
+
 static int run_y2038(struct smokey_test *t, int argc, char *const argv[])
 {
-       int ret;
+       struct test_info *ti;
 
-       ret = test_sc_cobalt_sem_timedwait64();
-       if (ret)
-               return ret;
+       for (ti = test_table; ti->test_fn != NULL; ti++)
+               ti->test_fn();
 
        return 0;
 }
-- 
2.7.4




Reply via email to