*
* @APPLE_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.
+ * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
*
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * 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.
+ *
+ * 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@
*/
#include <ppc/machparam.h>
#include <ppc/mem.h>
#include <ppc/pmap.h>
-#include <ppc/pmap_internals.h>
#include <ppc/mappings.h>
pmap_t kdp_pmap=0;
boolean_t kdp_trans_off=0;
+boolean_t kdp_read_io =0;
-unsigned kdp_xlate_off(void);
-void kdp_xlate_restore(unsigned);
-void kdp_flush_cache(vm_offset_t, unsigned);
-vm_offset_t kdp_vtophys(pmap_t pmap, vm_offset_t vaddr);
-void kdp_bcopy( unsigned char *, unsigned char *, unsigned);
-void kdp_pmemcpy( vm_offset_t , vm_offset_t, unsigned);
unsigned kdp_vm_read( caddr_t, caddr_t, unsigned);
unsigned kdp_vm_write( caddr_t, caddr_t, unsigned);
-extern vm_offset_t kvtophys(vm_offset_t);
-extern vm_offset_t mem_actual;
/*
*
*/
-vm_offset_t kdp_vtophys(
+addr64_t kdp_vtophys(
pmap_t pmap,
- vm_offset_t va)
+ addr64_t va)
{
- register mapping *mp;
- register vm_offset_t pa;
-
- pa = (vm_offset_t)LRA(pmap->space,(void *)va);
-
- if (pa != 0)
- return(pa);
-
- mp = hw_lock_phys_vir(pmap->space, va);
- if((unsigned int)mp&1) {
- return 0;
- }
-
- if(!mp) { /* If it was not a normal page */
- pa = hw_cvp_blk(pmap, va); /* Try to convert odd-sized page (returns 0 if not found) */
- return pa; /* Return physical address */
- }
-
- mp = hw_cpv(mp);
-
- if(!mp->physent) {
- pa = (vm_offset_t)((mp->PTEr & -PAGE_SIZE) | ((unsigned int)va & (PAGE_SIZE-1)));
- } else {
- pa = (vm_offset_t)((mp->physent->pte1 & -PAGE_SIZE) | ((unsigned int)va & (PAGE_SIZE-1)));
- hw_unlock_bit((unsigned int *)&mp->physent->phys_link, PHYS_LOCK);
- }
+ addr64_t pa;
+ ppnum_t pp;
+ pp = pmap_find_phys(pmap, va); /* Get the page number */
+ if(!pp) return 0; /* Just return if no translation */
+
+ pa = ((addr64_t)pp << 12) | (va & 0x0000000000000FFFULL); /* Shove in the page offset */
return(pa);
}
-/*
- *
- */
-void kdp_bcopy(
- unsigned char *src,
- unsigned char *dst,
- unsigned cnt)
-{
- while (cnt--)
- *dst++ = *src++;
-}
-
/*
*
*/
caddr_t dst,
unsigned len)
{
- vm_offset_t cur_virt_src, cur_virt_dst;
- vm_offset_t cur_phys_src;
+ addr64_t cur_virt_src, cur_virt_dst;
+ addr64_t cur_phys_src;
unsigned resid, cnt;
- unsigned msr;
+ unsigned int dummy;
+ pmap_t pmap;
#ifdef KDP_VM_READ_DEBUG
kprintf("kdp_vm_read1: src %x dst %x len %x - %08X %08X\n", src, dst, len, ((unsigned long *)src)[0], ((unsigned long *)src)[1]);
#endif
+
+ cur_virt_src = (addr64_t)((unsigned int)src);
+ cur_virt_dst = (addr64_t)((unsigned int)dst);
+
if (kdp_trans_off) {
- cur_virt_src = (vm_offset_t)src;
- if((vm_offset_t)src >= mem_actual) return 0; /* Can't read where there's not any memory */
- cur_virt_dst = (vm_offset_t)dst;
- resid = (mem_actual - (vm_offset_t)src) > len ? len : (mem_actual - (vm_offset_t)src);
+
+
+ resid = len; /* Get the length to copy */
while (resid != 0) {
- cur_phys_src = cur_virt_src;
- cnt = ((cur_virt_src + NBPG) & (-NBPG)) - cur_virt_src;
+
+ if(kdp_read_io == 0)
+ if(!mapping_phys_lookup((ppnum_t)(cur_virt_src >> 12), &dummy)) return 0; /* Can't read where there's not any memory */
+
+ cnt = 4096 - (cur_virt_src & 0xFFF); /* Get length left on page */
+
if (cnt > resid) cnt = resid;
- msr = kdp_xlate_off();
- kdp_bcopy((unsigned char *)cur_phys_src,
- (unsigned char *)cur_virt_dst, cnt);
- kdp_xlate_restore(msr);
- cur_virt_src +=cnt;
- cur_virt_dst +=cnt;
+
+ bcopy_phys(cur_virt_src, cur_virt_dst, cnt); /* Copy stuff over */
+
+ cur_virt_src += cnt;
+ cur_virt_dst += cnt;
resid -= cnt;
}
+
} else {
- cur_virt_src = (vm_offset_t)src;
- cur_virt_dst = (vm_offset_t)dst;
+
resid = len;
+ if(kdp_pmap) pmap = kdp_pmap; /* If special pmap, use it */
+ else pmap = kernel_pmap; /* otherwise, use kernel's */
+
while (resid != 0) {
- if (kdp_pmap) {
- if ((cur_phys_src =
- kdp_vtophys(kdp_pmap,trunc_page(cur_virt_src))) == 0)
- goto exit;
- cur_phys_src += (cur_virt_src & PAGE_MASK);
- } else {
- if ((cur_phys_src = kdp_vtophys(kernel_pmap,cur_virt_src)) == 0)
- goto exit;
- }
-
- cnt = ((cur_virt_src + NBPG) & (-NBPG)) - cur_virt_src;
+
+ if((cur_phys_src = kdp_vtophys(pmap, cur_virt_src)) == 0) goto exit;
+ if(kdp_read_io == 0)
+ if(!mapping_phys_lookup((ppnum_t)(cur_phys_src >> 12), &dummy)) goto exit; /* Can't read where there's not any memory */
+
+ cnt = 4096 - (cur_virt_src & 0xFFF); /* Get length left on page */
if (cnt > resid) cnt = resid;
- if (kdp_pmap) {
+
#ifdef KDP_VM_READ_DEBUG
- kprintf("kdp_vm_read2: pmap %x, virt %x, phys %x\n",
- kdp_pmap, cur_virt_src, cur_phys_src);
+ kprintf("kdp_vm_read2: pmap %08X, virt %016LLX, phys %016LLX\n",
+ pmap, cur_virt_src, cur_phys_src);
#endif
- msr = kdp_xlate_off();
- kdp_bcopy((unsigned char *)cur_phys_src,
- (unsigned char *)cur_virt_dst, cnt);
- kdp_xlate_restore(msr);
- } else {
- kdp_bcopy((unsigned char *)cur_virt_src,
- (unsigned char *)cur_virt_dst, cnt);
- }
+
+ bcopy_phys(cur_phys_src, cur_virt_dst, cnt); /* Copy stuff over */
+
cur_virt_src +=cnt;
cur_virt_dst +=cnt;
resid -= cnt;
#ifdef KDP_VM_READ_DEBUG
kprintf("kdp_vm_read: ret %08X\n", len-resid);
#endif
- return (len-resid);
+ return (len - resid);
}
/*
caddr_t dst,
unsigned len)
{
- vm_offset_t cur_virt_src, cur_virt_dst;
- vm_offset_t cur_phys_src, cur_phys_dst;
- unsigned resid, cnt, cnt_src, cnt_dst;
- unsigned msr;
+ addr64_t cur_virt_src, cur_virt_dst;
+ addr64_t cur_phys_src, cur_phys_dst;
+ unsigned resid, cnt, cnt_src, cnt_dst;
#ifdef KDP_VM_WRITE_DEBUG
printf("kdp_vm_write: src %x dst %x len %x - %08X %08X\n", src, dst, len, ((unsigned long *)src)[0], ((unsigned long *)src)[1]);
#endif
- cur_virt_src = (vm_offset_t)src;
- cur_virt_dst = (vm_offset_t)dst;
+ cur_virt_src = (addr64_t)((unsigned int)src);
+ cur_virt_dst = (addr64_t)((unsigned int)dst);
+
resid = len;
while (resid != 0) {
if (cnt > resid)
cnt = resid;
- msr = kdp_xlate_off();
- kdp_bcopy((unsigned char *)cur_virt_src, (unsigned char *)cur_phys_dst, cnt);
- kdp_flush_cache(cur_phys_dst, cnt);
- kdp_xlate_restore(msr);
+ bcopy_phys(cur_phys_src, cur_phys_dst, cnt); /* Copy stuff over */
+ sync_cache64(cur_phys_dst, cnt); /* Sync caches */
cur_virt_src +=cnt;
cur_virt_dst +=cnt;
resid -= cnt;
}
exit:
- return (len-resid);
+ return (len - resid);
}