[RFC PATCH 0/5] powerpc: Misc. ptrace regset fixes
From: Pedro Franco de Carvalho <hidden>
Date: 2018-06-07 15:25:50
This series attempts to fix a few issues with ptrace regsets. Patch 1 simply inverts the active predicate for ebb_set. I don't know if there was a reason for having opposite predicates in ebb_get/ebb_set, but I assumed this was a typo. Patch 2 adds the usual HTM prologue for regsets to the tm_cgpr32 get/set functions, so that the cgprs are flushed. I don't really understand the need for flushing the fp and altivec states, but I copied that over since it was done in the regular tm_cgpr get/set functions. Patch 3 changes the pmu get/set functions so that they don't read or write outside the bounds of thread_struct.mmcr0. The endianess of the kernel is used to determine where the mmcr0 word should be placed (or read from) in its corresponding 64-bit slot in the regset. I am not sure if this is the correct way to go, or if the endianess of the thread being traced should determine this position (can the kernel run threads with a different endianess?). I used the kernel endianess because that is what seems to happen for other registers smaller than their regset fields (for instance, it seems that checkpointed CR is saved by the kernel as a doubleword, so the the position of the word depends on the kernel's endianess). The rest of the function assumes that unsigned longs are doublewords, so the patch assumes that an unsigned is a word. This patch (and the original pmu_get/set functions) might not work if the kernel is compiled in 32 bits. Patch 4 adds the VSX regset to compat_regsets, which could cause out of bounds writes in fs/binfmt_elf.c. Patch 5 adds the PMU regset to compat_regsets. I also noticed that the regset for CGPRs for 32-bit threads has 48 * 8 bytes (same as the one for 64-bit threads), but the data only occupies the first 48 * 4 bytes (like for the 32-bit GPR regset). I am not sure if this was intended, or if it can be changed now that other programs might already assume the 48 * 8 size. If the kernel is compiled in 32-bits, the size will change (because it depends on sizeof (long)), but I don't know if HTM and the corresponding regsets are supported in the first place for a 32-bit kernel. I haven't added the PKEY regset to compat_regsets. Does that make sense for 32-bit threads? Pedro Franco de Carvalho (5): powerpc: Fix inverted active predicate for setting the EBB regset powerpc: Flush checkpointed gpr state for 32-bit processes in ptrace powerpc: Fix pmu get/set functions powerpc: Add VSX regset to compat_regsets powerpc: Add PMU regset to compat_regsets arch/powerpc/kernel/ptrace.c | 65 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 5 deletions(-) -- 2.13.6