Fix usage of _STACK_GROWS_DOWN and _STACK_GROWS_UP defines [BZ 31989]
[glibc.git] / sysdeps / arm / tst-gnu2-tls2.h
blobe413ac21fb9ed9bf41391947c26f3b30897de918
1 /* Test TLSDESC relocation. ARM version.
2 Copyright (C) 2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
19 #include <config.h>
20 #include <sys/auxv.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <endian.h>
25 #ifndef __SOFTFP__
27 # ifdef HAVE_ARM_PCS_VFP_D32
28 # define SAVE_VFP_D32 \
29 asm volatile ("vldr d16,=17" : : : "d16"); \
30 asm volatile ("vldr d17,=18" : : : "d17"); \
31 asm volatile ("vldr d18,=19" : : : "d18"); \
32 asm volatile ("vldr d19,=20" : : : "d19"); \
33 asm volatile ("vldr d20,=21" : : : "d20"); \
34 asm volatile ("vldr d21,=22" : : : "d21"); \
35 asm volatile ("vldr d22,=23" : : : "d22"); \
36 asm volatile ("vldr d23,=24" : : : "d23"); \
37 asm volatile ("vldr d24,=25" : : : "d24"); \
38 asm volatile ("vldr d25,=26" : : : "d25"); \
39 asm volatile ("vldr d26,=27" : : : "d26"); \
40 asm volatile ("vldr d27,=28" : : : "d27"); \
41 asm volatile ("vldr d28,=29" : : : "d28"); \
42 asm volatile ("vldr d29,=30" : : : "d29"); \
43 asm volatile ("vldr d30,=31" : : : "d30"); \
44 asm volatile ("vldr d31,=32" : : : "d31");
45 # else
46 # define SAVE_VFP_D32
47 # endif
49 # define INIT_TLSDESC_CALL() \
50 unsigned long hwcap = getauxval (AT_HWCAP)
52 /* Set each vector register to a value from 1 to 32 before the TLS access,
53 dump to memory after TLS access, and compare with the expected values. */
55 # define BEFORE_TLSDESC_CALL() \
56 if (hwcap & HWCAP_ARM_VFP) \
57 { \
58 asm volatile ("vldr d0,=1" : : : "d0"); \
59 asm volatile ("vldr d1,=2" : : : "d1"); \
60 asm volatile ("vldr d2,=3" : : : "d1"); \
61 asm volatile ("vldr d3,=4" : : : "d3"); \
62 asm volatile ("vldr d4,=5" : : : "d4"); \
63 asm volatile ("vldr d5,=6" : : : "d5"); \
64 asm volatile ("vldr d6,=7" : : : "d6"); \
65 asm volatile ("vldr d7,=8" : : : "d7"); \
66 asm volatile ("vldr d8,=9" : : : "d8"); \
67 asm volatile ("vldr d9,=10" : : : "d9"); \
68 asm volatile ("vldr d10,=11" : : : "d10"); \
69 asm volatile ("vldr d11,=12" : : : "d11"); \
70 asm volatile ("vldr d12,=13" : : : "d12"); \
71 asm volatile ("vldr d13,=14" : : : "d13"); \
72 asm volatile ("vldr d14,=15" : : : "d14"); \
73 asm volatile ("vldr d15,=16" : : : "d15"); \
74 } \
75 if (hwcap & HWCAP_ARM_VFPD32) \
76 { \
77 SAVE_VFP_D32 \
80 # define VFP_STACK_REQ (16*8)
81 # if __BYTE_ORDER == __BIG_ENDIAN
82 # define DISP 7
83 # else
84 # define DISP 0
85 # endif
87 # ifdef HAVE_ARM_PCS_VFP_D32
88 # define CHECK_VFP_D32 \
89 char vfp[VFP_STACK_REQ]; \
90 asm volatile ("vstmia %0, {d16-d31}\n" \
91 : \
92 : "r" (vfp) \
93 : "memory"); \
95 char expected[VFP_STACK_REQ] = { 0 }; \
96 for (int i = 0; i < 16; ++i) \
97 expected[i * 8 + DISP] = i + 17; \
99 if (memcmp (vfp, expected, VFP_STACK_REQ) != 0) \
100 abort ();
101 # else
102 # define CHECK_VFP_D32
103 # endif
105 # define AFTER_TLSDESC_CALL() \
106 if (hwcap & HWCAP_ARM_VFP) \
108 char vfp[VFP_STACK_REQ]; \
109 asm volatile ("vstmia %0, {d0-d15}\n" \
111 : "r" (vfp) \
112 : "memory"); \
114 char expected[VFP_STACK_REQ] = { 0 }; \
115 for (int i = 0; i < 16; ++i) \
116 expected[i * 8 + DISP] = i + 1; \
118 if (memcmp (vfp, expected, VFP_STACK_REQ) != 0) \
119 abort (); \
121 if (hwcap & HWCAP_ARM_VFPD32) \
123 CHECK_VFP_D32 \
126 #endif /* __SOFTFP__ */
128 #include_next <tst-gnu2-tls2.h>