X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/91447636331957f3d9b5ca5b508f07c526b0074d..4452a7af2eac33dbad800bcc91f2399d62c18f53:/bsd/kern/bsd_stubs.c diff --git a/bsd/kern/bsd_stubs.c b/bsd/kern/bsd_stubs.c index 9a0c06054..cc8e42431 100644 --- a/bsd/kern/bsd_stubs.c +++ b/bsd/kern/bsd_stubs.c @@ -1,23 +1,29 @@ /* * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * 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. 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. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * 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 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * 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,6 +37,8 @@ #include #include /* for SET */ #include +#include +#include /* Just to satisfy pstat command */ int dmmin, dmmax, dmtext; @@ -41,7 +49,7 @@ 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); @@ -292,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; +}