Annotation of XNU/osfmk/kdp/ml/ppc/kdp_vm.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: #include <mach/mach_types.h>
                     23: #include <mach/vm_attributes.h>
                     24: #include <mach/vm_param.h>
                     25: 
                     26: #include <vm/pmap.h>
                     27:  
                     28: #include <ppc/proc_reg.h>
                     29: #include <ppc/machparam.h>
                     30: #include <ppc/mem.h>
                     31: #include <ppc/pmap.h>
                     32: #include <ppc/pmap_internals.h> 
                     33: #include <ppc/mappings.h> 
                     34: 
                     35: pmap_t kdp_pmap=0;
                     36: boolean_t kdp_trans_off=0;
                     37: 
                     38: unsigned kdp_xlate_off(void);
                     39: void kdp_xlate_restore(unsigned);
                     40: void kdp_flush_cache(vm_offset_t, unsigned);
                     41: vm_offset_t kdp_vtophys(space_t space, vm_offset_t vaddr);
                     42: void kdp_bcopy( unsigned char *, unsigned char *, unsigned);
                     43: void kdp_pmemcpy( vm_offset_t , vm_offset_t, unsigned);
                     44: unsigned kdp_vm_read( caddr_t, caddr_t, unsigned);
                     45: unsigned kdp_vm_write( caddr_t, caddr_t, unsigned);
                     46: 
                     47: extern vm_offset_t kvtophys(vm_offset_t);
                     48: 
                     49: 
                     50: /*
                     51:  *
                     52:  */
                     53: vm_offset_t kdp_vtophys(
                     54:        space_t space,
                     55:        vm_offset_t va)
                     56: {
                     57:        register mapping                *mp;
                     58:        register vm_offset_t    pa;
                     59: 
                     60:        pa = LRA(space,(void *)va);
                     61: 
                     62:        if (pa != 0)            
                     63:                return(pa);     
                     64: 
                     65:        mp = hw_lock_phys_vir(space, va);
                     66:        if((unsigned int)mp&1) {
                     67:                return 0;
                     68:        }
                     69: 
                     70:        if(!mp) {
                     71:                return 0;
                     72:        } 
                     73: 
                     74:        mp = hw_cpv(mp);
                     75: 
                     76:        if(!mp->physent) {
                     77:                pa = (vm_offset_t)((mp->PTEr & -PAGE_SIZE) | ((unsigned int)va & (PAGE_SIZE-1)));
                     78:        } else {
                     79:                pa = (vm_offset_t)((mp->physent->pte1 & -PAGE_SIZE) | ((unsigned int)va & (PAGE_SIZE-1)));
                     80:                hw_unlock_bit((unsigned int *)&mp->physent->phys_link, PHYS_LOCK);
                     81:        }
                     82: 
                     83:        return(pa);
                     84: }
                     85: 
                     86: /*
                     87:  *
                     88:  */
                     89: void kdp_bcopy(
                     90:        unsigned char *src, 
                     91:        unsigned char *dst,
                     92:        unsigned cnt)
                     93: {
                     94:         while (cnt--)
                     95:                 *dst++ = *src++;
                     96: }
                     97: 
                     98: /*
                     99:  *
                    100:  */
                    101: unsigned kdp_vm_read(
                    102:        caddr_t src, 
                    103:        caddr_t dst, 
                    104:        unsigned len)
                    105: {
                    106:        vm_offset_t cur_virt_src, cur_virt_dst;
                    107:        vm_offset_t cur_phys_src;
                    108:        unsigned resid, cnt;
                    109:        unsigned msr;
                    110: 
                    111: #ifdef KDP_VM_READ_DEBUG
                    112:     kprintf("kdp_vm_read1: src %x dst %x len %x - %08X %08X\n", src, dst, len, ((unsigned long *)src)[0], ((unsigned long *)src)[1]);
                    113: #endif
                    114:        if (kdp_trans_off) {
                    115:                cur_virt_src = (vm_offset_t) ((int)src & 0x0fffffff);
                    116:                cur_virt_dst = (vm_offset_t)dst;
                    117:                resid = len;
                    118: 
                    119:                while (resid != 0) {
                    120:                        cur_phys_src = cur_virt_src;
                    121:                        cnt = ((cur_virt_src + NBPG) & (-NBPG)) - cur_virt_src; 
                    122:                        if (cnt > resid)  cnt = resid;
                    123:                        msr = kdp_xlate_off();
                    124:                        kdp_bcopy((unsigned char *)cur_phys_src, 
                    125:                                (unsigned char *)cur_virt_dst, cnt);
                    126:                        kdp_xlate_restore(msr);
                    127:                        cur_virt_src +=cnt;
                    128:                        cur_virt_dst +=cnt;
                    129:                        resid -= cnt;
                    130:                }
                    131:        } else {
                    132:                cur_virt_src = (vm_offset_t)src;
                    133:                cur_virt_dst = (vm_offset_t)dst;
                    134:                resid = len;
                    135: 
                    136:                while (resid != 0) {   
                    137:                        if (kdp_pmap) {
                    138:                                if ((cur_phys_src = 
                    139:                                        kdp_vtophys(kdp_pmap->space,trunc_page(cur_virt_src))) ==0)
                    140:                                        goto exit;
                    141:                                cur_phys_src += (cur_virt_src & PAGE_MASK);
                    142:                        } else {
                    143:                                if ((cur_phys_src = kdp_vtophys(PPC_SID_KERNEL,cur_virt_src)) == 0)
                    144:                                        goto exit;
                    145:                        }
                    146: 
                    147:                        cnt = ((cur_virt_src + NBPG) & (-NBPG)) - cur_virt_src;
                    148:                        if (cnt > resid) cnt = resid;
                    149:                                if (kdp_pmap) {
                    150: #ifdef KDP_VM_READ_DEBUG
                    151:                                        kprintf("kdp_vm_read2: pmap %x, virt %x, phys %x\n", 
                    152:                                                        kdp_pmap, cur_virt_src, cur_phys_src);
                    153: #endif
                    154:                                msr = kdp_xlate_off();
                    155:                                kdp_bcopy((unsigned char *)cur_phys_src, 
                    156:                                                (unsigned char *)cur_virt_dst, cnt);
                    157:                                kdp_xlate_restore(msr);
                    158:                        } else {
                    159:                                kdp_bcopy((unsigned char *)cur_virt_src, 
                    160:                                                (unsigned char *)cur_virt_dst, cnt);
                    161:                        }
                    162:                        cur_virt_src +=cnt;
                    163:                        cur_virt_dst +=cnt;
                    164:                        resid -= cnt;
                    165:                }
                    166:        }
                    167: exit:
                    168: #ifdef KDP_VM_READ_DEBUG
                    169:        kprintf("kdp_vm_read: ret %08X\n", len-resid);
                    170: #endif
                    171:         return (len-resid);
                    172: }
                    173: 
                    174: /*
                    175:  * 
                    176:  */
                    177: unsigned kdp_vm_write(
                    178:         caddr_t src,
                    179:         caddr_t dst,
                    180:         unsigned len)
                    181: {       
                    182:        vm_offset_t cur_virt_src, cur_virt_dst;
                    183:        vm_offset_t cur_phys_src, cur_phys_dst;
                    184:         unsigned resid, cnt, cnt_src, cnt_dst;
                    185:        unsigned msr;
                    186: 
                    187: #ifdef KDP_VM_WRITE_DEBUG
                    188:        printf("kdp_vm_write: src %x dst %x len %x - %08X %08X\n", src, dst, len, ((unsigned long *)src)[0], ((unsigned long *)src)[1]);
                    189: #endif
                    190: 
                    191:        cur_virt_src = (vm_offset_t)src;
                    192:        cur_virt_dst = (vm_offset_t)dst;
                    193:        resid = len;
                    194: 
                    195:        while (resid != 0) {
                    196:                if ((cur_phys_dst = kdp_vtophys(PPC_SID_KERNEL,cur_virt_dst)) == 0) 
                    197:                        goto exit;
                    198:                if ((cur_phys_src = kdp_vtophys(PPC_SID_KERNEL,cur_virt_src)) == 0) 
                    199:                        goto exit;
                    200: 
                    201:                cnt_src = ((cur_phys_src + NBPG) & (-NBPG)) - cur_phys_src;
                    202:                cnt_dst = ((cur_phys_dst + NBPG) & (-NBPG)) - cur_phys_dst;
                    203: 
                    204:                if (cnt_src > cnt_dst)
                    205:                        cnt = cnt_dst;
                    206:                else
                    207:                        cnt = cnt_src;
                    208:                if (cnt > resid) 
                    209:                        cnt = resid;
                    210: 
                    211:                msr = kdp_xlate_off();
                    212:                kdp_bcopy((unsigned char *)cur_virt_src,  (unsigned char *)cur_phys_dst, cnt);
                    213:                kdp_flush_cache(cur_phys_dst, cnt);
                    214:                kdp_xlate_restore(msr);
                    215: 
                    216:                cur_virt_src +=cnt;
                    217:                cur_virt_dst +=cnt;
                    218:                resid -= cnt;
                    219:        }
                    220: exit:
                    221:        return (len-resid);
                    222: }
                    223: 

unix.superglobalmegacorp.com

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