xref: /freebsd/lib/libc/aarch64/gen/getcontextx.c (revision fd6b1cc34e4175c1e223f42540debb74cfe3c3e6)
1*fd6b1cc3SAndrew Turner /*
2*fd6b1cc3SAndrew Turner  * Copyright (c) 2011 Konstantin Belousov <kib@FreeBSD.org>
3*fd6b1cc3SAndrew Turner  * All rights reserved.
4*fd6b1cc3SAndrew Turner  *
5*fd6b1cc3SAndrew Turner  * Redistribution and use in source and binary forms, with or without
6*fd6b1cc3SAndrew Turner  * modification, are permitted provided that the following conditions
7*fd6b1cc3SAndrew Turner  * are met:
8*fd6b1cc3SAndrew Turner  *
9*fd6b1cc3SAndrew Turner  * 1. Redistributions of source code must retain the above copyright
10*fd6b1cc3SAndrew Turner  *    notice, this list of conditions and the following disclaimer.
11*fd6b1cc3SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright
12*fd6b1cc3SAndrew Turner  *    notice, this list of conditions and the following disclaimer in the
13*fd6b1cc3SAndrew Turner  *    documentation and/or other materials provided with the distribution.
14*fd6b1cc3SAndrew Turner  *
15*fd6b1cc3SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*fd6b1cc3SAndrew Turner  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*fd6b1cc3SAndrew Turner  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*fd6b1cc3SAndrew Turner  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*fd6b1cc3SAndrew Turner  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*fd6b1cc3SAndrew Turner  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*fd6b1cc3SAndrew Turner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*fd6b1cc3SAndrew Turner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*fd6b1cc3SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*fd6b1cc3SAndrew Turner  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*fd6b1cc3SAndrew Turner  */
26*fd6b1cc3SAndrew Turner 
27*fd6b1cc3SAndrew Turner #include <sys/types.h>
28*fd6b1cc3SAndrew Turner #include <sys/ucontext.h>
29*fd6b1cc3SAndrew Turner #include <errno.h>
30*fd6b1cc3SAndrew Turner #include <stdlib.h>
31*fd6b1cc3SAndrew Turner 
32*fd6b1cc3SAndrew Turner int
33*fd6b1cc3SAndrew Turner __getcontextx_size(void)
34*fd6b1cc3SAndrew Turner {
35*fd6b1cc3SAndrew Turner 
36*fd6b1cc3SAndrew Turner 	return (sizeof(ucontext_t));
37*fd6b1cc3SAndrew Turner }
38*fd6b1cc3SAndrew Turner 
39*fd6b1cc3SAndrew Turner int
40*fd6b1cc3SAndrew Turner __fillcontextx2(char *ctx)
41*fd6b1cc3SAndrew Turner {
42*fd6b1cc3SAndrew Turner 
43*fd6b1cc3SAndrew Turner 	return (0);
44*fd6b1cc3SAndrew Turner }
45*fd6b1cc3SAndrew Turner 
46*fd6b1cc3SAndrew Turner int
47*fd6b1cc3SAndrew Turner __fillcontextx(char *ctx)
48*fd6b1cc3SAndrew Turner {
49*fd6b1cc3SAndrew Turner 	ucontext_t *ucp;
50*fd6b1cc3SAndrew Turner 
51*fd6b1cc3SAndrew Turner 	ucp = (ucontext_t *)ctx;
52*fd6b1cc3SAndrew Turner 	return (getcontext(ucp));
53*fd6b1cc3SAndrew Turner }
54*fd6b1cc3SAndrew Turner 
55*fd6b1cc3SAndrew Turner __weak_reference(__getcontextx, getcontextx);
56*fd6b1cc3SAndrew Turner 
57*fd6b1cc3SAndrew Turner ucontext_t *
58*fd6b1cc3SAndrew Turner __getcontextx(void)
59*fd6b1cc3SAndrew Turner {
60*fd6b1cc3SAndrew Turner 	char *ctx;
61*fd6b1cc3SAndrew Turner 	int error;
62*fd6b1cc3SAndrew Turner 
63*fd6b1cc3SAndrew Turner 	ctx = malloc(__getcontextx_size());
64*fd6b1cc3SAndrew Turner 	if (ctx == NULL)
65*fd6b1cc3SAndrew Turner 		return (NULL);
66*fd6b1cc3SAndrew Turner 	if (__fillcontextx(ctx) == -1) {
67*fd6b1cc3SAndrew Turner 		error = errno;
68*fd6b1cc3SAndrew Turner 		free(ctx);
69*fd6b1cc3SAndrew Turner 		errno = error;
70*fd6b1cc3SAndrew Turner 		return (NULL);
71*fd6b1cc3SAndrew Turner 	}
72*fd6b1cc3SAndrew Turner 	return ((ucontext_t *)ctx);
73*fd6b1cc3SAndrew Turner }
74