123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- From 48edd768850825a4d01e5e5e737122333fc55cdf Mon Sep 17 00:00:00 2001
- From: Petr Vorel <petr.vorel@gmail.com>
- Date: Fri, 2 Oct 2020 21:29:58 +0200
- Subject: [PATCH] cacheflush01: Rewrite into new API
- This syscall is currently (v5.9) supported on these architectures:
- arc, csky, mips, m68k, nds32, sh
- constants are missing for m68k, not sure if the testcase is valid for it.
- Untested.
- Test for __LTP__NR_INVALID_SYSCALL saves adding autotools check for
- <asm/cachectl.h>.
- Signed-off-by: Petr Vorel <petr.vorel@gmail.com>
- ---
- [ upstream status: https://patchwork.ozlabs.org/project/ltp/patch/20201002202416.28972-1-petr.vorel@gmail.com/ ]
- .../kernel/syscalls/cacheflush/cacheflush01.c | 173 ++++--------------
- 1 file changed, 40 insertions(+), 133 deletions(-)
- diff --git a/testcases/kernel/syscalls/cacheflush/cacheflush01.c b/testcases/kernel/syscalls/cacheflush/cacheflush01.c
- index 29cf2014a..6ad8b953a 100644
- --- a/testcases/kernel/syscalls/cacheflush/cacheflush01.c
- +++ b/testcases/kernel/syscalls/cacheflush/cacheflush01.c
- @@ -1,157 +1,64 @@
- -/******************************************************************************/
- -/* Copyright (c) Maxin John <maxin.john@gmail.com>, 2009 */
- -/* LKML Reference: http://lkml.org/lkml/2009/4/9/203 */
- -/* This program is free software; you can redistribute it and/or modify */
- -/* it under the terms of the GNU General Public License as published by */
- -/* the Free Software Foundation; either version 2 of the License, or */
- -/* (at your option) any later version. */
- -/* */
- -/* This program is distributed in the hope that it will be useful, */
- -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
- -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
- -/* the GNU General Public License for more details. */
- -/* */
- -/* You should have received a copy of the GNU General Public License */
- -/* along with this program; if not, write to the Free Software */
- -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
- -/* */
- -/******************************************************************************/
- -/******************************************************************************/
- -/* */
- -/* File: cacheflush01.c */
- -/* */
- -/* Description: The cacheflush_check() syscall */
- -/* Tests EINVAL error of cacheflush system call. */
- -/* Its expected behaviour is cacheflush() should return -EINVAL */
- -/* when cache parameter is not one of ICACHE, DCACHE, or BCACHE. */
- -/* */
- -/* Usage: <for command-line> */
- -/* cacheflush01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */
- -/* where, -c n : Run n copies concurrently. */
- -/* -e : Turn on errno logging. */
- -/* -i n : Execute test n times. */
- -/* -I x : Execute test for x seconds. */
- -/* -P x : Pause for x seconds between iterations. */
- -/* -t : Turn on syscall timing. */
- -/* */
- -/* Total Tests: 1 */
- -/* */
- -/* Test Name: cacheflush01 */
- -/******************************************************************************/
- +// SPDX-License-Identifier: GPL-2.0-or-later
-
- -#include <unistd.h>
- -#include <stdio.h>
- -#include <stdlib.h>
- -#include <errno.h>
- -
- -#include "test.h"
- +#include "tst_test.h"
- #include "lapi/syscalls.h"
-
- #if __NR_cacheflush != __LTP__NR_INVALID_SYSCALL
- +
- #include <asm/cachectl.h>
- -#else
- +
- +/*
- + * m68k does not have these constants
- + */
- +
- #ifndef ICACHE
- -#define ICACHE (1<<0) /* flush instruction cache */
- +# define ICACHE (1<<0)
- #endif
- +
- #ifndef DCACHE
- -#define DCACHE (1<<1) /* writeback and flush data cache */
- +# define DCACHE (1<<1)
- #endif
- +
- #ifndef BCACHE
- -#define BCACHE (ICACHE|DCACHE) /* flush both caches */
- -#endif
- +# define BCACHE (ICACHE|DCACHE)
- #endif
-
- -char *TCID = "cacheflush01";
- -int TST_TOTAL = 1;
- +#define CACHE_DESC(x) .cache = x, .desc = #x
-
- -/* Extern Global Functions */
- -/******************************************************************************/
- -/* */
- -/* Function: cleanup */
- -/* */
- -/* Description: Performs all one time clean up for this test on successful */
- -/* completion, premature exit or failure. Closes all temporary */
- -/* files, removes all temporary directories exits the test with */
- -/* appropriate return code by calling tst_exit() function. */
- -/* */
- -/* Input: None. */
- -/* */
- -/* Output: None. */
- -/* */
- -/* Return: On failure - Exits calling tst_exit(). Non '0' return code. */
- -/* On success - Exits calling tst_exit(). With '0' return code. */
- -/* */
- -/******************************************************************************/
- -void cleanup(void)
- -{
- +static struct test_case_t {
- + int cache;
- + const char *desc;
- +} test_cases[] = {
- + { CACHE_DESC(ICACHE) },
- + { CACHE_DESC(DCACHE) },
- + { CACHE_DESC(BCACHE) },
- +};
-
- - tst_rmdir();
- -}
- +static char *addr;
-
- -/* Local Functions */
- -/******************************************************************************/
- -/* */
- -/* Function: setup */
- -/* */
- -/* Description: Performs all one time setup for this test. This function is */
- -/* typically used to capture signals, create temporary dirs */
- -/* and temporary files that may be used in the course of this */
- -/* test. */
- -/* */
- -/* Input: None. */
- -/* */
- -/* Output: None. */
- -/* */
- -/* Return: On failure - Exits by calling cleanup(). */
- -/* On success - returns 0. */
- -/* */
- -/******************************************************************************/
- -void setup(void)
- +static void setup(void)
- {
- - /* Capture signals if any */
- - /* Create temporary directories */
- - TEST_PAUSE;
- - tst_tmpdir();
- + addr = SAFE_MALLOC(getpagesize());
- }
-
- -int main(int ac, char **av)
- +static void test_cacheflush(unsigned int i)
- {
- + struct test_case_t *tc = &test_cases[i];
-
- - char *addr = NULL;
- -
- - tst_parse_opts(ac, av, NULL, NULL);
- -
- - setup();
- -
- - tst_count = 0;
- - /* Create some user address range */
- - addr = malloc(getpagesize());
- - if (addr == NULL) {
- - tst_brkm(TFAIL | TTERRNO, cleanup, "malloc failed");
- - }
- -
- - /* Invokes cacheflush() with proper parameters */
- - TEST(ltp_syscall(__NR_cacheflush, addr, getpagesize(), ICACHE));
- - if (TEST_RETURN == 0) {
- - tst_resm(TPASS, "passed with no errno");
- - } else {
- - tst_resm(TFAIL, "failed with unexpected errno");
- - }
- -
- - TEST(ltp_syscall(__NR_cacheflush, addr, getpagesize(), DCACHE));
- - if (TEST_RETURN == 0) {
- - tst_resm(TPASS, "passed with no errno");
- + TEST(tst_syscall(__NR_cacheflush, addr, getpagesize(), tc->cache));
- + if (TST_RET == 0) {
- + tst_res(TPASS, "%s passed", tc->desc);
- } else {
- - tst_resm(TFAIL, "failed with unexpected errno");
- + tst_res(TFAIL | TTERRNO, "%s failed", tc->desc);
- }
- +}
-
- - TEST(ltp_syscall(__NR_cacheflush, addr, getpagesize(), BCACHE));
- - if (TEST_RETURN == 0) {
- - tst_resm(TPASS, "passed with no errno");
- - } else {
- - tst_resm(TFAIL, "failed with unexpected errno");
- - }
- +static struct tst_test test = {
- + .setup = setup,
- + .test = test_cacheflush,
- + .tcnt = ARRAY_SIZE(test_cases),
- +};
-
- - cleanup();
- - tst_exit();
- -}
- +#else
- + TST_TEST_TCONF("system doesn't support cacheflush()");
- +#endif
- --
- 2.28.0
|