|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Mach Operating System ! 27: * Copyright (c) 1987 Carnegie-Mellon University ! 28: * All rights reserved. The CMU software License Agreement specifies ! 29: * the terms and conditions for use and redistribution. ! 30: */ ! 31: ! 32: /* ! 33: */ ! 34: #import <cputypes.h> ! 35: #import <mach_nbc.h> ! 36: #import <mach/features.h> ! 37: ! 38: #import <kern/task.h> ! 39: #import <kern/thread.h> ! 40: #import <mach/time_value.h> ! 41: #import <mach/vm_param.h> ! 42: #import <vm/vm_map.h> ! 43: #import <vm/vm_page.h> ! 44: #import <kern/parallel.h> ! 45: ! 46: #import <sys/param.h> ! 47: #import <sys/systm.h> ! 48: #import <sys/dir.h> ! 49: #import <sys/proc.h> ! 50: #import <sys/vm.h> ! 51: #import <sys/file.h> ! 52: #import <sys/vnode.h> ! 53: #import <sys/buf.h> ! 54: #import <sys/mount.h> ! 55: #import <sys/trace.h> ! 56: #import <sys/kernel.h> ! 57: ! 58: #import <kern/kalloc.h> ! 59: #import <mach/port.h> ! 60: ! 61: #import <machine/spl.h> ! 62: ! 63: useracc(addr, len, prot) ! 64: caddr_t addr; ! 65: u_int len; ! 66: int prot; ! 67: { ! 68: return (vm_map_check_protection( ! 69: current_task()->map, ! 70: trunc_page(addr), round_page(addr+len), ! 71: prot == B_READ ? VM_PROT_READ : VM_PROT_WRITE)); ! 72: } ! 73: ! 74: vslock(addr, len) ! 75: caddr_t addr; ! 76: int len; ! 77: { ! 78: vm_map_pageable(current_task()->map, trunc_page(addr), ! 79: round_page(addr+len), FALSE); ! 80: } ! 81: ! 82: vsunlock(addr, len, dirtied) ! 83: caddr_t addr; ! 84: int len; ! 85: int dirtied; ! 86: { ! 87: #if NeXT ! 88: pmap_t pmap; ! 89: vm_page_t pg; ! 90: vm_offset_t vaddr, paddr; ! 91: ! 92: if (dirtied) { ! 93: pmap = current_task()->map->pmap; ! 94: for (vaddr = trunc_page(addr); vaddr < round_page(addr+len); ! 95: vaddr += PAGE_SIZE) { ! 96: paddr = pmap_extract(pmap, vaddr); ! 97: pg = PHYS_TO_VM_PAGE(paddr); ! 98: vm_page_set_modified(pg); ! 99: } ! 100: } ! 101: #endif /* NeXT */ ! 102: #ifdef lint ! 103: dirtied++; ! 104: #endif /* lint */ ! 105: vm_map_pageable(current_task()->map, trunc_page(addr), ! 106: round_page(addr+len), TRUE); ! 107: } ! 108: ! 109: #if defined(sun) || BALANCE || defined(m88k) || defined(i386) ! 110: #else defined(sun) || BALANCE || defined(m88k) || defined(i386) ! 111: subyte(addr, byte) ! 112: void * addr; ! 113: int byte; ! 114: { ! 115: char character; ! 116: ! 117: character = (char)byte; ! 118: return (copyout((void *)&(character), addr, sizeof(char)) == 0 ? 0 : -1); ! 119: } ! 120: ! 121: suibyte(addr, byte) ! 122: void * addr; ! 123: int byte; ! 124: { ! 125: char character; ! 126: ! 127: character = (char)byte; ! 128: return (copyout((void *) &(character), addr, sizeof(char)) == 0 ? 0 : -1); ! 129: } ! 130: ! 131: int fubyte(addr) ! 132: void * addr; ! 133: { ! 134: unsigned char byte; ! 135: ! 136: if (copyin(addr, (void *) &byte, sizeof(char))) ! 137: return(-1); ! 138: return(byte); ! 139: } ! 140: ! 141: int fuibyte(addr) ! 142: void * addr; ! 143: { ! 144: unsigned char byte; ! 145: ! 146: if (copyin(addr, (void *) &(byte), sizeof(char))) ! 147: return(-1); ! 148: return(byte); ! 149: } ! 150: ! 151: suword(addr, word) ! 152: void * addr; ! 153: long word; ! 154: { ! 155: return (copyout((void *) &word, addr, sizeof(int)) == 0 ? 0 : -1); ! 156: } ! 157: ! 158: long fuword(addr) ! 159: void * addr; ! 160: { ! 161: long word; ! 162: ! 163: if (copyin(addr, (void *) &word, sizeof(int))) ! 164: return(-1); ! 165: return(word); ! 166: } ! 167: ! 168: /* suiword and fuiword are the same as suword and fuword, respectively */ ! 169: ! 170: suiword(addr, word) ! 171: void * addr; ! 172: long word; ! 173: { ! 174: return (copyout((void *) &word, addr, sizeof(int)) == 0 ? 0 : -1); ! 175: } ! 176: ! 177: long fuiword(addr) ! 178: void * addr; ! 179: { ! 180: long word; ! 181: ! 182: if (copyin(addr, (void *) &word, sizeof(int))) ! 183: return(-1); ! 184: return(word); ! 185: } ! 186: #endif /* defined(sun) || BALANCE || defined(m88k) || defined(i386) */ ! 187: ! 188: swapon() ! 189: { ! 190: /* Not yet implemented */ ! 191: printf("swapon(): not supported!\n"); ! 192: return(EPERM); ! 193: } ! 194: ! 195: thread_t procdup(child, parent) ! 196: struct proc *child, *parent; ! 197: { ! 198: thread_t thread; ! 199: task_t task; ! 200: kern_return_t result; ! 201: boolean_t inherit_memory = TRUE; ! 202: ! 203: if (parent->task == kernel_task) ! 204: inherit_memory = FALSE; ! 205: ! 206: result = task_create(parent->task, inherit_memory, &task); ! 207: if(result != KERN_SUCCESS) ! 208: printf("fork/procdup: task_create failed. result: %d\n", result); ! 209: child->task = task; /* retained reference */ ! 210: task->proc = child; ! 211: ! 212: result = thread_create(task, &thread); ! 213: if(result != KERN_SUCCESS) ! 214: printf("fork/procdup: thread_create failed. Code: 0x%x\n", result); ! 215: thread_deallocate(thread); /* release reference */ ! 216: ! 217: /* ! 218: * Don't need to lock thread here because it can't ! 219: * possibly execute and no one else knows about it. ! 220: */ ! 221: compute_priority(thread, FALSE); ! 222: ! 223: return(thread); ! 224: } ! 225: ! 226: chgprot(_addr, prot) ! 227: caddr_t _addr; ! 228: vm_prot_t prot; ! 229: { ! 230: vm_offset_t addr = (vm_offset_t) _addr; ! 231: ! 232: return(vm_map_protect(current_task()->map, ! 233: trunc_page(addr), ! 234: round_page(addr + 1), ! 235: prot, FALSE) == KERN_SUCCESS); ! 236: } ! 237: ! 238: kern_return_t unix_pid(t, x) ! 239: task_t t; ! 240: int *x; ! 241: { ! 242: if (t == TASK_NULL) { ! 243: *x = -1; ! 244: return(KERN_FAILURE); ! 245: } else { ! 246: if (t->proc) ! 247: *x = t->proc->p_pid; ! 248: else { ! 249: *x = -1; ! 250: return(KERN_FAILURE); ! 251: } ! 252: return(KERN_SUCCESS); ! 253: } ! 254: } ! 255: ! 256: /* ! 257: * Routine: task_by_unix_pid ! 258: * Purpose: ! 259: * Get the task port for another "process", named by its ! 260: * process ID on the same host as "target_task". ! 261: * ! 262: * Only permitted to privileged processes, or processes ! 263: * with the same user ID. ! 264: */ ! 265: kern_return_t task_by_unix_pid(target_task, pid, t) ! 266: task_t target_task; ! 267: int pid; ! 268: task_t *t; ! 269: { ! 270: struct proc *p; ! 271: ! 272: unix_master(); ! 273: ! 274: if ( ! 275: ((p = pfind(pid)) != (struct proc *) 0) ! 276: && (target_task->proc != (struct proc *) 0) ! 277: && ((p->p_ucred->cr_uid == target_task->proc->p_ucred->cr_uid) ! 278: || !(suser(target_task->proc->p_ucred, &target_task->proc->p_acflag))) ! 279: && (p->p_stat != SZOMB) ! 280: ) { ! 281: if (p->task != TASK_NULL) ! 282: task_reference(p->task); ! 283: *t = p->task; ! 284: /* compatibility with NeXT 2.0 debuggers, launchers */ ! 285: if (suser(p->p_ucred, &p->p_acflag)) { ! 286: /* don't set it for anyone; could exec a careless nameserver */ ! 287: struct proc *p = current_task()->proc; ! 288: ! 289: if (p) ! 290: p->p_debugger = 1; ! 291: } ! 292: unix_release(); ! 293: return(KERN_SUCCESS); ! 294: } ! 295: *t = TASK_NULL; ! 296: unix_release(); ! 297: return(KERN_FAILURE); ! 298: } ! 299: ! 300: /* ! 301: * Routine: task_by_pid ! 302: * Purpose: ! 303: * Trap form of "task_by_unix_pid"; soon to be eliminated. ! 304: */ ! 305: port_t task_by_pid(pid) ! 306: int pid; ! 307: { ! 308: task_t self = current_task(); ! 309: port_t t = PORT_NULL; ! 310: task_t result_task; ! 311: ! 312: if (task_by_unix_pid(self, pid, &result_task) == KERN_SUCCESS) { ! 313: t = convert_task_to_port(result_task); ! 314: if (t != PORT_NULL) ! 315: object_copyout(self, t, MSG_TYPE_PORT, &t); ! 316: } ! 317: ! 318: return(t); ! 319: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.