| 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 |
| |