selftests/powerpc/ptrace: Declare test temporary variables as volatile
authorBenjamin Gray <bgray@linux.ibm.com>
Tue, 25 Jul 2023 00:58:41 +0000 (10:58 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 2 Aug 2023 12:22:19 +0000 (22:22 +1000)
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
tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c

index a162392..75d30d6 100644 (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;
        }
 }