X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/55e303ae13a4cf49d70f2294092726f2fffb9ef2..89b3af67bb32e691275bf6fa803d1834b2284115:/bsd/kern/bsd_stubs.c diff --git a/bsd/kern/bsd_stubs.c b/bsd/kern/bsd_stubs.c index f7c4940ca..cc8e42431 100644 --- a/bsd/kern/bsd_stubs.c +++ b/bsd/kern/bsd_stubs.c @@ -1,16 +1,19 @@ /* * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ - * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER @@ -20,7 +23,7 @@ * Please see the License for the specific language governing rights and * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #include #include @@ -31,25 +34,35 @@ #include #include #include +#include #include /* for SET */ #include +#include +#include /* Just to satisfy pstat command */ int dmmin, dmmax, dmtext; +vm_offset_t kmem_mb_alloc(vm_map_t mbmap, int size) { vm_offset_t addr; if (kernel_memory_allocate(mbmap, &addr, size, 0, - KMA_NOPAGEWAIT|KMA_KOBJECT) == KERN_SUCCESS) + KMA_NOPAGEWAIT|KMA_KOBJECT|KMA_LOMEM) == KERN_SUCCESS) return(addr); else return(0); } -pcb_synch() {} +/* + * XXX this function only exists to be exported and do nothing. + */ +void +pcb_synch(void) +{ +} struct proc * current_proc(void) @@ -57,10 +70,10 @@ current_proc(void) /* Never returns a NULL */ struct uthread * ut; struct proc *p; - thread_act_t thr_act = current_act(); + thread_t thr_act = current_thread(); ut = (struct uthread *)get_bsdthread_info(thr_act); - if (ut && (ut->uu_flag & P_VFORK) && ut->uu_proc) { + if (ut && (ut->uu_flag & UT_VFORK) && ut->uu_proc) { p = ut->uu_proc; if ((p->p_flag & P_INVFORK) == 0) panic("returning child proc not under vfork"); @@ -287,3 +300,66 @@ tbeproc(void *procp) return; } + +/* + * WARNING - this is a temporary workaround for binary compatibility issues + * with anti-piracy software that relies on patching ptrace (3928003). + * This KPI will be removed in the system release after Tiger. + */ +uintptr_t temp_patch_ptrace(uintptr_t new_ptrace) +{ + struct sysent * callp; + sy_call_t * old_ptrace; +#ifndef __ppc__ + boolean_t funnel_state; +#endif + + if (new_ptrace == 0) + return(0); + +#ifdef __ppc__ + enter_funnel_section(kernel_flock); +#else + funnel_state = thread_funnel_set(kernel_flock, TRUE); +#endif + callp = &sysent[26]; + old_ptrace = callp->sy_call; + + /* only allow one patcher of ptrace */ + if (old_ptrace == (sy_call_t *) ptrace) { + callp->sy_call = (sy_call_t *) new_ptrace; + } + else { + old_ptrace = NULL; + } +#ifdef __ppc__ + exit_funnel_section( ); +#else + (void)thread_funnel_set(kernel_flock, funnel_state); +#endif + + return((uintptr_t)old_ptrace); +} + +void temp_unpatch_ptrace(void) +{ + struct sysent * callp; +#ifndef __ppc__ + boolean_t funnel_state; +#endif + +#ifdef __ppc__ + enter_funnel_section(kernel_flock); +#else + funnel_state = thread_funnel_set(kernel_flock, TRUE); +#endif + callp = &sysent[26]; + callp->sy_call = (sy_call_t *) ptrace; +#ifdef __ppc__ + exit_funnel_section( ); +#else + (void)thread_funnel_set(kernel_flock, funnel_state); +#endif + + return; +}