Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/kern/kern_context.c
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2002 Daniel M. Eischen <[email protected]>
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
29
#include <sys/param.h>
30
#include <sys/kernel.h>
31
#include <sys/lock.h>
32
#include <sys/mutex.h>
33
#include <sys/proc.h>
34
#include <sys/syscallsubr.h>
35
#include <sys/systm.h>
36
#include <sys/sysproto.h>
37
#include <sys/signalvar.h>
38
#include <sys/ucontext.h>
39
40
/*
41
* The first two fields of a ucontext_t are the signal mask and the machine
42
* context. The next field is uc_link; we want to avoid destroying the link
43
* when copying out contexts.
44
*/
45
#define UC_COPY_SIZE offsetof(ucontext_t, uc_link)
46
47
#ifndef _SYS_SYSPROTO_H_
48
struct getcontext_args {
49
struct __ucontext *ucp;
50
}
51
struct setcontext_args {
52
const struct __ucontext_t *ucp;
53
}
54
struct swapcontext_args {
55
struct __ucontext *oucp;
56
const struct __ucontext_t *ucp;
57
}
58
#endif
59
60
int
61
sys_getcontext(struct thread *td, struct getcontext_args *uap)
62
{
63
ucontext_t uc;
64
int ret;
65
66
if (uap->ucp == NULL)
67
ret = EINVAL;
68
else {
69
bzero(&uc, sizeof(ucontext_t));
70
get_mcontext(td, &uc.uc_mcontext, GET_MC_CLEAR_RET);
71
PROC_LOCK(td->td_proc);
72
uc.uc_sigmask = td->td_sigmask;
73
PROC_UNLOCK(td->td_proc);
74
ret = copyout(&uc, uap->ucp, UC_COPY_SIZE);
75
}
76
return (ret);
77
}
78
79
int
80
sys_setcontext(struct thread *td, struct setcontext_args *uap)
81
{
82
ucontext_t uc;
83
int ret;
84
85
if (uap->ucp == NULL)
86
ret = EINVAL;
87
else {
88
ret = copyin(uap->ucp, &uc, UC_COPY_SIZE);
89
if (ret == 0) {
90
ret = set_mcontext(td, &uc.uc_mcontext);
91
if (ret == 0) {
92
kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask,
93
NULL, 0);
94
}
95
}
96
}
97
return (ret == 0 ? EJUSTRETURN : ret);
98
}
99
100
int
101
sys_swapcontext(struct thread *td, struct swapcontext_args *uap)
102
{
103
ucontext_t uc;
104
int ret;
105
106
if (uap->oucp == NULL || uap->ucp == NULL)
107
ret = EINVAL;
108
else {
109
bzero(&uc, sizeof(ucontext_t));
110
get_mcontext(td, &uc.uc_mcontext, GET_MC_CLEAR_RET);
111
PROC_LOCK(td->td_proc);
112
uc.uc_sigmask = td->td_sigmask;
113
PROC_UNLOCK(td->td_proc);
114
ret = copyout(&uc, uap->oucp, UC_COPY_SIZE);
115
if (ret == 0) {
116
ret = copyin(uap->ucp, &uc, UC_COPY_SIZE);
117
if (ret == 0) {
118
ret = set_mcontext(td, &uc.uc_mcontext);
119
if (ret == 0) {
120
kern_sigprocmask(td, SIG_SETMASK,
121
&uc.uc_sigmask, NULL, 0);
122
}
123
}
124
}
125
}
126
return (ret == 0 ? EJUSTRETURN : ret);
127
}
128
129