Annotation of kernel/vm/vm_unix.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.