summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2020-03-20 04:16:12 +0100
committerDmitry V. Levin <ldv@altlinux.org>2020-04-02 21:05:45 +0000
commit1b400b07962d801289146dde0b41b2ca9e8ab27c (patch)
tree1b144b5a4114618932c92dd91dd6c61bba59e843
parent40eb6d9303d77d02ec652bfbbe6e679248ce8fb1 (diff)
downloadstrace-1b400b07962d801289146dde0b41b2ca9e8ab27c.tar.gz
tests: check decoding of HDIO_* ioctls
* tests/.gitignore: Add ioctl_hdio, ioctl_hdio-success, ioctl_hdio-success-Xabbrev, ioctl_hdio-success-Xraw, ioctl_hdio-success-Xverbose, ioctl_hdio-success-v, ioctl_hdio-success-v-Xabbrev, ioctl_hdio-success-v-Xraw, ioctl_hdio-success-v-Xverbose, ioctl_hdio-Xabbrev, ioctl_hdio-Xraw, ioctl_hdio-Xverbose, ioctl_hdio-v, ioctl_hdio-v-Xabbrev, ioctl_hdio-v-Xraw, and ioctl_hdio-v-Xverbose. * tests/Makefile.am (check_PROGRAMS): Add ioctl_hdio-success, ioctl_hdio-success-Xabbrev, ioctl_hdio-success-Xraw, ioctl_hdio-success-Xverbose, ioctl_hdio-success-v, ioctl_hdio-success-v-Xabbrev, ioctl_hdio-success-v-Xraw, and ioctl_hdio-success-v-Xverbose. * tests/gen_tests.in (ioctl_hdio, ioctl_hdio-Xabbrev, ioctl_hdio-Xraw, ioctl_hdio-Xverbose, ioctl_hdio-v, ioctl_hdio-v-Xabbrev, ioctl_hdio-v-Xraw, ioctl_hdio-v-Xverbose, ioctl_hdio-success, ioctl_hdio-success-Xabbrev, ioctl_hdio-success-Xraw, ioctl_hdio-success-Xverbose, ioctl_hdio-success-v, ioctl_hdio-success-v-Xabbrev, ioctl_hdio-success-v-Xraw, ioctl_hdio-success-v-Xverbose): New tests. * tests/ioctl_hdio.c: New file. * tests/ioctl_hdio-Xabbrev.c: Likewise. * tests/ioctl_hdio-Xraw.c: Likewise. * tests/ioctl_hdio-Xverbose.c: Likewise. * tests/ioctl_hdio-success.c: Likewise. * tests/ioctl_hdio-success-Xabbrev.c: Likewise. * tests/ioctl_hdio-success-Xraw.c: Likewise. * tests/ioctl_hdio-success-Xverbose.c: Likewise. * tests/ioctl_hdio-success-v.c: Likewise. * tests/ioctl_hdio-success-v-Xabbrev.c: Likewise. * tests/ioctl_hdio-success-v-Xraw.c: Likewise. * tests/ioctl_hdio-success-v-Xverbose.c: Likewise. * tests/ioctl_hdio-v.c: Likewise. * tests/ioctl_hdio-v-Xabbrev.c: Likewise. * tests/ioctl_hdio-v-Xraw.c: Likewise. * tests/ioctl_hdio-v-Xverbose.c: Likewise. * tests/pure_executables.list: Add ioctl_hdio, ioctl_hdio-Xabbrev, ioctl_hdio-Xraw, ioctl_hdio-Xverbose, ioctl_hdio-v, ioctl_hdio-v-Xabbrev, ioctl_hdio-v-Xraw, and ioctl_hdio-v-Xverbose.
-rw-r--r--tests/.gitignore16
-rw-r--r--tests/Makefile.am8
-rw-r--r--tests/gen_tests.in16
-rw-r--r--tests/ioctl_hdio-Xabbrev.c2
-rw-r--r--tests/ioctl_hdio-Xraw.c2
-rw-r--r--tests/ioctl_hdio-Xverbose.c2
-rw-r--r--tests/ioctl_hdio-success-Xabbrev.c2
-rw-r--r--tests/ioctl_hdio-success-Xraw.c2
-rw-r--r--tests/ioctl_hdio-success-Xverbose.c2
-rw-r--r--tests/ioctl_hdio-success-v-Xabbrev.c2
-rw-r--r--tests/ioctl_hdio-success-v-Xraw.c2
-rw-r--r--tests/ioctl_hdio-success-v-Xverbose.c2
-rw-r--r--tests/ioctl_hdio-success-v.c2
-rw-r--r--tests/ioctl_hdio-success.c2
-rw-r--r--tests/ioctl_hdio-v-Xabbrev.c2
-rw-r--r--tests/ioctl_hdio-v-Xraw.c2
-rw-r--r--tests/ioctl_hdio-v-Xverbose.c2
-rw-r--r--tests/ioctl_hdio-v.c2
-rw-r--r--tests/ioctl_hdio.c165
-rwxr-xr-xtests/pure_executables.list8
20 files changed, 243 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore
index 2e939123a..66f3695bd 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -200,6 +200,22 @@ ioctl_evdev-v
ioctl_evdev-v-Xabbrev
ioctl_evdev-v-Xraw
ioctl_evdev-v-Xverbose
+ioctl_hdio
+ioctl_hdio-success
+ioctl_hdio-success-Xabbrev
+ioctl_hdio-success-Xraw
+ioctl_hdio-success-Xverbose
+ioctl_hdio-success-v
+ioctl_hdio-success-v-Xabbrev
+ioctl_hdio-success-v-Xraw
+ioctl_hdio-success-v-Xverbose
+ioctl_hdio-Xabbrev
+ioctl_hdio-Xraw
+ioctl_hdio-Xverbose
+ioctl_hdio-v
+ioctl_hdio-v-Xabbrev
+ioctl_hdio-v-Xraw
+ioctl_hdio-v-Xverbose
ioctl_inotify
ioctl_kvm_run
ioctl_kvm_run-v
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4e191b996..a1087fbaa 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -126,6 +126,14 @@ check_PROGRAMS = $(PURE_EXECUTABLES) \
ioctl_evdev-success-v-Xabbrev \
ioctl_evdev-success-v-Xraw \
ioctl_evdev-success-v-Xverbose \
+ ioctl_hdio-success \
+ ioctl_hdio-success-Xabbrev \
+ ioctl_hdio-success-Xraw \
+ ioctl_hdio-success-Xverbose \
+ ioctl_hdio-success-v \
+ ioctl_hdio-success-v-Xabbrev \
+ ioctl_hdio-success-v-Xraw \
+ ioctl_hdio-success-v-Xverbose \
ioctl_loop-nv \
ioctl_loop-v \
ioctl_nsfs \
diff --git a/tests/gen_tests.in b/tests/gen_tests.in
index 04c17b8ae..b866c4593 100644
--- a/tests/gen_tests.in
+++ b/tests/gen_tests.in
@@ -177,6 +177,22 @@ ioctl_evdev-success-v +ioctl_evdev-success.test -a26 -v
ioctl_evdev-success-v-Xabbrev +ioctl_evdev-success.test -v -Xabbrev
ioctl_evdev-success-v-Xraw +ioctl_evdev-success.test -a27 -v -Xraw
ioctl_evdev-success-v-Xverbose +ioctl_evdev-success.test -a43 -v -Xverbose
+ioctl_hdio +ioctl.test -a27
+ioctl_hdio-Xabbrev +ioctl.test -a27 -Xabbrev
+ioctl_hdio-Xraw +ioctl.test -a20 -Xraw
+ioctl_hdio-Xverbose +ioctl.test -a39 -Xverbose
+ioctl_hdio-v +ioctl.test -a27 -v
+ioctl_hdio-v-Xabbrev +ioctl.test -a27 -v -Xabbrev
+ioctl_hdio-v-Xraw +ioctl.test -a20 -v -Xraw
+ioctl_hdio-v-Xverbose +ioctl.test -a39 -v -Xverbose
+ioctl_hdio-success +ioctl-success.sh -a27
+ioctl_hdio-success-Xabbrev +ioctl-success.sh -a27 -Xabbrev
+ioctl_hdio-success-Xraw +ioctl-success.sh -a20 -Xraw
+ioctl_hdio-success-Xverbose +ioctl-success.sh -a39 -Xverbose
+ioctl_hdio-success-v +ioctl-success.sh -a27 -v
+ioctl_hdio-success-v-Xabbrev +ioctl-success.sh -a27 -v -Xabbrev
+ioctl_hdio-success-v-Xraw +ioctl-success.sh -a20 -v -Xraw
+ioctl_hdio-success-v-Xverbose +ioctl-success.sh -a39 -v -Xverbose
ioctl_inotify +ioctl.test
ioctl_kvm_run +ioctl.test -a36 -y
ioctl_kvm_run-v +ioctl.test -v -a36 -y
diff --git a/tests/ioctl_hdio-Xabbrev.c b/tests/ioctl_hdio-Xabbrev.c
new file mode 100644
index 000000000..aa0af2acd
--- /dev/null
+++ b/tests/ioctl_hdio-Xabbrev.c
@@ -0,0 +1,2 @@
+#define XLAT_ABBREV 1
+#include "ioctl_hdio.c"
diff --git a/tests/ioctl_hdio-Xraw.c b/tests/ioctl_hdio-Xraw.c
new file mode 100644
index 000000000..9e169a85d
--- /dev/null
+++ b/tests/ioctl_hdio-Xraw.c
@@ -0,0 +1,2 @@
+#define XLAT_RAW 1
+#include "ioctl_hdio.c"
diff --git a/tests/ioctl_hdio-Xverbose.c b/tests/ioctl_hdio-Xverbose.c
new file mode 100644
index 000000000..29e45e8e0
--- /dev/null
+++ b/tests/ioctl_hdio-Xverbose.c
@@ -0,0 +1,2 @@
+#define XLAT_VERBOSE 1
+#include "ioctl_hdio.c"
diff --git a/tests/ioctl_hdio-success-Xabbrev.c b/tests/ioctl_hdio-success-Xabbrev.c
new file mode 100644
index 000000000..410f1969c
--- /dev/null
+++ b/tests/ioctl_hdio-success-Xabbrev.c
@@ -0,0 +1,2 @@
+#define XLAT_ABBREV 1
+#include "ioctl_hdio-success.c"
diff --git a/tests/ioctl_hdio-success-Xraw.c b/tests/ioctl_hdio-success-Xraw.c
new file mode 100644
index 000000000..ee63bb8b1
--- /dev/null
+++ b/tests/ioctl_hdio-success-Xraw.c
@@ -0,0 +1,2 @@
+#define XLAT_RAW 1
+#include "ioctl_hdio-success.c"
diff --git a/tests/ioctl_hdio-success-Xverbose.c b/tests/ioctl_hdio-success-Xverbose.c
new file mode 100644
index 000000000..bef62b06b
--- /dev/null
+++ b/tests/ioctl_hdio-success-Xverbose.c
@@ -0,0 +1,2 @@
+#define XLAT_VERBOSE 1
+#include "ioctl_hdio-success.c"
diff --git a/tests/ioctl_hdio-success-v-Xabbrev.c b/tests/ioctl_hdio-success-v-Xabbrev.c
new file mode 100644
index 000000000..13745378d
--- /dev/null
+++ b/tests/ioctl_hdio-success-v-Xabbrev.c
@@ -0,0 +1,2 @@
+#define XLAT_ABBREV 1
+#include "ioctl_hdio-success-v.c"
diff --git a/tests/ioctl_hdio-success-v-Xraw.c b/tests/ioctl_hdio-success-v-Xraw.c
new file mode 100644
index 000000000..c34ad5850
--- /dev/null
+++ b/tests/ioctl_hdio-success-v-Xraw.c
@@ -0,0 +1,2 @@
+#define XLAT_RAW 1
+#include "ioctl_hdio-success-v.c"
diff --git a/tests/ioctl_hdio-success-v-Xverbose.c b/tests/ioctl_hdio-success-v-Xverbose.c
new file mode 100644
index 000000000..4f44b496d
--- /dev/null
+++ b/tests/ioctl_hdio-success-v-Xverbose.c
@@ -0,0 +1,2 @@
+#define XLAT_VERBOSE 1
+#include "ioctl_hdio-success-v.c"
diff --git a/tests/ioctl_hdio-success-v.c b/tests/ioctl_hdio-success-v.c
new file mode 100644
index 000000000..f48ca935d
--- /dev/null
+++ b/tests/ioctl_hdio-success-v.c
@@ -0,0 +1,2 @@
+#define VERBOSE 1
+#include "ioctl_hdio-success.c"
diff --git a/tests/ioctl_hdio-success.c b/tests/ioctl_hdio-success.c
new file mode 100644
index 000000000..680d7033a
--- /dev/null
+++ b/tests/ioctl_hdio-success.c
@@ -0,0 +1,2 @@
+#define INJECT_RETVAL 42
+#include "ioctl_hdio.c"
diff --git a/tests/ioctl_hdio-v-Xabbrev.c b/tests/ioctl_hdio-v-Xabbrev.c
new file mode 100644
index 000000000..86aca7d65
--- /dev/null
+++ b/tests/ioctl_hdio-v-Xabbrev.c
@@ -0,0 +1,2 @@
+#define XLAT_ABBREV 1
+#include "ioctl_hdio-v.c"
diff --git a/tests/ioctl_hdio-v-Xraw.c b/tests/ioctl_hdio-v-Xraw.c
new file mode 100644
index 000000000..e55841aac
--- /dev/null
+++ b/tests/ioctl_hdio-v-Xraw.c
@@ -0,0 +1,2 @@
+#define XLAT_RAW 1
+#include "ioctl_hdio-v.c"
diff --git a/tests/ioctl_hdio-v-Xverbose.c b/tests/ioctl_hdio-v-Xverbose.c
new file mode 100644
index 000000000..00b524eb2
--- /dev/null
+++ b/tests/ioctl_hdio-v-Xverbose.c
@@ -0,0 +1,2 @@
+#define XLAT_VERBOSE 1
+#include "ioctl_hdio-v.c"
diff --git a/tests/ioctl_hdio-v.c b/tests/ioctl_hdio-v.c
new file mode 100644
index 000000000..fcff67021
--- /dev/null
+++ b/tests/ioctl_hdio-v.c
@@ -0,0 +1,2 @@
+#define VERBOSE 1
+#include "ioctl_hdio.c"
diff --git a/tests/ioctl_hdio.c b/tests/ioctl_hdio.c
new file mode 100644
index 000000000..51163b8da
--- /dev/null
+++ b/tests/ioctl_hdio.c
@@ -0,0 +1,165 @@
+/*
+ * Check HDIO_* ioctl decoding.
+ *
+ * Copyright (c) 2020 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <linux/hdreg.h>
+#include <sys/ioctl.h>
+
+static const char *errstr;
+
+static long
+do_ioctl(kernel_ulong_t cmd, kernel_ulong_t arg)
+{
+ long rc = ioctl(-1, cmd, arg);
+
+ errstr = sprintrc(rc);
+
+#ifdef INJECT_RETVAL
+ if (rc != INJECT_RETVAL)
+ error_msg_and_fail("Got a return value of %ld != %ld",
+ rc, (long) INJECT_RETVAL);
+
+ static char inj_errstr[4096];
+
+ snprintf(inj_errstr, sizeof(inj_errstr), "%s (INJECTED)", errstr);
+ errstr = inj_errstr;
+#endif
+
+ return rc;
+}
+
+static inline long
+do_ioctl_ptr(kernel_ulong_t cmd, const void *arg)
+{
+ return do_ioctl(cmd, (uintptr_t) arg);
+}
+
+int
+main(int argc, char *argv[])
+{
+#ifdef INJECT_RETVAL
+ unsigned long num_skip;
+ bool locked = false;
+
+ if (argc < 2)
+ error_msg_and_fail("Usage: %s NUM_SKIP", argv[0]);
+
+ num_skip = strtoul(argv[1], NULL, 0);
+
+ for (size_t i = 0; i < num_skip; i++) {
+ long ret = ioctl(-1, HDIO_GET_UNMASKINTR, 0);
+
+ printf("ioctl(-1, %s, 0) = %s%s\n",
+ XLAT_STR(HDIO_GET_UNMASKINTR), sprintrc(ret),
+ ret == INJECT_RETVAL ? " (INJECTED)" : "");
+
+ if (ret != INJECT_RETVAL)
+ continue;
+
+ locked = true;
+ break;
+ }
+
+ if (!locked)
+ error_msg_and_fail("Hasn't locked on ioctl(-1"
+ ", HDIO_GET_UNMASKINTR, 0) returning %d",
+ INJECT_RETVAL);
+#endif
+
+ long rc;
+
+ /* Decoding is not supported */
+ static const struct {
+ uint32_t cmd;
+ const char *str;
+ } unsupp_cmds[] = {
+ { ARG_STR(HDIO_GET_UNMASKINTR) },
+ { ARG_STR(HDIO_GET_MULTCOUNT) },
+ { ARG_STR(HDIO_GET_QDMA) },
+ { ARG_STR(HDIO_SET_XFER) },
+ { ARG_STR(HDIO_OBSOLETE_IDENTITY) },
+ { ARG_STR(HDIO_GET_KEEPSETTINGS) },
+ { ARG_STR(HDIO_GET_32BIT) },
+ { ARG_STR(HDIO_GET_NOWERR) },
+ { ARG_STR(HDIO_GET_DMA) },
+ { ARG_STR(HDIO_GET_NICE) },
+ { ARG_STR(HDIO_GET_IDENTITY) },
+ { ARG_STR(HDIO_GET_WCACHE) },
+ { ARG_STR(HDIO_GET_ACOUSTIC) },
+ { ARG_STR(HDIO_GET_ADDRESS) },
+ { ARG_STR(HDIO_GET_BUSSTATE) },
+ { ARG_STR(HDIO_TRISTATE_HWIF) },
+ { ARG_STR(HDIO_DRIVE_RESET) },
+ { ARG_STR(HDIO_DRIVE_TASKFILE) },
+ { ARG_STR(HDIO_DRIVE_TASK) },
+ { ARG_STR(HDIO_DRIVE_CMD) },
+ { ARG_STR(HDIO_SET_MULTCOUNT) },
+ { ARG_STR(HDIO_SET_UNMASKINTR) },
+ { ARG_STR(HDIO_SET_KEEPSETTINGS) },
+ { ARG_STR(HDIO_SET_32BIT) },
+ { ARG_STR(HDIO_SET_NOWERR) },
+ { ARG_STR(HDIO_SET_DMA) },
+ { ARG_STR(HDIO_SET_PIO_MODE) },
+ { ARG_STR(HDIO_SCAN_HWIF) },
+ { ARG_STR(HDIO_UNREGISTER_HWIF) },
+ { ARG_STR(HDIO_SET_NICE) },
+ { ARG_STR(HDIO_SET_WCACHE) },
+ { ARG_STR(HDIO_SET_ACOUSTIC) },
+ { ARG_STR(HDIO_SET_BUSSTATE) },
+ { ARG_STR(HDIO_SET_QDMA) },
+ { ARG_STR(HDIO_SET_ADDRESS) },
+ };
+
+ for (size_t i = 0; i < ARRAY_SIZE(unsupp_cmds); i++) {
+ do_ioctl(unsupp_cmds[i].cmd, 0);
+ printf("ioctl(-1, " XLAT_FMT ", 0) = %s\n",
+ XLAT_SEL(unsupp_cmds[i].cmd, unsupp_cmds[i].str),
+ errstr);
+
+ do_ioctl(unsupp_cmds[i].cmd,
+ (unsigned long) 0xbadc0deddeadc0deULL);
+ printf("ioctl(-1, " XLAT_FMT ", %#lx) = %s\n",
+ XLAT_SEL(unsupp_cmds[i].cmd, unsupp_cmds[i].str),
+ (unsigned long) 0xbadc0deddeadc0deULL, errstr);
+ }
+
+
+ /* HDIO_GETGEO */
+ do_ioctl(HDIO_GETGEO, 0);
+ printf("ioctl(-1, %s, NULL) = %s\n",
+ XLAT_STR(HDIO_GETGEO), errstr);
+
+ TAIL_ALLOC_OBJECT_CONST_PTR(struct hd_geometry, p_hd_geom);
+
+ p_hd_geom->heads = 0xca;
+ p_hd_geom->sectors = 0xfe;
+ p_hd_geom->cylinders = 0xbabe;
+ p_hd_geom->start = (unsigned long) 0xbadc0deddeadfaceULL;
+
+ do_ioctl_ptr(HDIO_GETGEO, (char *) p_hd_geom + 1);
+ printf("ioctl(-1, %s, %p) = %s\n",
+ XLAT_STR(HDIO_GETGEO), (char *) p_hd_geom + 1, errstr);
+
+ rc = do_ioctl_ptr(HDIO_GETGEO, p_hd_geom);
+ printf("ioctl(-1, %s, ", XLAT_STR(HDIO_GETGEO));
+ if (rc >= 0) {
+ printf("{heads=202, sectors=254, cylinders=47806, start=%lu}",
+ (unsigned long) 0xbadc0deddeadfaceULL);
+ } else {
+ printf("%p", p_hd_geom);
+ }
+ printf(") = %s\n", errstr);
+
+ puts("+++ exited with 0 +++");
+ return 0;
+}
diff --git a/tests/pure_executables.list b/tests/pure_executables.list
index 4f2fae450..1820d6e31 100755
--- a/tests/pure_executables.list
+++ b/tests/pure_executables.list
@@ -149,6 +149,14 @@ ioctl_evdev-v
ioctl_evdev-v-Xabbrev
ioctl_evdev-v-Xraw
ioctl_evdev-v-Xverbose
+ioctl_hdio
+ioctl_hdio-Xabbrev
+ioctl_hdio-Xraw
+ioctl_hdio-Xverbose
+ioctl_hdio-v
+ioctl_hdio-v-Xabbrev
+ioctl_hdio-v-Xraw
+ioctl_hdio-v-Xverbose
ioctl_inotify
ioctl_kvm_run
ioctl_kvm_run-v