^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/arm/lib/io-readsw-armv3.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1995-2000 Russell King
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/assembler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) .Linsw_bad_alignment:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) adr r0, .Linsw_bad_align_msg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) mov r2, lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) b panic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) .Linsw_bad_align_msg:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) .asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .align
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .Linsw_align: tst r1, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) bne .Linsw_bad_alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) ldr r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) strb r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) mov r3, r3, lsr #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) strb r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) subs r2, r2, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) reteq lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ENTRY(__raw_readsw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) teq r2, #0 @ do we have to check for the zero len?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) reteq lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) tst r1, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) bne .Linsw_align
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .Linsw_aligned: mov ip, #0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) orr ip, ip, ip, lsl #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) stmfd sp!, {r4, r5, r6, lr}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) subs r2, r2, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) bmi .Lno_insw_8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .Linsw_8_lp: ldr r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) and r3, r3, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ldr r4, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) orr r3, r3, r4, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ldr r4, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) and r4, r4, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ldr r5, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) orr r4, r4, r5, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ldr r5, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) and r5, r5, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ldr r6, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) orr r5, r5, r6, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ldr r6, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) and r6, r6, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ldr lr, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) orr r6, r6, lr, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) stmia r1!, {r3 - r6}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) subs r2, r2, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) bpl .Linsw_8_lp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) tst r2, #7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ldmfdeq sp!, {r4, r5, r6, pc}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .Lno_insw_8: tst r2, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) beq .Lno_insw_4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ldr r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) and r3, r3, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ldr r4, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) orr r3, r3, r4, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ldr r4, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) and r4, r4, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ldr r5, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) orr r4, r4, r5, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) stmia r1!, {r3, r4}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .Lno_insw_4: tst r2, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) beq .Lno_insw_2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) ldr r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) and r3, r3, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ldr r4, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) orr r3, r3, r4, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) str r3, [r1], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .Lno_insw_2: tst r2, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ldrne r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) strbne r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) movne r3, r3, lsr #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) strbne r3, [r1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ldmfd sp!, {r4, r5, r6, pc}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)