#include <mach/ppc/vm_param.h>
#include <assym.s>
+/* void
+ * db_phys_copy(src, dst, bytecount)
+ * vm_offset_t src;
+ * vm_offset_t dst;
+ * int bytecount
+ *
+ * This routine will copy bytecount bytes from physical address src to physical
+ * address dst.
+ */
+ENTRY(db_phys_copy, TAG_NO_FRAME_USED)
+
+ /* Switch off data translations */
+ mfmsr r6
+ rlwinm r6,r6,0,MSR_FP_BIT+1,MSR_FP_BIT-1 ; Force floating point off
+ rlwinm r6,r6,0,MSR_VEC_BIT+1,MSR_VEC_BIT-1 ; Force vectors off
+ rlwinm r7, r6, 0, MSR_DR_BIT+1, MSR_DR_BIT-1
+ mtmsr r7
+ isync /* Ensure data translations are off */
+
+ subi r3, r3, 4
+ subi r4, r4, 4
+
+ cmpwi r5, 3
+ ble- .L_db_phys_copy_bytes
+.L_db_phys_copy_loop:
+ lwz r0, 4(r3)
+ addi r3, r3, 4
+ subi r5, r5, 4
+ stw r0, 4(r4)
+ addi r4, r4, 4
+ cmpwi r5, 3
+ bgt+ .L_db_phys_copy_loop
+
+ /* If no leftover bytes, we're done now */
+ cmpwi r5, 0
+ beq+ .L_db_phys_copy_done
+
+.L_db_phys_copy_bytes:
+ addi r3, r3, 3
+ addi r4, r4, 3
+.L_db_phys_copy_byte_loop:
+ lbz r0, 1(r3)
+ addi r3, r3, 1
+ subi r5, r5, 1
+ stb r0, 1(r4)
+ addi r4, r4, 1
+ cmpwi r5, 0
+ bne+ .L_db_phys_copy_loop
+
+.L_db_phys_copy_done:
+ mtmsr r6 /* Restore original translations */
+ isync /* Ensure data translations are off */
+
+ blr
/* void
* db_phys_cmp(src_a, src_b, bytecount)
* address src_b.
*/
-#warning THIS IS BROKEN FOR 64-BIT
-
/* Switch off data translations */
- lis r7,hi16(MASK(MSR_VEC))
- ori r7,r7,lo16(MASK(MSR_FP))
mfmsr r6
- andc r6,r6,r7 ; Force FP and vec off
- ori r7,r7,lo16(MASK(MSR_DR)) ; Set the DR bit
- andc r7,r6,r7 ; Force DR off
+ rlwinm r6,r6,0,MSR_FP_BIT+1,MSR_FP_BIT-1 ; Force floating point off
+ rlwinm r6,r6,0,MSR_VEC_BIT+1,MSR_VEC_BIT-1 ; Force vectors off
+ rlwinm r7, r6, 0, MSR_DR_BIT+1, MSR_DR_BIT-1
mtmsr r7
isync /* Ensure data translations are off */