Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/powerpc/ptrace: Convert to load/store doubles

Some of the ptrace tests check the contents of floating pointer
registers. Currently these use float, which is always 4 bytes, but the
ptrace API supports saving/restoring 8 bytes per register, so switch to
using doubles to exercise the code more fully.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220627140239.2464900-8-mpe@ellerman.id.au

+111 -109
+34 -34
tools/testing/selftests/powerpc/include/reg.h
··· 127 127 "li 30, %[" #_asm_symbol_name_immed "];" \ 128 128 "li 31, %[" #_asm_symbol_name_immed "];" 129 129 130 - #define ASM_LOAD_FPR_SINGLE_PRECISION(_asm_symbol_name_addr) \ 131 - "lfs 0, 0(%[" #_asm_symbol_name_addr "]);" \ 132 - "lfs 1, 0(%[" #_asm_symbol_name_addr "]);" \ 133 - "lfs 2, 0(%[" #_asm_symbol_name_addr "]);" \ 134 - "lfs 3, 0(%[" #_asm_symbol_name_addr "]);" \ 135 - "lfs 4, 0(%[" #_asm_symbol_name_addr "]);" \ 136 - "lfs 5, 0(%[" #_asm_symbol_name_addr "]);" \ 137 - "lfs 6, 0(%[" #_asm_symbol_name_addr "]);" \ 138 - "lfs 7, 0(%[" #_asm_symbol_name_addr "]);" \ 139 - "lfs 8, 0(%[" #_asm_symbol_name_addr "]);" \ 140 - "lfs 9, 0(%[" #_asm_symbol_name_addr "]);" \ 141 - "lfs 10, 0(%[" #_asm_symbol_name_addr "]);" \ 142 - "lfs 11, 0(%[" #_asm_symbol_name_addr "]);" \ 143 - "lfs 12, 0(%[" #_asm_symbol_name_addr "]);" \ 144 - "lfs 13, 0(%[" #_asm_symbol_name_addr "]);" \ 145 - "lfs 14, 0(%[" #_asm_symbol_name_addr "]);" \ 146 - "lfs 15, 0(%[" #_asm_symbol_name_addr "]);" \ 147 - "lfs 16, 0(%[" #_asm_symbol_name_addr "]);" \ 148 - "lfs 17, 0(%[" #_asm_symbol_name_addr "]);" \ 149 - "lfs 18, 0(%[" #_asm_symbol_name_addr "]);" \ 150 - "lfs 19, 0(%[" #_asm_symbol_name_addr "]);" \ 151 - "lfs 20, 0(%[" #_asm_symbol_name_addr "]);" \ 152 - "lfs 21, 0(%[" #_asm_symbol_name_addr "]);" \ 153 - "lfs 22, 0(%[" #_asm_symbol_name_addr "]);" \ 154 - "lfs 23, 0(%[" #_asm_symbol_name_addr "]);" \ 155 - "lfs 24, 0(%[" #_asm_symbol_name_addr "]);" \ 156 - "lfs 25, 0(%[" #_asm_symbol_name_addr "]);" \ 157 - "lfs 26, 0(%[" #_asm_symbol_name_addr "]);" \ 158 - "lfs 27, 0(%[" #_asm_symbol_name_addr "]);" \ 159 - "lfs 28, 0(%[" #_asm_symbol_name_addr "]);" \ 160 - "lfs 29, 0(%[" #_asm_symbol_name_addr "]);" \ 161 - "lfs 30, 0(%[" #_asm_symbol_name_addr "]);" \ 162 - "lfs 31, 0(%[" #_asm_symbol_name_addr "]);" 130 + #define ASM_LOAD_FPR(_asm_symbol_name_addr) \ 131 + "lfd 0, 0(%[" #_asm_symbol_name_addr "]);" \ 132 + "lfd 1, 0(%[" #_asm_symbol_name_addr "]);" \ 133 + "lfd 2, 0(%[" #_asm_symbol_name_addr "]);" \ 134 + "lfd 3, 0(%[" #_asm_symbol_name_addr "]);" \ 135 + "lfd 4, 0(%[" #_asm_symbol_name_addr "]);" \ 136 + "lfd 5, 0(%[" #_asm_symbol_name_addr "]);" \ 137 + "lfd 6, 0(%[" #_asm_symbol_name_addr "]);" \ 138 + "lfd 7, 0(%[" #_asm_symbol_name_addr "]);" \ 139 + "lfd 8, 0(%[" #_asm_symbol_name_addr "]);" \ 140 + "lfd 9, 0(%[" #_asm_symbol_name_addr "]);" \ 141 + "lfd 10, 0(%[" #_asm_symbol_name_addr "]);" \ 142 + "lfd 11, 0(%[" #_asm_symbol_name_addr "]);" \ 143 + "lfd 12, 0(%[" #_asm_symbol_name_addr "]);" \ 144 + "lfd 13, 0(%[" #_asm_symbol_name_addr "]);" \ 145 + "lfd 14, 0(%[" #_asm_symbol_name_addr "]);" \ 146 + "lfd 15, 0(%[" #_asm_symbol_name_addr "]);" \ 147 + "lfd 16, 0(%[" #_asm_symbol_name_addr "]);" \ 148 + "lfd 17, 0(%[" #_asm_symbol_name_addr "]);" \ 149 + "lfd 18, 0(%[" #_asm_symbol_name_addr "]);" \ 150 + "lfd 19, 0(%[" #_asm_symbol_name_addr "]);" \ 151 + "lfd 20, 0(%[" #_asm_symbol_name_addr "]);" \ 152 + "lfd 21, 0(%[" #_asm_symbol_name_addr "]);" \ 153 + "lfd 22, 0(%[" #_asm_symbol_name_addr "]);" \ 154 + "lfd 23, 0(%[" #_asm_symbol_name_addr "]);" \ 155 + "lfd 24, 0(%[" #_asm_symbol_name_addr "]);" \ 156 + "lfd 25, 0(%[" #_asm_symbol_name_addr "]);" \ 157 + "lfd 26, 0(%[" #_asm_symbol_name_addr "]);" \ 158 + "lfd 27, 0(%[" #_asm_symbol_name_addr "]);" \ 159 + "lfd 28, 0(%[" #_asm_symbol_name_addr "]);" \ 160 + "lfd 29, 0(%[" #_asm_symbol_name_addr "]);" \ 161 + "lfd 30, 0(%[" #_asm_symbol_name_addr "]);" \ 162 + "lfd 31, 0(%[" #_asm_symbol_name_addr "]);" 163 163 164 164 #ifndef __ASSEMBLER__ 165 165 void store_gpr(unsigned long *addr); 166 166 void load_gpr(unsigned long *addr); 167 - void store_fpr_single_precision(float *addr); 167 + void store_fpr(double *addr); 168 168 #endif /* end of __ASSEMBLER__ */ 169 169 170 170 #endif /* _SELFTESTS_POWERPC_REG_H */
+35 -35
tools/testing/selftests/powerpc/lib/reg.S
··· 53 53 blr 54 54 FUNC_END(store_gpr) 55 55 56 - /* Single Precision Float - float buf[32] */ 57 - FUNC_START(store_fpr_single_precision) 58 - stfs 0, 0*4(3) 59 - stfs 1, 1*4(3) 60 - stfs 2, 2*4(3) 61 - stfs 3, 3*4(3) 62 - stfs 4, 4*4(3) 63 - stfs 5, 5*4(3) 64 - stfs 6, 6*4(3) 65 - stfs 7, 7*4(3) 66 - stfs 8, 8*4(3) 67 - stfs 9, 9*4(3) 68 - stfs 10, 10*4(3) 69 - stfs 11, 11*4(3) 70 - stfs 12, 12*4(3) 71 - stfs 13, 13*4(3) 72 - stfs 14, 14*4(3) 73 - stfs 15, 15*4(3) 74 - stfs 16, 16*4(3) 75 - stfs 17, 17*4(3) 76 - stfs 18, 18*4(3) 77 - stfs 19, 19*4(3) 78 - stfs 20, 20*4(3) 79 - stfs 21, 21*4(3) 80 - stfs 22, 22*4(3) 81 - stfs 23, 23*4(3) 82 - stfs 24, 24*4(3) 83 - stfs 25, 25*4(3) 84 - stfs 26, 26*4(3) 85 - stfs 27, 27*4(3) 86 - stfs 28, 28*4(3) 87 - stfs 29, 29*4(3) 88 - stfs 30, 30*4(3) 89 - stfs 31, 31*4(3) 56 + /* Double Precision Float - double buf[32] */ 57 + FUNC_START(store_fpr) 58 + stfd 0, 0*8(3) 59 + stfd 1, 1*8(3) 60 + stfd 2, 2*8(3) 61 + stfd 3, 3*8(3) 62 + stfd 4, 4*8(3) 63 + stfd 5, 5*8(3) 64 + stfd 6, 6*8(3) 65 + stfd 7, 7*8(3) 66 + stfd 8, 8*8(3) 67 + stfd 9, 9*8(3) 68 + stfd 10, 10*8(3) 69 + stfd 11, 11*8(3) 70 + stfd 12, 12*8(3) 71 + stfd 13, 13*8(3) 72 + stfd 14, 14*8(3) 73 + stfd 15, 15*8(3) 74 + stfd 16, 16*8(3) 75 + stfd 17, 17*8(3) 76 + stfd 18, 18*8(3) 77 + stfd 19, 19*8(3) 78 + stfd 20, 20*8(3) 79 + stfd 21, 21*8(3) 80 + stfd 22, 22*8(3) 81 + stfd 23, 23*8(3) 82 + stfd 24, 24*8(3) 83 + stfd 25, 25*8(3) 84 + stfd 26, 26*8(3) 85 + stfd 27, 27*8(3) 86 + stfd 28, 28*8(3) 87 + stfd 29, 29*8(3) 88 + stfd 30, 30*8(3) 89 + stfd 31, 31*8(3) 90 90 blr 91 - FUNC_END(store_fpr_single_precision) 91 + FUNC_END(store_fpr) 92 92 93 93 /* VMX/VSX registers - unsigned long buf[128] */ 94 94 FUNC_START(loadvsx)
+8 -8
tools/testing/selftests/powerpc/ptrace/ptrace-gpr.c
··· 12 12 int shm_id; 13 13 int *cptr, *pptr; 14 14 15 - float a = FPR_1; 16 - float b = FPR_2; 17 - float c = FPR_3; 15 + double a = FPR_1; 16 + double b = FPR_2; 17 + double c = FPR_3; 18 18 19 19 void gpr(void) 20 20 { 21 21 unsigned long gpr_buf[18]; 22 - float fpr_buf[32]; 22 + double fpr_buf[32]; 23 23 24 24 cptr = (int *)shmat(shm_id, NULL, 0); 25 25 26 26 asm __volatile__( 27 27 ASM_LOAD_GPR_IMMED(gpr_1) 28 - ASM_LOAD_FPR_SINGLE_PRECISION(flt_1) 28 + ASM_LOAD_FPR(flt_1) 29 29 : 30 30 : [gpr_1]"i"(GPR_1), [flt_1] "b" (&a) 31 31 : "memory", "r6", "r7", "r8", "r9", "r10", ··· 41 41 42 42 shmdt((void *)cptr); 43 43 store_gpr(gpr_buf); 44 - store_fpr_single_precision(fpr_buf); 44 + store_fpr(fpr_buf); 45 45 46 46 if (validate_gpr(gpr_buf, GPR_3)) 47 47 exit(1); 48 48 49 - if (validate_fpr_float(fpr_buf, c)) 49 + if (validate_fpr_double(fpr_buf, c)) 50 50 exit(1); 51 51 52 52 exit(0); ··· 55 55 int trace_gpr(pid_t child) 56 56 { 57 57 unsigned long gpr[18]; 58 - unsigned long fpr[32]; 58 + __u64 fpr[32]; 59 59 60 60 FAIL_IF(start_trace(child)); 61 61 FAIL_IF(show_gpr(child, gpr));
+7 -7
tools/testing/selftests/powerpc/ptrace/ptrace-gpr.h
··· 12 12 #define FPR_3 0.003 13 13 #define FPR_4 0.004 14 14 15 - #define FPR_1_REP 0x3f50624de0000000 16 - #define FPR_2_REP 0x3f60624de0000000 17 - #define FPR_3_REP 0x3f689374c0000000 18 - #define FPR_4_REP 0x3f70624de0000000 15 + #define FPR_1_REP 0x3f50624dd2f1a9fcull 16 + #define FPR_2_REP 0x3f60624dd2f1a9fcull 17 + #define FPR_3_REP 0x3f689374bc6a7efaull 18 + #define FPR_4_REP 0x3f70624dd2f1a9fcull 19 19 20 20 /* Buffer must have 18 elements */ 21 21 int validate_gpr(unsigned long *gpr, unsigned long val) ··· 36 36 } 37 37 38 38 /* Buffer must have 32 elements */ 39 - int validate_fpr(unsigned long *fpr, unsigned long val) 39 + int validate_fpr(__u64 *fpr, __u64 val) 40 40 { 41 41 int i, found = 1; 42 42 43 43 for (i = 0; i < 32; i++) { 44 44 if (fpr[i] != val) { 45 - printf("FPR[%d]: %lx Expected: %lx\n", i, fpr[i], val); 45 + printf("FPR[%d]: %llx Expected: %llx\n", i, fpr[i], val); 46 46 found = 0; 47 47 } 48 48 } ··· 53 53 } 54 54 55 55 /* Buffer must have 32 elements */ 56 - int validate_fpr_float(float *fpr, float val) 56 + int validate_fpr_double(double *fpr, double val) 57 57 { 58 58 int i, found = 1; 59 59
+9 -9
tools/testing/selftests/powerpc/ptrace/ptrace-tm-gpr.c
··· 12 12 int shm_id; 13 13 unsigned long *cptr, *pptr; 14 14 15 - float a = FPR_1; 16 - float b = FPR_2; 17 - float c = FPR_3; 15 + double a = FPR_1; 16 + double b = FPR_2; 17 + double c = FPR_3; 18 18 19 19 void tm_gpr(void) 20 20 { 21 21 unsigned long gpr_buf[18]; 22 22 unsigned long result, texasr; 23 - float fpr_buf[32]; 23 + double fpr_buf[32]; 24 24 25 25 printf("Starting the child\n"); 26 26 cptr = (unsigned long *)shmat(shm_id, NULL, 0); ··· 29 29 cptr[1] = 0; 30 30 asm __volatile__( 31 31 ASM_LOAD_GPR_IMMED(gpr_1) 32 - ASM_LOAD_FPR_SINGLE_PRECISION(flt_1) 32 + ASM_LOAD_FPR(flt_1) 33 33 "1: ;" 34 34 "tbegin.;" 35 35 "beq 2f;" 36 36 ASM_LOAD_GPR_IMMED(gpr_2) 37 - ASM_LOAD_FPR_SINGLE_PRECISION(flt_2) 37 + ASM_LOAD_FPR(flt_2) 38 38 "tsuspend.;" 39 39 "li 7, 1;" 40 40 "stw 7, 0(%[cptr1]);" ··· 70 70 71 71 shmdt((void *)cptr); 72 72 store_gpr(gpr_buf); 73 - store_fpr_single_precision(fpr_buf); 73 + store_fpr(fpr_buf); 74 74 75 75 if (validate_gpr(gpr_buf, GPR_3)) 76 76 exit(1); 77 77 78 - if (validate_fpr_float(fpr_buf, c)) 78 + if (validate_fpr_double(fpr_buf, c)) 79 79 exit(1); 80 80 81 81 exit(0); ··· 87 87 int trace_tm_gpr(pid_t child) 88 88 { 89 89 unsigned long gpr[18]; 90 - unsigned long fpr[32]; 90 + __u64 fpr[32]; 91 91 92 92 FAIL_IF(start_trace(child)); 93 93 FAIL_IF(show_gpr(child, gpr));
+10 -10
tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-gpr.c
··· 12 12 int shm_id; 13 13 int *cptr, *pptr; 14 14 15 - float a = FPR_1; 16 - float b = FPR_2; 17 - float c = FPR_3; 18 - float d = FPR_4; 15 + double a = FPR_1; 16 + double b = FPR_2; 17 + double c = FPR_3; 18 + double d = FPR_4; 19 19 20 20 __attribute__((used)) void wait_parent(void) 21 21 { ··· 28 28 { 29 29 unsigned long gpr_buf[18]; 30 30 unsigned long result, texasr; 31 - float fpr_buf[32]; 31 + double fpr_buf[32]; 32 32 33 33 cptr = (int *)shmat(shm_id, NULL, 0); 34 34 ··· 36 36 cptr[2] = 0; 37 37 asm __volatile__( 38 38 ASM_LOAD_GPR_IMMED(gpr_1) 39 - ASM_LOAD_FPR_SINGLE_PRECISION(flt_1) 39 + ASM_LOAD_FPR(flt_1) 40 40 41 41 "1: ;" 42 42 "tbegin.;" ··· 45 45 ASM_LOAD_GPR_IMMED(gpr_2) 46 46 "tsuspend.;" 47 47 ASM_LOAD_GPR_IMMED(gpr_4) 48 - ASM_LOAD_FPR_SINGLE_PRECISION(flt_4) 48 + ASM_LOAD_FPR(flt_4) 49 49 50 50 "bl wait_parent;" 51 51 "tresume.;" ··· 77 77 78 78 shmdt((void *)cptr); 79 79 store_gpr(gpr_buf); 80 - store_fpr_single_precision(fpr_buf); 80 + store_fpr(fpr_buf); 81 81 82 82 if (validate_gpr(gpr_buf, GPR_3)) 83 83 exit(1); 84 84 85 - if (validate_fpr_float(fpr_buf, c)) 85 + if (validate_fpr_double(fpr_buf, c)) 86 86 exit(1); 87 87 exit(0); 88 88 } ··· 93 93 int trace_tm_spd_gpr(pid_t child) 94 94 { 95 95 unsigned long gpr[18]; 96 - unsigned long fpr[32]; 96 + __u64 fpr[32]; 97 97 98 98 FAIL_IF(start_trace(child)); 99 99 FAIL_IF(show_gpr(child, gpr));
+8 -6
tools/testing/selftests/powerpc/ptrace/ptrace.h
··· 4 4 * 5 5 * Copyright (C) 2015 Anshuman Khandual, IBM Corporation. 6 6 */ 7 + 8 + #define __SANE_USERSPACE_TYPES__ 9 + 7 10 #include <inttypes.h> 8 11 #include <unistd.h> 9 12 #include <stdlib.h> ··· 33 30 #define TEST_FAIL 1 34 31 35 32 struct fpr_regs { 36 - unsigned long fpr[32]; 37 - unsigned long fpscr; 33 + __u64 fpr[32]; 34 + __u64 fpscr; 38 35 }; 39 36 40 37 struct tm_spr_regs { ··· 321 318 } 322 319 323 320 /* FPR */ 324 - int show_fpr(pid_t child, unsigned long *fpr) 321 + int show_fpr(pid_t child, __u64 *fpr) 325 322 { 326 323 struct fpr_regs *regs; 327 324 int ret, i; ··· 340 337 return TEST_PASS; 341 338 } 342 339 343 - int write_fpr(pid_t child, unsigned long val) 340 + int write_fpr(pid_t child, __u64 val) 344 341 { 345 342 struct fpr_regs *regs; 346 343 int ret, i; ··· 363 360 return TEST_PASS; 364 361 } 365 362 366 - int show_ckpt_fpr(pid_t child, unsigned long *fpr) 363 + int show_ckpt_fpr(pid_t child, __u64 *fpr) 367 364 { 368 365 struct fpr_regs *regs; 369 366 struct iovec iov; ··· 745 742 } 746 743 747 744 void store_gpr(unsigned long *addr); 748 - void store_fpr(float *addr);