[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/kern_context.c

Version: -  FREEBSD  -  FREEBSD7  -  FREEBSD70  -  FREEBSD6  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  OPENSOLARIS  -  minix-3-1-1  -  TRUSTEDBSD-SEBSD  -  TRUSTEDBSD-SEDARWIN  -  TRUSTEDBSD-SEDARWIN7 
Ident_Mode: -  plain  -  excerpts  -  bigexcerpts 

  1 /*-
  2  * Copyright (c) 2002 Daniel M. Eischen <deischen@freebsd.org>
  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  * 1. Redistributions of source code must retain the above copyright
  9  *    notice, this list of conditions and the following disclaimer.
 10  * 2. Redistributions in binary form must reproduce the above copyright
 11  *    notice, this list of conditions and the following disclaimer in the
 12  *    documentation and/or other materials provided with the distribution.
 13  *
 14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 24  * SUCH DAMAGE.
 25  */
 26 
 27 #include <sys/cdefs.h>
 28 __FBSDID("$FreeBSD: src/sys/kern/kern_context.c,v 1.9 2007/03/05 13:10:57 rwatson Exp $");
 29 
 30 #include <sys/param.h>
 31 #include <sys/kernel.h>
 32 #include <sys/lock.h>
 33 #include <sys/mutex.h>
 34 #include <sys/proc.h>
 35 #include <sys/sysent.h>
 36 #include <sys/systm.h>
 37 #include <sys/sysproto.h>
 38 #include <sys/signalvar.h>
 39 #include <sys/ucontext.h>
 40 
 41 /*
 42  * The first two fields of a ucontext_t are the signal mask and the machine
 43  * context.  The next field is uc_link; we want to avoid destroying the link
 44  * when copying out contexts.
 45  */
 46 #define UC_COPY_SIZE    offsetof(ucontext_t, uc_link)
 47 
 48 #ifndef _SYS_SYSPROTO_H_
 49 struct getcontext_args {
 50         struct __ucontext *ucp;
 51 }
 52 struct setcontext_args {
 53         const struct __ucontext_t *ucp;
 54 }
 55 struct swapcontext_args {
 56         struct __ucontext *oucp;
 57         const struct __ucontext_t *ucp;
 58 }
 59 #endif
 60 
 61 int
 62 getcontext(struct thread *td, struct getcontext_args *uap)
 63 {
 64         ucontext_t uc;
 65         int ret;
 66 
 67         if (uap->ucp == NULL)
 68                 ret = EINVAL;
 69         else {
 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 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                                 SIG_CANTMASK(uc.uc_sigmask);
 93                                 PROC_LOCK(td->td_proc);
 94                                 td->td_sigmask = uc.uc_sigmask;
 95                                 PROC_UNLOCK(td->td_proc);
 96                         }
 97                 }
 98         }
 99         return (ret == 0 ? EJUSTRETURN : ret);
100 }
101 
102 int
103 swapcontext(struct thread *td, struct swapcontext_args *uap)
104 {
105         ucontext_t uc;
106         int ret;        
107 
108         if (uap->oucp == NULL || uap->ucp == NULL)
109                 ret = EINVAL;
110         else {
111                 get_mcontext(td, &uc.uc_mcontext, GET_MC_CLEAR_RET);
112                 PROC_LOCK(td->td_proc);
113                 uc.uc_sigmask = td->td_sigmask;
114                 PROC_UNLOCK(td->td_proc);
115                 ret = copyout(&uc, uap->oucp, UC_COPY_SIZE);
116                 if (ret == 0) {
117                         ret = copyin(uap->ucp, &uc, UC_COPY_SIZE);
118                         if (ret == 0) {
119                                 ret = set_mcontext(td, &uc.uc_mcontext);
120                                 if (ret == 0) {
121                                         SIG_CANTMASK(uc.uc_sigmask);
122                                         PROC_LOCK(td->td_proc);
123                                         td->td_sigmask = uc.uc_sigmask;
124                                         PROC_UNLOCK(td->td_proc);
125                                 }
126                         }
127                 }
128         }
129         return (ret == 0 ? EJUSTRETURN : ret);
130 }
131 

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.