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 <bg...@linux.ibm.com>
---
 .../selftests/powerpc/ptrace/ptrace-hwbreak.c | 24 +++++++++----------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c 
b/tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c
index a16239277a6f..75d30d61ab0e 100644
--- a/tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c
+++ b/tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c
@@ -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;
        }
 }
-- 
2.41.0

Reply via email to