linux_emul.c (346812) | linux_emul.c (346816) |
---|---|
1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2006 Roman Divacky 5 * Copyright (c) 2013 Dmitry Chagin 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> | 1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2006 Roman Divacky 5 * Copyright (c) 2013 Dmitry Chagin 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: stable/11/sys/compat/linux/linux_emul.c 346812 2019-04-28 09:53:08Z dchagin $"); | 31__FBSDID("$FreeBSD: stable/11/sys/compat/linux/linux_emul.c 346816 2019-04-28 13:19:28Z dchagin $"); |
32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/imgact.h> 36#include <sys/kernel.h> 37#include <sys/ktr.h> 38#include <sys/lock.h> 39#include <sys/malloc.h> --- 146 unchanged lines hidden (view full) --- 186 187 error = kern_execve(td, eargs, NULL); 188 post_execve(td, error, oldvmspace); 189 if (error != 0) 190 return (error); 191 192 /* 193 * In a case of transition from Linux binary execing to | 32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/imgact.h> 36#include <sys/kernel.h> 37#include <sys/ktr.h> 38#include <sys/lock.h> 39#include <sys/malloc.h> --- 146 unchanged lines hidden (view full) --- 186 187 error = kern_execve(td, eargs, NULL); 188 post_execve(td, error, oldvmspace); 189 if (error != 0) 190 return (error); 191 192 /* 193 * In a case of transition from Linux binary execing to |
194 * FreeBSD binary we destroy linux emuldata thread & proc entries. | 194 * FreeBSD binary we destroy Linux emuldata thread & proc entries. |
195 */ 196 if (SV_CURPROC_ABI() != SV_ABI_LINUX) { 197 PROC_LOCK(p); 198 em = em_find(td); 199 KASSERT(em != NULL, ("proc_exec: thread emuldata not found.\n")); 200 td->td_emuldata = NULL; 201 202 pem = pem_find(p); --- 18 unchanged lines hidden (view full) --- 221{ 222 struct thread *td = curthread; 223 struct thread *othertd; 224#if defined(__amd64__) 225 struct linux_pemuldata *pem; 226#endif 227 228 /* | 195 */ 196 if (SV_CURPROC_ABI() != SV_ABI_LINUX) { 197 PROC_LOCK(p); 198 em = em_find(td); 199 KASSERT(em != NULL, ("proc_exec: thread emuldata not found.\n")); 200 td->td_emuldata = NULL; 201 202 pem = pem_find(p); --- 18 unchanged lines hidden (view full) --- 221{ 222 struct thread *td = curthread; 223 struct thread *othertd; 224#if defined(__amd64__) 225 struct linux_pemuldata *pem; 226#endif 227 228 /* |
229 * In a case of execing from linux binary properly detach | 229 * In a case of execing from Linux binary properly detach |
230 * other threads from the user space. 231 */ 232 if (__predict_false(SV_PROC_ABI(p) == SV_ABI_LINUX)) { 233 FOREACH_THREAD_IN_PROC(p, othertd) { 234 if (td != othertd) 235 (p->p_sysent->sv_thread_detach)(othertd); 236 } 237 } 238 239 /* | 230 * other threads from the user space. 231 */ 232 if (__predict_false(SV_PROC_ABI(p) == SV_ABI_LINUX)) { 233 FOREACH_THREAD_IN_PROC(p, othertd) { 234 if (td != othertd) 235 (p->p_sysent->sv_thread_detach)(othertd); 236 } 237 } 238 239 /* |
240 * In a case of execing to linux binary we create linux | 240 * In a case of execing to Linux binary we create Linux |
241 * emuldata thread entry. 242 */ 243 if (__predict_false((imgp->sysent->sv_flags & SV_ABI_MASK) == 244 SV_ABI_LINUX)) { 245 246 if (SV_PROC_ABI(p) == SV_ABI_LINUX) 247 linux_proc_init(td, NULL, 0); 248 else --- 52 unchanged lines hidden --- | 241 * emuldata thread entry. 242 */ 243 if (__predict_false((imgp->sysent->sv_flags & SV_ABI_MASK) == 244 SV_ABI_LINUX)) { 245 246 if (SV_PROC_ABI(p) == SV_ABI_LINUX) 247 linux_proc_init(td, NULL, 0); 248 else --- 52 unchanged lines hidden --- |