selftests/powerpc/ptrace: Declare test temporary variables as volatile

While the target is volatile, the temporary variables used to access the
target cast away the volatile. This is undefined behaviour, and a
compiler may optimise away/reorder these accesses, breaking the test.

This was observed with GCC 13.1.1, but it can be difficult to reproduce
because of the dependency on compiler behaviour.

Signed-off-by: Benjamin Gray <bgray@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230725005841.28854-5-bgray@linux.ibm.com
This commit is contained in:
Benjamin Gray 2023-07-25 10:58:41 +10:00 committed by Michael Ellerman
parent fc6732a855
commit c3062ede99

View file

@ -64,26 +64,26 @@ static bool dawr_present(struct ppc_debug_info *dbginfo)
static void write_var(int len)
{
__u8 *pcvar;
__u16 *psvar;
__u32 *pivar;
__u64 *plvar;
volatile __u8 *pcvar;
volatile __u16 *psvar;
volatile __u32 *pivar;
volatile __u64 *plvar;
switch (len) {
case 1:
pcvar = (__u8 *)&glvar;
pcvar = (volatile __u8 *)&glvar;
*pcvar = 0xff;
break;
case 2:
psvar = (__u16 *)&glvar;
psvar = (volatile __u16 *)&glvar;
*psvar = 0xffff;
break;
case 4:
pivar = (__u32 *)&glvar;
pivar = (volatile __u32 *)&glvar;
*pivar = 0xffffffff;
break;
case 8:
plvar = (__u64 *)&glvar;
plvar = (volatile __u64 *)&glvar;
*plvar = 0xffffffffffffffffLL;
break;
}
@ -98,16 +98,16 @@ static void read_var(int len)
switch (len) {
case 1:
cvar = (__u8)glvar;
cvar = (volatile __u8)glvar;
break;
case 2:
svar = (__u16)glvar;
svar = (volatile __u16)glvar;
break;
case 4:
ivar = (__u32)glvar;
ivar = (volatile __u32)glvar;
break;
case 8:
lvar = (__u64)glvar;
lvar = (volatile __u64)glvar;
break;
}
}