Remove kcopy(), we don't use it.
This commit is contained in:
parent
b633f50dd8
commit
ef6f667f2e
@ -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)
|
||||
*
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user