From cac31bf03005c1265ed11df29cf713f626f39c66 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sun, 3 Sep 2023 10:55:24 -0400 Subject: [PATCH] Tests: Add test for byte/short atomics on addresses which are not word-aligned Add a unit test to catch architectures which do not allow byte and short atomic operations on addresses which are not word aligned. If an architecture supports byte and short atomic operations, it should be valid to issue those operations on variables which are not word-aligned, otherwise the architecture should not define UATOMIC_HAS_ATOMIC_BYTE nor UATOMIC_HAS_ATOMIC_SHORT. This should help identify architectures which mistakenly define UATOMIC_HAS_ATOMIC_BYTE and UATOMIC_HAS_ATOMIC_SHORT. Signed-off-by: Mathieu Desnoyers Change-Id: I13d2f3be41749b018b39499106938b3746c419c1 --- tests/unit/test_uatomic.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/tests/unit/test_uatomic.c b/tests/unit/test_uatomic.c index 12e0266..d9c70e0 100644 --- a/tests/unit/test_uatomic.c +++ b/tests/unit/test_uatomic.c @@ -9,14 +9,18 @@ #define NR_TESTS 17 +#define BYTE_PER_LONG (sizeof(unsigned long) / sizeof(unsigned char)) +#define SHORT_PER_LONG (sizeof(unsigned long) / sizeof(unsigned short)) +#define INT_PER_LONG (sizeof(unsigned long) / sizeof(unsigned int)) + struct testvals { #ifdef UATOMIC_HAS_ATOMIC_BYTE - unsigned char c; + unsigned char c[BYTE_PER_LONG]; #endif #ifdef UATOMIC_HAS_ATOMIC_SHORT - unsigned short s; + unsigned short s[SHORT_PER_LONG]; #endif - unsigned int i; + unsigned int i[INT_PER_LONG]; unsigned long l; }; @@ -75,25 +79,36 @@ do { \ int main(void) { - int nr_run = 2; + int nr_run = INT_PER_LONG + 1; + unsigned long i; + #ifdef UATOMIC_HAS_ATOMIC_BYTE - nr_run += 1; + nr_run += BYTE_PER_LONG; #endif #ifdef UATOMIC_HAS_ATOMIC_SHORT - nr_run += 1; + nr_run += SHORT_PER_LONG; #endif plan_tests(nr_run * NR_TESTS); #ifdef UATOMIC_HAS_ATOMIC_BYTE - diag("Test atomic ops on byte"); - do_test(&vals.c); + for (i = 0; i < BYTE_PER_LONG; i++) { + diag("Test atomic ops on byte with %lu byte offset from long alignment", + i); + do_test(&vals.c[i]); + } #endif #ifdef UATOMIC_HAS_ATOMIC_SHORT - diag("Test atomic ops on short"); - do_test(&vals.s); + for (i = 0; i < SHORT_PER_LONG; i++) { + diag("Test atomic ops on short with %lu byte offset from long alignment", + i * sizeof(unsigned short)); + do_test(&vals.s[i]); + } #endif - diag("Test atomic ops on int"); - do_test(&vals.i); + for (i = 0; i < INT_PER_LONG; i++) { + diag("Test atomic ops on int with %lu byte offset from long alignment", + i * sizeof(unsigned int)); + do_test(&vals.i[i]); + } diag("Test atomic ops on long"); do_test(&vals.l); -- 2.34.1