Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/aarch64/gen/getcontextx.c
48255 views
1
/*
2
* Copyright (c) 2011 Konstantin Belousov <[email protected]>
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
*
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
*/
26
27
#include <sys/types.h>
28
#include <sys/ucontext.h>
29
#include <errno.h>
30
#include <stdlib.h>
31
32
int
33
__getcontextx_size(void)
34
{
35
size_t size;
36
37
size = sizeof(ucontext_t);
38
size += sizeof(struct arm64_reg_context); /* Space for ARM64_CTX_END */
39
40
return (size);
41
}
42
43
int
44
__fillcontextx2(char *ctx)
45
{
46
struct arm64_reg_context *reg_ctx;
47
ucontext_t *ucp;
48
49
ucp = (ucontext_t *)ctx;
50
ucp->uc_mcontext.mc_ptr = (uint64_t)(ucp + 1);
51
52
reg_ctx = (struct arm64_reg_context *)ucp->uc_mcontext.mc_ptr;
53
reg_ctx->ctx_id = ARM64_CTX_END;
54
reg_ctx->ctx_size = sizeof(struct arm64_reg_context);
55
56
return (0);
57
}
58
59
int
60
__fillcontextx(char *ctx)
61
{
62
ucontext_t *ucp;
63
64
ucp = (ucontext_t *)ctx;
65
if (getcontext(ucp) == -1)
66
return (-1);
67
__fillcontextx2(ctx);
68
return (0);
69
}
70
71
__weak_reference(__getcontextx, getcontextx);
72
73
ucontext_t *
74
__getcontextx(void)
75
{
76
char *ctx;
77
int error;
78
79
ctx = malloc(__getcontextx_size());
80
if (ctx == NULL)
81
return (NULL);
82
if (__fillcontextx(ctx) == -1) {
83
error = errno;
84
free(ctx);
85
errno = error;
86
return (NULL);
87
}
88
return ((ucontext_t *)ctx);
89
}
90
91