diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2020-03-20 04:16:12 +0100 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2020-04-02 21:05:45 +0000 |
commit | 1b400b07962d801289146dde0b41b2ca9e8ab27c (patch) | |
tree | 1b144b5a4114618932c92dd91dd6c61bba59e843 | |
parent | 40eb6d9303d77d02ec652bfbbe6e679248ce8fb1 (diff) | |
download | strace-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/.gitignore | 16 | ||||
-rw-r--r-- | tests/Makefile.am | 8 | ||||
-rw-r--r-- | tests/gen_tests.in | 16 | ||||
-rw-r--r-- | tests/ioctl_hdio-Xabbrev.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-Xraw.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-Xverbose.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success-Xabbrev.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success-Xraw.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success-Xverbose.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success-v-Xabbrev.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success-v-Xraw.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success-v-Xverbose.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success-v.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-success.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-v-Xabbrev.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-v-Xraw.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-v-Xverbose.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio-v.c | 2 | ||||
-rw-r--r-- | tests/ioctl_hdio.c | 165 | ||||
-rwxr-xr-x | tests/pure_executables.list | 8 |
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 |