1 /* Copyright (C) 2001-2020 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
25 static ucontext_t ctx
[3];
30 static char st2
[32768];
32 static volatile int flag
;
35 f1 (int a00
, int a01
, int a02
, int a03
, int a04
, int a05
, int a06
, int a07
,
36 int a08
, int a09
, int a10
, int a11
, int a12
, int a13
, int a14
, int a15
,
37 int a16
, int a17
, int a18
, int a19
, int a20
, int a21
, int a22
, int a23
,
38 int a24
, int a25
, int a26
, int a27
, int a28
, int a29
, int a30
, int a31
,
41 printf ("start f1(a00=%08x,a01=%08x,a02=%08x,a03=%08x,\n"
42 " a04=%08x,a05=%08x,a06=%08x,a07=%08x,\n"
43 " a08=%08x,a09=%08x,a10=%08x,a11=%08x,\n"
44 " a12=%08x,a13=%08x,a14=%08x,a15=%08x,\n"
45 " a16=%08x,a17=%08x,a18=%08x,a19=%08x,\n"
46 " a20=%08x,a21=%08x,a22=%08x,a23=%08x,\n"
47 " a24=%08x,a25=%08x,a26=%08x,a27=%08x,\n"
48 " a28=%08x,a29=%08x,a30=%08x,a31=%08x,\n"
50 a00
, a01
, a02
, a03
, a04
, a05
, a06
, a07
,
51 a08
, a09
, a10
, a11
, a12
, a13
, a14
, a15
,
52 a16
, a17
, a18
, a19
, a20
, a21
, a22
, a23
,
53 a24
, a25
, a26
, a27
, a28
, a29
, a30
, a31
,
56 if (a00
!= (0x00000001 << flag
) || a01
!= (0x00000004 << flag
)
57 || a02
!= (0x00000012 << flag
) || a03
!= (0x00000048 << flag
)
58 || a04
!= (0x00000123 << flag
) || a05
!= (0x0000048d << flag
)
59 || a06
!= (0x00001234 << flag
) || a07
!= (0x000048d1 << flag
)
60 || a08
!= (0x00012345 << flag
) || a09
!= (0x00048d15 << flag
)
61 || a10
!= (0x00123456 << flag
) || a11
!= (0x0048d159 << flag
)
62 || a12
!= (0x01234567 << flag
) || a13
!= (0x048d159e << flag
)
63 || a14
!= (0x12345678 << flag
) || a15
!= (0x48d159e2 << flag
)
64 || a16
!= (0x23456789 << flag
) || a17
!= (0x8d159e26 << flag
)
65 || a18
!= (0x3456789a << flag
) || a19
!= (0xd159e26a << flag
)
66 || a20
!= (0x456789ab << flag
) || a21
!= (0x159e26af << flag
)
67 || a22
!= (0x56789abc << flag
) || a23
!= (0x59e26af3 << flag
)
68 || a24
!= (0x6789abcd << flag
) || a25
!= (0x9e26af37 << flag
)
69 || a26
!= (0x789abcde << flag
) || a27
!= (0xe26af37b << flag
)
70 || a28
!= (0x89abcdef << flag
) || a29
!= (0x26af37bc << flag
)
71 || a30
!= (0x9abcdef0 << flag
) || a31
!= (0x6af37bc3 << flag
)
72 || a32
!= (0xabcdef0f << flag
))
74 puts ("arg mismatch");
78 if (flag
&& swapcontext (&ctx
[1], &ctx
[2]) != 0)
80 printf ("%s: swapcontext: %m\n", __FUNCTION__
);
83 printf ("finish f1 [%d]\n", flag
);
92 if (swapcontext (&ctx
[2], &ctx
[1]) != 0)
94 printf ("%s: swapcontext: %m\n", __FUNCTION__
);
104 static int back_in_main
;
110 if (back_in_main
== 0)
112 puts ("program did not reach main again");
121 atexit (check_called
);
125 puts ("making contexts");
126 if (getcontext (&ctx
[0]) != 0)
134 printf ("%s: getcontext: %m\n", __FUNCTION__
);
138 if (getcontext (&ctx
[1]) != 0)
140 printf ("%s: getcontext: %m\n", __FUNCTION__
);
144 ctx
[1].uc_stack
.ss_sp
= st1
;
145 ctx
[1].uc_stack
.ss_size
= sizeof st1
;
146 ctx
[1].uc_link
= &ctx
[0];
148 makecontext (&ctx
[1], (void (*) (void)) f1
, 33,
149 0x00000001 << flag
, 0x00000004 << flag
,
150 0x00000012 << flag
, 0x00000048 << flag
,
151 0x00000123 << flag
, 0x0000048d << flag
,
152 0x00001234 << flag
, 0x000048d1 << flag
,
153 0x00012345 << flag
, 0x00048d15 << flag
,
154 0x00123456 << flag
, 0x0048d159 << flag
,
155 0x01234567 << flag
, 0x048d159e << flag
,
156 0x12345678 << flag
, 0x48d159e2 << flag
,
157 0x23456789 << flag
, 0x8d159e26 << flag
,
158 0x3456789a << flag
, 0xd159e26a << flag
,
159 0x456789ab << flag
, 0x159e26af << flag
,
160 0x56789abc << flag
, 0x59e26af3 << flag
,
161 0x6789abcd << flag
, 0x9e26af37 << flag
,
162 0x789abcde << flag
, 0xe26af37b << flag
,
163 0x89abcdef << flag
, 0x26af37bc << flag
,
164 0x9abcdef0 << flag
, 0x6af37bc3 << flag
,
167 /* Without this check, a stub makecontext can make us spin forever. */
170 puts ("makecontext not implemented");
175 /* Play some tricks with this context. */
177 if (setcontext (&ctx
[1]) != 0)
179 printf ("%s: setcontext: %m\n", __FUNCTION__
);
184 printf ("%s: 'global' not incremented twice\n", __FUNCTION__
);
188 if (getcontext (&ctx
[2]) != 0)
190 printf ("%s: second getcontext: %m\n", __FUNCTION__
);
193 ctx
[2].uc_stack
.ss_sp
= st2
;
194 ctx
[2].uc_stack
.ss_size
= sizeof st2
;
195 ctx
[2].uc_link
= &ctx
[1];
196 makecontext (&ctx
[2], f2
, 0);
198 puts ("swapping contexts");
199 if (swapcontext (&ctx
[0], &ctx
[2]) != 0)
201 printf ("%s: swapcontext: %m\n", __FUNCTION__
);
204 puts ("back at main program");
209 puts ("didn't reach f1 twice");
214 puts ("didn't reach f2");
218 puts ("test succeeded");