diff options
author | cognet <cognet@FreeBSD.org> | 2005-05-24 23:55:09 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2005-05-24 23:55:09 +0000 |
commit | d2691df07df9557bb97e41e6bb037eca1609d814 (patch) | |
tree | 5d10232b9c36f0d638a653174b85fd56d7408989 /sys/arm | |
parent | 07e93041c6b4c4f4550a99541ea2d38575a14ed6 (diff) | |
download | FreeBSD-src-d2691df07df9557bb97e41e6bb037eca1609d814.zip FreeBSD-src-d2691df07df9557bb97e41e6bb037eca1609d814.tar.gz |
Remove kcopy(), we don't use it.
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/bcopyinout.S | 202 | ||||
-rw-r--r-- | sys/arm/arm/bcopyinout_xscale.S | 428 |
2 files changed, 0 insertions, 630 deletions
diff --git a/sys/arm/arm/bcopyinout.S b/sys/arm/arm/bcopyinout.S index 1fc99f5..fdd57d6 100644 --- a/sys/arm/arm/bcopyinout.S +++ b/sys/arm/arm/bcopyinout.S @@ -502,210 +502,8 @@ ENTRY(copyout) RESTORE_REGS RET - -/* - * r0 = kernel space source address - * r1 = kernel space destination address - * r2 = length - * - * Copies bytes from kernel space to kernel space, aborting on page fault - * - * Copy of copyout, but without the ldrt/strt instructions. - */ - -ENTRY(kcopy) - /* Quick exit if length is zero */ - teq r2, #0 - moveq r0, #0 - RETeq - - SAVE_REGS -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r2, r14} - bl _C_LABEL(cpu_number) - ldr r4, .Lcpu_info - ldr r4, [r4, r0, lsl #2] - ldr r4, [r4, #CI_CURPCB] - ldmfd sp!, {r0-r2, r14} -#else - ldr r4, .Lcurpcb - ldr r4, [r4] #endif - ldr r5, [r4, #PCB_ONFAULT] - adr r3, .Lcopyfault - str r3, [r4, #PCB_ONFAULT] - - PREFETCH(r0, 0) - PREFETCH(r1, 0) - - /* - * If not too many bytes, take the slow path. - */ - cmp r2, #0x08 - blt .Lkcleanup - - /* - * Align destination to word boundary. - */ - and r6, r1, #0x3 - ldr pc, [pc, r6, lsl #2] - b .Lkalend - .word .Lkalend - .word .Lkal3 - .word .Lkal2 - .word .Lkal1 -.Lkal3: ldrb r6, [r0], #1 - sub r2, r2, #1 - strb r6, [r1], #1 -.Lkal2: ldrb r7, [r0], #1 - sub r2, r2, #1 - strb r7, [r1], #1 -.Lkal1: ldrb r6, [r0], #1 - sub r2, r2, #1 - strb r6, [r1], #1 -.Lkalend: - - /* - * If few bytes left, finish slow. - */ - cmp r2, #0x08 - blt .Lkcleanup - - /* - * If source is not aligned, finish slow. - */ - ands r3, r0, #0x03 - bne .Lkcleanup - - cmp r2, #0x60 /* Must be > 0x5f for unrolled cacheline */ - blt .Lkcleanup8 - - /* - * Align source & destination to cacheline boundary. - */ - and r6, r1, #0x1f - ldr pc, [pc, r6] - b .Lkcaligned - .word .Lkcaligned - .word .Lkcal28 - .word .Lkcal24 - .word .Lkcal20 - .word .Lkcal16 - .word .Lkcal12 - .word .Lkcal8 - .word .Lkcal4 -.Lkcal28:ldr r6, [r0], #4 - sub r2, r2, #4 - str r6, [r1], #4 -.Lkcal24:ldr r7, [r0], #4 - sub r2, r2, #4 - str r7, [r1], #4 -.Lkcal20:ldr r6, [r0], #4 - sub r2, r2, #4 - str r6, [r1], #4 -.Lkcal16:ldr r7, [r0], #4 - sub r2, r2, #4 - str r7, [r1], #4 -.Lkcal12:ldr r6, [r0], #4 - sub r2, r2, #4 - str r6, [r1], #4 -.Lkcal8:ldr r7, [r0], #4 - sub r2, r2, #4 - str r7, [r1], #4 -.Lkcal4:ldr r6, [r0], #4 - sub r2, r2, #4 - str r6, [r1], #4 - - /* - * We start with > 0x40 bytes to copy (>= 0x60 got us into this - * part of the code, and we may have knocked that down by as much - * as 0x1c getting aligned). - * - * This loop basically works out to: - * do { - * prefetch-next-cacheline(s) - * bytes -= 0x20; - * copy cacheline - * } while (bytes >= 0x40); - * bytes -= 0x20; - * copy cacheline - */ -.Lkcaligned: - PREFETCH(r0, 32) - PREFETCH(r1, 32) - - sub r2, r2, #0x20 - - /* Copy a cacheline */ - ldmia r0!, {r6-r11} - stmia r1!, {r6, r7} - ldmia r0!, {r6, r7} - stmia r1!, {r8-r11} - stmia r1!, {r6, r7} - - cmp r2, #0x40 - bge .Lkcaligned - - sub r2, r2, #0x20 - - /* Copy a cacheline */ - ldmia r0!, {r6-r11} - stmia r1!, {r6-r7} - ldmia r0!, {r6-r7} - stmia r1!, {r8-r11} - stmia r1!, {r6-r7} - - cmp r2, #0x08 - blt .Lkprecleanup - -.Lkcleanup8: - ldmia r0!, {r8-r9} - sub r2, r2, #8 - stmia r1!, {r8-r9} - cmp r2, #8 - bge .Lkcleanup8 - -.Lkprecleanup: - /* - * If we're done, bail. - */ - cmp r2, #0 - beq .Lkout - -.Lkcleanup: - and r6, r2, #0x3 - ldr pc, [pc, r6, lsl #2] - b .Lkcend - .word .Lkc4 - .word .Lkc1 - .word .Lkc2 - .word .Lkc3 -.Lkc4: ldrb r6, [r0], #1 - sub r2, r2, #1 - strb r6, [r1], #1 -.Lkc3: ldrb r7, [r0], #1 - sub r2, r2, #1 - strb r7, [r1], #1 -.Lkc2: ldrb r6, [r0], #1 - sub r2, r2, #1 - strb r6, [r1], #1 -.Lkc1: ldrb r7, [r0], #1 - subs r2, r2, #1 - strb r7, [r1], #1 -.Lkcend: - bne .Lkcleanup - -.Lkout: - mov r0, #0 - - str r5, [r4, #PCB_ONFAULT] - RESTORE_REGS - - RET -#endif /* !__XSCALE__ */ - /* * int badaddr_read_1(const uint8_t *src, uint8_t *dest) * diff --git a/sys/arm/arm/bcopyinout_xscale.S b/sys/arm/arm/bcopyinout_xscale.S index d75a2dd..bb785f8 100644 --- a/sys/arm/arm/bcopyinout_xscale.S +++ b/sys/arm/arm/bcopyinout_xscale.S @@ -927,431 +927,3 @@ ENTRY(copyout) ldrb ip, [r0] strbt ip, [r1] RET - - -/* - * r0 = kernel space source address - * r1 = kernel space destination address - * r2 = length - * - * Copies bytes from kernel space to kernel space, aborting on page fault - */ -ENTRY(kcopy) - cmp r2, #0x00 - movle r0, #0x00 - movle pc, lr /* Bail early if length is <= 0 */ - - stmfd sp!, {r10-r11, lr} - -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r2} - bl _C_LABEL(cpu_number) - ldr r10, .Lcpu_info - ldmfd sp!, {r0-r2} - ldr r10, [r10, r0, lsl #2] - ldr r10, [r10, #CI_CURPCB] -#else - ldr r10, .Lcurpcb - ldr r10, [r10] -#endif - - mov r3, #0x00 - adr ip, .Lkcopy_fault - ldr r11, [r10, #PCB_ONFAULT] - str ip, [r10, #PCB_ONFAULT] - bl .Lkcopy_guts - str r11, [r10, #PCB_ONFAULT] - mov r0, #0x00 - ldmfd sp!, {r10-r11, pc} - -.Lkcopy_fault: - str r11, [r10, #PCB_ONFAULT] - cmp r3, #0x00 - ldmgtfd sp!, {r4-r7} /* r3 > 0 Restore r4-r7 */ - ldmltfd sp!, {r4-r9} /* r3 < 0 Restore r4-r9 */ - ldmfd sp!, {r10-r11, pc} - -.Lkcopy_guts: - pld [r0] - /* Word-align the destination buffer */ - ands ip, r1, #0x03 /* Already word aligned? */ - beq .Lkcopy_wordaligned /* Yup */ - rsb ip, ip, #0x04 - cmp r2, ip /* Enough bytes left to align it? */ - blt .Lkcopy_bad_endgame2 /* Nope. Just copy bytewise */ - sub r2, r2, ip - rsbs ip, ip, #0x03 - addne pc, pc, ip, lsl #3 - ldrb ip, [r0], #0x01 - strb ip, [r1], #0x01 - ldrb ip, [r0], #0x01 - strb ip, [r1], #0x01 - ldrb ip, [r0], #0x01 - strb ip, [r1], #0x01 - cmp r2, #0x00 /* All done? */ - RETeq - - /* Destination buffer is now word aligned */ -.Lkcopy_wordaligned: - ands ip, r0, #0x03 /* Is src also word-aligned? */ - bne .Lkcopy_bad_align /* Nope. Things just got bad */ - cmp r2, #0x08 /* Less than 8 bytes remaining? */ - blt .Lkcopy_w_less_than8 - - /* Quad-align the destination buffer */ - tst r1, #0x07 /* Already quad aligned? */ - ldrne ip, [r0], #0x04 - stmfd sp!, {r4-r9} /* Free up some registers */ - mov r3, #-1 /* Signal restore r4-r9 */ - subne r2, r2, #0x04 - strne ip, [r1], #0x04 - - /* Destination buffer quad aligned, source is word aligned */ - subs r2, r2, #0x80 - blt .Lkcopy_w_lessthan128 - - /* Copy 128 bytes at a time */ -.Lkcopy_w_loop128: - ldr r4, [r0], #0x04 /* LD:00-03 */ - ldr r5, [r0], #0x04 /* LD:04-07 */ - pld [r0, #0x18] /* Prefetch 0x20 */ - ldr r6, [r0], #0x04 /* LD:08-0b */ - ldr r7, [r0], #0x04 /* LD:0c-0f */ - ldr r8, [r0], #0x04 /* LD:10-13 */ - ldr r9, [r0], #0x04 /* LD:14-17 */ - strd r4, [r1], #0x08 /* ST:00-07 */ - ldr r4, [r0], #0x04 /* LD:18-1b */ - ldr r5, [r0], #0x04 /* LD:1c-1f */ - strd r6, [r1], #0x08 /* ST:08-0f */ - ldr r6, [r0], #0x04 /* LD:20-23 */ - ldr r7, [r0], #0x04 /* LD:24-27 */ - pld [r0, #0x18] /* Prefetch 0x40 */ - strd r8, [r1], #0x08 /* ST:10-17 */ - ldr r8, [r0], #0x04 /* LD:28-2b */ - ldr r9, [r0], #0x04 /* LD:2c-2f */ - strd r4, [r1], #0x08 /* ST:18-1f */ - ldr r4, [r0], #0x04 /* LD:30-33 */ - ldr r5, [r0], #0x04 /* LD:34-37 */ - strd r6, [r1], #0x08 /* ST:20-27 */ - ldr r6, [r0], #0x04 /* LD:38-3b */ - ldr r7, [r0], #0x04 /* LD:3c-3f */ - strd r8, [r1], #0x08 /* ST:28-2f */ - ldr r8, [r0], #0x04 /* LD:40-43 */ - ldr r9, [r0], #0x04 /* LD:44-47 */ - pld [r0, #0x18] /* Prefetch 0x60 */ - strd r4, [r1], #0x08 /* ST:30-37 */ - ldr r4, [r0], #0x04 /* LD:48-4b */ - ldr r5, [r0], #0x04 /* LD:4c-4f */ - strd r6, [r1], #0x08 /* ST:38-3f */ - ldr r6, [r0], #0x04 /* LD:50-53 */ - ldr r7, [r0], #0x04 /* LD:54-57 */ - strd r8, [r1], #0x08 /* ST:40-47 */ - ldr r8, [r0], #0x04 /* LD:58-5b */ - ldr r9, [r0], #0x04 /* LD:5c-5f */ - strd r4, [r1], #0x08 /* ST:48-4f */ - ldr r4, [r0], #0x04 /* LD:60-63 */ - ldr r5, [r0], #0x04 /* LD:64-67 */ - pld [r0, #0x18] /* Prefetch 0x80 */ - strd r6, [r1], #0x08 /* ST:50-57 */ - ldr r6, [r0], #0x04 /* LD:68-6b */ - ldr r7, [r0], #0x04 /* LD:6c-6f */ - strd r8, [r1], #0x08 /* ST:58-5f */ - ldr r8, [r0], #0x04 /* LD:70-73 */ - ldr r9, [r0], #0x04 /* LD:74-77 */ - strd r4, [r1], #0x08 /* ST:60-67 */ - ldr r4, [r0], #0x04 /* LD:78-7b */ - ldr r5, [r0], #0x04 /* LD:7c-7f */ - strd r6, [r1], #0x08 /* ST:68-6f */ - strd r8, [r1], #0x08 /* ST:70-77 */ - subs r2, r2, #0x80 - strd r4, [r1], #0x08 /* ST:78-7f */ - bge .Lkcopy_w_loop128 - -.Lkcopy_w_lessthan128: - adds r2, r2, #0x80 /* Adjust for extra sub */ - ldmeqfd sp!, {r4-r9} - RETeq /* Return now if done */ - subs r2, r2, #0x20 - blt .Lkcopy_w_lessthan32 - - /* Copy 32 bytes at a time */ -.Lkcopy_w_loop32: - ldr r4, [r0], #0x04 - ldr r5, [r0], #0x04 - pld [r0, #0x18] - ldr r6, [r0], #0x04 - ldr r7, [r0], #0x04 - ldr r8, [r0], #0x04 - ldr r9, [r0], #0x04 - strd r4, [r1], #0x08 - ldr r4, [r0], #0x04 - ldr r5, [r0], #0x04 - strd r6, [r1], #0x08 - strd r8, [r1], #0x08 - subs r2, r2, #0x20 - strd r4, [r1], #0x08 - bge .Lkcopy_w_loop32 - -.Lkcopy_w_lessthan32: - adds r2, r2, #0x20 /* Adjust for extra sub */ - ldmeqfd sp!, {r4-r9} - RETeq /* Return now if done */ - - and r4, r2, #0x18 - rsb r5, r4, #0x18 - subs r2, r2, r4 - add pc, pc, r5, lsl #1 - nop - - /* At least 24 bytes remaining */ - ldr r4, [r0], #0x04 - ldr r5, [r0], #0x04 - nop - strd r4, [r1], #0x08 - - /* At least 16 bytes remaining */ - ldr r4, [r0], #0x04 - ldr r5, [r0], #0x04 - nop - strd r4, [r1], #0x08 - - /* At least 8 bytes remaining */ - ldr r4, [r0], #0x04 - ldr r5, [r0], #0x04 - nop - strd r4, [r1], #0x08 - - /* Less than 8 bytes remaining */ - ldmfd sp!, {r4-r9} - RETeq /* Return now if done */ - mov r3, #0x00 - -.Lkcopy_w_less_than8: - subs r2, r2, #0x04 - ldrge ip, [r0], #0x04 - strge ip, [r1], #0x04 - RETeq /* Return now if done */ - addlt r2, r2, #0x04 - ldrb ip, [r0], #0x01 - cmp r2, #0x02 - ldrgeb r2, [r0], #0x01 - strb ip, [r1], #0x01 - ldrgtb ip, [r0] - strgeb r2, [r1], #0x01 - strgtb ip, [r1] - RET - -/* - * At this point, it has not been possible to word align both buffers. - * The destination buffer (r1) is word aligned, but the source buffer - * (r0) is not. - */ -.Lkcopy_bad_align: - stmfd sp!, {r4-r7} - mov r3, #0x01 - bic r0, r0, #0x03 - cmp ip, #2 - ldr ip, [r0], #0x04 - bgt .Lkcopy_bad3 - beq .Lkcopy_bad2 - b .Lkcopy_bad1 - -.Lkcopy_bad1_loop16: -#ifdef __ARMEB__ - mov r4, ip, lsl #8 -#else - mov r4, ip, lsr #8 -#endif - ldr r5, [r0], #0x04 - pld [r0, #0x018] - ldr r6, [r0], #0x04 - ldr r7, [r0], #0x04 - ldr ip, [r0], #0x04 -#ifdef __ARMEB__ - orr r4, r4, r5, lsr #24 - mov r5, r5, lsl #8 - orr r5, r5, r6, lsr #24 - mov r6, r6, lsl #8 - orr r6, r6, r7, lsr #24 - mov r7, r7, lsl #8 - orr r7, r7, ip, lsr #24 -#else - orr r4, r4, r5, lsl #24 - mov r5, r5, lsr #8 - orr r5, r5, r6, lsl #24 - mov r6, r6, lsr #8 - orr r6, r6, r7, lsl #24 - mov r7, r7, lsr #8 - orr r7, r7, ip, lsl #24 -#endif - str r4, [r1], #0x04 - str r5, [r1], #0x04 - str r6, [r1], #0x04 - str r7, [r1], #0x04 -.Lkcopy_bad1: - subs r2, r2, #0x10 - bge .Lkcopy_bad1_loop16 - - adds r2, r2, #0x10 - ldmeqfd sp!, {r4-r7} - RETeq /* Return now if done */ - subs r2, r2, #0x04 - sublt r0, r0, #0x03 - blt .Lkcopy_bad_endgame - -.Lkcopy_bad1_loop4: -#ifdef __ARMEB__ - mov r4, ip, lsl #8 -#else - mov r4, ip, lsr #8 -#endif - ldr ip, [r0], #0x04 - subs r2, r2, #0x04 -#ifdef __ARMEB__ - orr r4, r4, ip, lsr #24 -#else - orr r4, r4, ip, lsl #24 -#endif - str r4, [r1], #0x04 - bge .Lkcopy_bad1_loop4 - sub r0, r0, #0x03 - b .Lkcopy_bad_endgame - -.Lkcopy_bad2_loop16: -#ifdef __ARMEB__ - mov r4, ip, lsl #16 -#else - mov r4, ip, lsr #16 -#endif - ldr r5, [r0], #0x04 - pld [r0, #0x018] - ldr r6, [r0], #0x04 - ldr r7, [r0], #0x04 - ldr ip, [r0], #0x04 -#ifdef __ARMEB__ - orr r4, r4, r5, lsr #16 - mov r5, r5, lsl #16 - orr r5, r5, r6, lsr #16 - mov r6, r6, lsl #16 - orr r6, r6, r7, lsr #16 - mov r7, r7, lsl #16 - orr r7, r7, ip, lsr #16 -#else - orr r4, r4, r5, lsl #16 - mov r5, r5, lsr #16 - orr r5, r5, r6, lsl #16 - mov r6, r6, lsr #16 - orr r6, r6, r7, lsl #16 - mov r7, r7, lsr #16 - orr r7, r7, ip, lsl #16 -#endif - str r4, [r1], #0x04 - str r5, [r1], #0x04 - str r6, [r1], #0x04 - str r7, [r1], #0x04 -.Lkcopy_bad2: - subs r2, r2, #0x10 - bge .Lkcopy_bad2_loop16 - - adds r2, r2, #0x10 - ldmeqfd sp!, {r4-r7} - RETeq /* Return now if done */ - subs r2, r2, #0x04 - sublt r0, r0, #0x02 - blt .Lkcopy_bad_endgame - -.Lkcopy_bad2_loop4: -#ifdef __ARMEB__ - mov r4, ip, lsl #16 -#else - mov r4, ip, lsr #16 -#endif - ldr ip, [r0], #0x04 - subs r2, r2, #0x04 -#ifdef __ARMEB__ - orr r4, r4, ip, lsr #16 -#else - orr r4, r4, ip, lsl #16 -#endif - str r4, [r1], #0x04 - bge .Lkcopy_bad2_loop4 - sub r0, r0, #0x02 - b .Lkcopy_bad_endgame - -.Lkcopy_bad3_loop16: -#ifdef __ARMEB__ - mov r4, ip, lsl #24 -#else - mov r4, ip, lsr #24 -#endif - ldr r5, [r0], #0x04 - pld [r0, #0x018] - ldr r6, [r0], #0x04 - ldr r7, [r0], #0x04 - ldr ip, [r0], #0x04 -#ifdef __ARMEB__ - orr r4, r4, r5, lsr #8 - mov r5, r5, lsl #24 - orr r5, r5, r6, lsr #8 - mov r6, r6, lsl #24 - orr r6, r6, r7, lsr #8 - mov r7, r7, lsl #24 - orr r7, r7, ip, lsr #8 -#else - orr r4, r4, r5, lsl #8 - mov r5, r5, lsr #24 - orr r5, r5, r6, lsl #8 - mov r6, r6, lsr #24 - orr r6, r6, r7, lsl #8 - mov r7, r7, lsr #24 - orr r7, r7, ip, lsl #8 -#endif - str r4, [r1], #0x04 - str r5, [r1], #0x04 - str r6, [r1], #0x04 - str r7, [r1], #0x04 -.Lkcopy_bad3: - subs r2, r2, #0x10 - bge .Lkcopy_bad3_loop16 - - adds r2, r2, #0x10 - ldmeqfd sp!, {r4-r7} - RETeq /* Return now if done */ - subs r2, r2, #0x04 - sublt r0, r0, #0x01 - blt .Lkcopy_bad_endgame - -.Lkcopy_bad3_loop4: -#ifdef __ARMEB__ - mov r4, ip, lsl #24 -#else - mov r4, ip, lsr #24 -#endif - ldr ip, [r0], #0x04 - subs r2, r2, #0x04 -#ifdef __ARMEB__ - orr r4, r4, ip, lsr #8 -#else - orr r4, r4, ip, lsl #8 -#endif - str r4, [r1], #0x04 - bge .Lkcopy_bad3_loop4 - sub r0, r0, #0x01 - -.Lkcopy_bad_endgame: - ldmfd sp!, {r4-r7} - mov r3, #0x00 - adds r2, r2, #0x04 - RETeq -.Lkcopy_bad_endgame2: - rsbs r2, r2, #0x03 - addne pc, pc, r2, lsl #3 - nop - ldrb ip, [r0], #0x01 - strb ip, [r1], #0x01 - ldrb ip, [r0], #0x01 - strb ip, [r1], #0x01 - ldrb ip, [r0] - strb ip, [r1] - RET |