[LTP] [PATCH v2 1/1] ptrace07: should not use a hard-coded xstate size and use CPUID specified instead

Richard Palethorpe rpalethorpe@suse.de
Mon Oct 17 15:55:29 CEST 2022


Hello,

Pengfei Xu <pengfei.xu@intel.com> writes:

> Hi,
>
> This patch fixes ptrace07 spurious failures when the platform xstate maxium
> size is bigger than 4096bytes(512*8 bytes).
>
> Thanks for comments!

This patch causes the test to fail on my Xeon workstation. The problem
seems to be the cpuid function which just fills the args with zeros.

>
> BR.
>
> On 2022-09-29 at 10:30:20 +0800, Pengfei Xu wrote:
>> Should not use a hard-coded xstate size(512 * 8 = 4096 bytes) which is
>> wrong, should use maximum XSAVE size specified by CPUID.(EAX=0DH, ECX=0H):EBX.
>> If the CPU's maximum XSAVE size exceeds the hard-coded xstate size 4096 bytes,
>> it will cause the ptrace07 case to fail as below:
>> "
>> ./ptrace07
>> tst_test.c:1528: TINFO: Timeout per run is 0h 00m 30s
>> ptrace07.c:142: TBROK: PTRACE_SETREGSET failed with unexpected error: EFAULT (14)
>> tst_test.c:1571: TINFO: Killed the leftover descendant processes
>> 
>> Summary:
>> passed   0
>> failed   0
>> broken   1
>> skipped  0
>> warnings 0
>> "
>> 
>> Reported-by: Eric DeVolder <eric.devolder@oracle.com>
>> Reviewed-by: Chang S. Bae <chang.seok.bae@intel.com>
>> Signed-off-by: Pengfei Xu <pengfei.xu@intel.com>
>> ---
>>  testcases/kernel/syscalls/ptrace/ptrace07.c | 25 +++++++++++++++++----
>>  1 file changed, 21 insertions(+), 4 deletions(-)
>> 
>> diff --git a/testcases/kernel/syscalls/ptrace/ptrace07.c b/testcases/kernel/syscalls/ptrace/ptrace07.c
>> index da62cadb0..0accaceb5 100644
>> --- a/testcases/kernel/syscalls/ptrace/ptrace07.c
>> +++ b/testcases/kernel/syscalls/ptrace/ptrace07.c
>> @@ -35,6 +35,7 @@
>>  #include "config.h"
>>  #include "ptrace.h"
>>  #include "tst_test.h"
>> +#include "ltp_cpuid.h"

This is from the old API (starts with ltp_) so we shouldn't use it
anymore. If it is being used at all, then it's being used in a way that
would allow it to silently fail AFAICT.

>>  
>>  #ifndef PTRACE_GETREGSET
>>  # define PTRACE_GETREGSET 0x4204
>> @@ -48,6 +49,8 @@
>>  # define NT_X86_XSTATE 0x202
>>  #endif
>>  
>> +#define CPUID_LEAF_XSTATE 0xd
>> +
>>  static void check_regs_loop(uint32_t initval)
>>  {
>>  	const unsigned long num_iters = 1000000000;
>> @@ -83,8 +86,15 @@ static void do_test(void)
>>  	int i;
>>  	int num_cpus = tst_ncpus();
>>  	pid_t pid;
>> -	uint64_t xstate[512];
>> -	struct iovec iov = { .iov_base = xstate, .iov_len = sizeof(xstate) };
>> +	uint32_t eax, ebx, ecx = 0, edx;
>> +	uint64_t *xstate;
>> +	/*
>> +	 * CPUID.(EAX=0DH, ECX=0H):EBX: maximum size (bytes, from the beginning
>> +	 * of the XSAVE/XRSTOR save area) required by enabled features in XCR0.
>> +	 */
>> +	cpuid(CPUID_LEAF_XSTATE, &eax, &ebx, &ecx, &edx);
>> +	xstate = aligned_alloc(64, ebx);
>> +	struct iovec iov = { .iov_base = xstate, .iov_len = ebx };
>>  	int status;
>>  	bool okay;

Adding:

tst_res(TINFO, "EAX=%u, ECX=%u, EBX=%u", eax, ecx, ebx);

prints:

ptrace07.c:101: TINFO: EAX=0, ECX=0, EBX=0


-- 
Thank you,
Richard.


More information about the ltp mailing list