Message ID | 20240419070717.2506101-1-lufei@uniontech.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [v2] Add case about arch_prctl syscall. | expand |
Hi! First of all do 'make check' in the directory with the test source and fix all errors and warnings. > Signed-off-by: Lu Fei <lufei@uniontech.com> > --- > configure.ac | 1 + > .../kernel/syscalls/arch_prctl/.gitignore | 1 + > testcases/kernel/syscalls/arch_prctl/Makefile | 8 +++ > .../kernel/syscalls/arch_prctl/arch_prctl01.c | 56 +++++++++++++++++++ This is missing a runtest entry, i.e. line in the runtest/syscalls file that tells the test execution framework to run the test. > 4 files changed, 66 insertions(+) > create mode 100644 testcases/kernel/syscalls/arch_prctl/.gitignore > create mode 100644 testcases/kernel/syscalls/arch_prctl/Makefile > create mode 100644 testcases/kernel/syscalls/arch_prctl/arch_prctl01.c > > diff --git a/configure.ac b/configure.ac > index 1d7e862d8..0dcaddc0f 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -41,6 +41,7 @@ AC_CHECK_DECLS([SEM_STAT_ANY],,,[#include <sys/sem.h>]) > > AC_CHECK_HEADERS_ONCE([ \ > asm/ldt.h \ > + asm/prctl.h \ > cpuid.h \ > emmintrin.h \ > ifaddrs.h \ > diff --git a/testcases/kernel/syscalls/arch_prctl/.gitignore b/testcases/kernel/syscalls/arch_prctl/.gitignore > new file mode 100644 > index 000000000..24871e249 > --- /dev/null > +++ b/testcases/kernel/syscalls/arch_prctl/.gitignore > @@ -0,0 +1 @@ > +/arch_prctl01 > diff --git a/testcases/kernel/syscalls/arch_prctl/Makefile b/testcases/kernel/syscalls/arch_prctl/Makefile > new file mode 100644 > index 000000000..272949d57 > --- /dev/null > +++ b/testcases/kernel/syscalls/arch_prctl/Makefile > @@ -0,0 +1,8 @@ > +# SPDX-License-Identifier: GPL-2.0-or-later > +# Copyright (c) UnionTech Software Technology Co.,Ltd. 2024 > + > +top_srcdir ?= ../../../.. > + > +include $(top_srcdir)/include/mk/testcases.mk > + > +include $(top_srcdir)/include/mk/generic_leaf_target.mk > diff --git a/testcases/kernel/syscalls/arch_prctl/arch_prctl01.c b/testcases/kernel/syscalls/arch_prctl/arch_prctl01.c > new file mode 100644 > index 000000000..06b3d99b8 > --- /dev/null > +++ b/testcases/kernel/syscalls/arch_prctl/arch_prctl01.c > @@ -0,0 +1,56 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (c) UnionTech Software Technology Co.,Ltd., 2024 > + * Author: Lu Fei <lufei@uniontech.com> > + */ > + > +/* This has to be /*\ so that the docparse comment gets picked up by the documentation parser and shows up in docparse/metadata.html > + * [Description] > + * > + * Simple test on arch_prctl to set and get cpuid instruction of test thread. > + */ > + > +# include "tst_test.h" > +# include "lapi/syscalls.h" > +# include <stdlib.h> > +# ifdef HAVE_ASM_PRCTL_H > +# include <asm/prctl.h> No spaces after # here please. > +static int arch_prctl_get(int code, unsigned long *addr) { > + return tst_syscall(__NR_arch_prctl, code, *addr); > +} > + > +static int arch_prctl_set(int code, unsigned long addr) { > + return tst_syscall(__NR_arch_prctl, code, addr); > +} > + > +static int tc[] = {0,1}; > + > +static void run(unsigned int index){ > + > + unsigned long *addr = malloc(sizeof(long)); This does not need to be allocated, we can just do unsigned long addr and pass &addr to the calls. > + TEST(arch_prctl_set(ARCH_SET_CPUID, tc[index])); > + > + if (TST_RET == 0) > + tst_res(TPASS, "set %s cpuid",tc[index] ? "enable" : "disable"); > + else > + tst_res(TFAIL, "failed to set cpuid"); This should use TST_EXP_PASS(arch_prctl_set(...)) > + TEST(arch_prctl_get(ARCH_GET_CPUID, addr)); This as well. > + if (TST_RET == tc[index]) This is wrong, the value should be stored the addr parameter, TST_RET should be 0 on success. > + tst_res(TPASS, "get cpuid succeed."); > + else > + tst_res(TFAIL, "get cpuid failed."); > +} > + > +static struct tst_test test = { > + .test = run, > + .tcnt = 2, > + .min_kver = "4.11", This should have .supported_archs = {"x86", "x86-64", NULL}, > +}; > + > +#else /* HAVE_ASM_PRCTL_H */ > +TST_TEST_TCONF("missing <asm/prctl.h>"); > +#endif > -- > 2.39.3 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp
Hi Cyril. Thanks for you quickly response. Some of your point has been fixed. Some are not: 1. I'm using gcc (GCC) 11.4.1 20230605, `addr` without initialization would output some warnings. 2. I read the manpage of arch_prctl, the ARCH_GET_CPUID seems return the flag, instead of storing `addr`: ``` ARCH_GET_CPUID (since Linux 4.12) Return the setting of the flag manipulated by ARCH_SET_CPUID as the result of the system call (1 for enabled, 0 for disabled). addr is ignored. ``` I'm not sure if this is a problem of my environment.
Hi! > Some of your point has been fixed. Some are not: > 1. I'm using gcc (GCC) 11.4.1 20230605, `addr` without initialization would output some warnings. > 2. I read the manpage of arch_prctl, the ARCH_GET_CPUID seems return the flag, instead of storing `addr`: > ``` > ARCH_GET_CPUID (since Linux 4.12) > Return the setting of the flag manipulated by ARCH_SET_CPUID as the result of the system call (1 for enabled, 0 for > disabled). addr is ignored. > ``` Ah right, if addr is ignored just pass NULL there instead.
I tried using NULL, but met `TBROK: Test killed by SIGSEGV!`.
And the last time you mentioned in response to using `supported_archs`, this seems not work properly by now, the ltp document(section of writing_tests) says "not applicable".
路斐 Fei.Lu
平台测试部 高级测试开发工程师
统信软件
企业官网:www.uniontech.com
联系方式:18501012352
办公地址:西安市雁塔区云水一路与天谷八路口软件新城二期C2-20层
------------------ Original ------------------
From: "Cyril Hrubis";
Date: 2024年4月26日(星期五) 上午8:37
To: "lufei";
Cc: "ltp";
Subject: Re:
Hi!
> Some of your point has been fixed. Some are not:
> 1. I'm using gcc (GCC) 11.4.1 20230605, `addr` without initialization would output some warnings.
> 2. I read the manpage of arch_prctl, the ARCH_GET_CPUID seems return the flag, instead of storing `addr`:
> ```
> ARCH_GET_CPUID (since Linux 4.12)
> Return the setting of the flag manipulated by ARCH_SET_CPUID as the result of the system call (1 for enabled, 0 for
> disabled). addr is ignored.
> ```
Ah right, if addr is ignored just pass NULL there instead.
Hi! > I tried using NULL, but met `TBROK: Test killed by SIGSEGV!`. That means that the manual page is wrong and the address is not ignored. > And the last time you mentioned in response to using > `supported_archs`, this seems not work properly by now, the ltp > document(section of writing_tests) says "not applicable". The supported_archs is supposed to work. How did you set it (the value) and what happened?
Hi, Cyril.
Here is my case:
```
[root@rocky arch_prctl]# gcc --version
gcc (GCC) 11.4.1 20230605 (Red Hat 11.4.1-2)
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@rocky arch_prctl]# uname -a
Linux rocky 5.14.0-362.18.1.el9_3.0.1.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Feb 11 13:49:23 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
[root@rocky arch_prctl]# cat arch_prctl01.c
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) UnionTech Software Technology Co.,Ltd., 2024
* Author: Lu Fei <lufei@uniontech.com>
*/
/*\
* [Description]
*
* Simple test on arch_prctl to set and get cpuid instruction of test thread.
*/
#include "tst_test.h"
#include "lapi/syscalls.h"
#include <stdlib.h>
#ifdef HAVE_ASM_PRCTL_H
#include <asm/prctl.h>
static int arch_prctl_get(int code, unsigned long *addr)
{
return tst_syscall(__NR_arch_prctl, code, *addr);
}
static int arch_prctl_set(int code, unsigned long addr)
{
return tst_syscall(__NR_arch_prctl, code, addr);
}
static void run(unsigned int index)
{
unsigned long *addr = malloc(sizeof(long));
// index == 0 for disable cpuid, 1 for enable cpuid.
TST_EXP_PASS(arch_prctl_set(ARCH_SET_CPUID, index));
TEST(arch_prctl_get(ARCH_GET_CPUID, addr));
if (TST_RET == index)
tst_res(TPASS, "get cpuid succeed.");
else
tst_res(TFAIL, "get cpuid failed.");
}
static struct tst_test test = {
.test = run,
.tcnt = 2,
.min_kver = "4.12",
.supported_archs = {"x86_64", "x86", NULL},
};
#else /* HAVE_ASM_PRCTL_H */
TST_TEST_TCONF("missing <asm/prctl.h>");
#endif
[root@rocky arch_prctl]# make clean
rm -f -f -r arch_prctl01 *.o *.pyc .cache.mk *.dwo .*.dwo
[root@rocky arch_prctl]# make check
CHECK testcases/kernel/syscalls/arch_prctl/arch_prctl01.c
arch_prctl01.c:48:10: warning: bogus scalar initializer
[root@rocky arch_prctl]# make
make -C "/root/Develop/ltp/lib" -f "/root/Develop/ltp/lib/Makefile" all
make[1]: Entering directory '/root/Develop/ltp/lib'
GEN ltp-version.h
make[2]: Nothing to be done for 'all'.
make[2]: Nothing to be done for 'all'.
make[1]: Leaving directory '/root/Develop/ltp/lib'
arch_prctl01.c:48:9: warning: braces around scalar initializer
48 | .supported_archs = {"x86_64", "x86", NULL},
| ^
arch_prctl01.c:48:9: note: (near initialization for ‘test.supported_archs’)
arch_prctl01.c:48:29: warning: initialization of ‘const char * const*’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
48 | .supported_archs = {"x86_64", "x86", NULL},
| ^~~~~~~~
arch_prctl01.c:48:29: note: (near initialization for ‘test.supported_archs’)
arch_prctl01.c:48:39: warning: excess elements in scalar initializer
48 | .supported_archs = {"x86_64", "x86", NULL},
| ^~~~~
arch_prctl01.c:48:39: note: (near initialization for ‘test.supported_archs’)
arch_prctl01.c:48:46: warning: excess elements in scalar initializer
48 | .supported_archs = {"x86_64", "x86", NULL},
| ^~~~
arch_prctl01.c:48:46: note: (near initialization for ‘test.supported_archs’)
CC testcases/kernel/syscalls/arch_prctl/arch_prctl01
```
路斐 Fei.Lu
Uniontech Technology
site: www.uniontech.com
tel: 18501012352
addr: Xi'an China
------------------ Original ------------------
From: "Cyril Hrubis"<chrubis@suse.cz>;
Date: Fri, Apr 26, 2024 06:30 PM
To: "路斐"<lufei@uniontech.com>;
Cc: "ltp"<ltp@lists.linux.it>;
Subject: Re: Re:
Hi!
> I tried using NULL, but met `TBROK: Test killed by SIGSEGV!`.&nbsp;
That means that the manual page is wrong and the address is not ignored.
> And the last time you mentioned in response to using
> `supported_archs`, this seems not work properly by now, the ltp
> document(section of writing_tests) says "not applicable".
The supported_archs is supposed to work. How did you set it (the value)
and what happened?
On Fri, Apr 26, 2024 at 2:27 PM 路斐 <lufei@uniontech.com> wrote: > > Hi, Cyril. > Here is my case: > > > ``` > [root@rocky arch_prctl]# gcc --version > gcc (GCC) 11.4.1 20230605 (Red Hat 11.4.1-2) > Copyright (C) 2021 Free Software Foundation, Inc. > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > > [root@rocky arch_prctl]# uname -a > Linux rocky 5.14.0-362.18.1.el9_3.0.1.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Feb 11 13:49:23 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux > > [root@rocky arch_prctl]# cat arch_prctl01.c > // SPDX-License-Identifier: GPL-2.0-or-later > /* > * Copyright (c) UnionTech Software Technology Co.,Ltd., 2024 > * Author: Lu Fei <lufei@uniontech.com> > */ > > > /*\ > * [Description] > * > * Simple test on arch_prctl to set and get cpuid instruction of test thread. > */ > > > #include "tst_test.h" > #include "lapi/syscalls.h" > #include <stdlib.h> > #ifdef HAVE_ASM_PRCTL_H > #include <asm/prctl.h> > > > static int arch_prctl_get(int code, unsigned long *addr) > { > return tst_syscall(__NR_arch_prctl, code, *addr); ^^ you are de-refencing here, while kernel expects a pointer > } > > > static int arch_prctl_set(int code, unsigned long addr) > { > return tst_syscall(__NR_arch_prctl, code, addr); > } > > > static void run(unsigned int index) > { > unsigned long *addr = malloc(sizeof(long)); > > > // index == 0 for disable cpuid, 1 for enable cpuid. > TST_EXP_PASS(arch_prctl_set(ARCH_SET_CPUID, index)); > > > TEST(arch_prctl_get(ARCH_GET_CPUID, addr)); > > > if (TST_RET == index) > tst_res(TPASS, "get cpuid succeed."); > else > tst_res(TFAIL, "get cpuid failed."); > } > > > static struct tst_test test = { > .test = run, > .tcnt = 2, > .min_kver = "4.12", > .supported_archs = {"x86_64", "x86", NULL}, > }; > > > #else /* HAVE_ASM_PRCTL_H */ > TST_TEST_TCONF("missing <asm/prctl.h>"); > #endif > [root@rocky arch_prctl]# make clean > rm -f -f -r arch_prctl01 *.o *.pyc .cache.mk *.dwo .*.dwo > [root@rocky arch_prctl]# make check > CHECK testcases/kernel/syscalls/arch_prctl/arch_prctl01.c > arch_prctl01.c:48:10: warning: bogus scalar initializer > [root@rocky arch_prctl]# make > make -C "/root/Develop/ltp/lib" -f "/root/Develop/ltp/lib/Makefile" all > make[1]: Entering directory '/root/Develop/ltp/lib' > GEN ltp-version.h > make[2]: Nothing to be done for 'all'. > make[2]: Nothing to be done for 'all'. > make[1]: Leaving directory '/root/Develop/ltp/lib' > arch_prctl01.c:48:9: warning: braces around scalar initializer > 48 | .supported_archs = {"x86_64", "x86", NULL}, > | ^ > arch_prctl01.c:48:9: note: (near initialization for ‘test.supported_archs’) > arch_prctl01.c:48:29: warning: initialization of ‘const char * const*’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types] > 48 | .supported_archs = {"x86_64", "x86", NULL}, > | ^~~~~~~~ > arch_prctl01.c:48:29: note: (near initialization for ‘test.supported_archs’) > arch_prctl01.c:48:39: warning: excess elements in scalar initializer > 48 | .supported_archs = {"x86_64", "x86", NULL}, > | ^~~~~ > arch_prctl01.c:48:39: note: (near initialization for ‘test.supported_archs’) > arch_prctl01.c:48:46: warning: excess elements in scalar initializer > 48 | .supported_archs = {"x86_64", "x86", NULL}, > | ^~~~ > arch_prctl01.c:48:46: note: (near initialization for ‘test.supported_archs’) > CC testcases/kernel/syscalls/arch_prctl/arch_prctl01 > ``` > > > > > > > > 路斐 Fei.Lu > Uniontech Technology > site: www.uniontech.com > tel: 18501012352 > addr: Xi'an China > > > > > > > > > ------------------ Original ------------------ > From: "Cyril Hrubis"<chrubis@suse.cz>; > Date: Fri, Apr 26, 2024 06:30 PM > To: "路斐"<lufei@uniontech.com>; > Cc: "ltp"<ltp@lists.linux.it>; > Subject: Re: Re: > > > > Hi! > > I tried using NULL, but met `TBROK: Test killed by SIGSEGV!`.&nbsp; > > That means that the manual page is wrong and the address is not ignored. > > > And the last time you mentioned in response to using > > `supported_archs`, this seems not work properly by now, the ltp > > document(section of writing_tests) says "not applicable". > > The supported_archs is supposed to work. How did you set it (the value) > and what happened? > > -- > Cyril Hrubis > chrubis@suse.cz > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp
Thanks a lot.
diff --git a/configure.ac b/configure.ac index 1d7e862d8..0dcaddc0f 100644 --- a/configure.ac +++ b/configure.ac @@ -41,6 +41,7 @@ AC_CHECK_DECLS([SEM_STAT_ANY],,,[#include <sys/sem.h>]) AC_CHECK_HEADERS_ONCE([ \ asm/ldt.h \ + asm/prctl.h \ cpuid.h \ emmintrin.h \ ifaddrs.h \ diff --git a/testcases/kernel/syscalls/arch_prctl/.gitignore b/testcases/kernel/syscalls/arch_prctl/.gitignore new file mode 100644 index 000000000..24871e249 --- /dev/null +++ b/testcases/kernel/syscalls/arch_prctl/.gitignore @@ -0,0 +1 @@ +/arch_prctl01 diff --git a/testcases/kernel/syscalls/arch_prctl/Makefile b/testcases/kernel/syscalls/arch_prctl/Makefile new file mode 100644 index 000000000..272949d57 --- /dev/null +++ b/testcases/kernel/syscalls/arch_prctl/Makefile @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (c) UnionTech Software Technology Co.,Ltd. 2024 + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk + +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/syscalls/arch_prctl/arch_prctl01.c b/testcases/kernel/syscalls/arch_prctl/arch_prctl01.c new file mode 100644 index 000000000..06b3d99b8 --- /dev/null +++ b/testcases/kernel/syscalls/arch_prctl/arch_prctl01.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) UnionTech Software Technology Co.,Ltd., 2024 + * Author: Lu Fei <lufei@uniontech.com> + */ + +/* + * [Description] + * + * Simple test on arch_prctl to set and get cpuid instruction of test thread. + */ + +# include "tst_test.h" +# include "lapi/syscalls.h" +# include <stdlib.h> +# ifdef HAVE_ASM_PRCTL_H +# include <asm/prctl.h> + +static int arch_prctl_get(int code, unsigned long *addr) { + return tst_syscall(__NR_arch_prctl, code, *addr); +} + +static int arch_prctl_set(int code, unsigned long addr) { + return tst_syscall(__NR_arch_prctl, code, addr); +} + +static int tc[] = {0,1}; + +static void run(unsigned int index){ + + unsigned long *addr = malloc(sizeof(long)); + + TEST(arch_prctl_set(ARCH_SET_CPUID, tc[index])); + + if (TST_RET == 0) + tst_res(TPASS, "set %s cpuid",tc[index] ? "enable" : "disable"); + else + tst_res(TFAIL, "failed to set cpuid"); + + TEST(arch_prctl_get(ARCH_GET_CPUID, addr)); + + if (TST_RET == tc[index]) + tst_res(TPASS, "get cpuid succeed."); + else + tst_res(TFAIL, "get cpuid failed."); +} + +static struct tst_test test = { + .test = run, + .tcnt = 2, + .min_kver = "4.11", +}; + +#else /* HAVE_ASM_PRCTL_H */ +TST_TEST_TCONF("missing <asm/prctl.h>"); +#endif
Add testcase about arch_prctl syscall. Signed-off-by: Lu Fei <lufei@uniontech.com> --- configure.ac | 1 + .../kernel/syscalls/arch_prctl/.gitignore | 1 + testcases/kernel/syscalls/arch_prctl/Makefile | 8 +++ .../kernel/syscalls/arch_prctl/arch_prctl01.c | 56 +++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 testcases/kernel/syscalls/arch_prctl/.gitignore create mode 100644 testcases/kernel/syscalls/arch_prctl/Makefile create mode 100644 testcases/kernel/syscalls/arch_prctl/arch_prctl01.c