^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-writesw-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) .Loutsw_bad_alignment:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) adr r0, .Loutsw_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) .Loutsw_bad_align_msg:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) .asciz "outsw: 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) .Loutsw_align: tst r1, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) bne .Loutsw_bad_alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) add r1, r1, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ldr r3, [r1, #-4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) mov r3, r3, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) orr r3, r3, r3, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) str r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) subs r2, r2, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) reteq lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ENTRY(__raw_writesw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) teq r2, #0 @ do we have to check for the zero len?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) reteq lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) tst r1, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) bne .Loutsw_align
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) stmfd sp!, {r4, r5, r6, lr}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) subs r2, r2, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) bmi .Lno_outsw_8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) mov ip, r3, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) orr ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) mov ip, r3, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) orr ip, ip, ip, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) mov ip, r4, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) orr ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) mov ip, r4, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) orr ip, ip, ip, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) mov ip, r5, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) orr ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) mov ip, r5, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) orr ip, ip, ip, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) mov ip, r6, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) orr ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) mov ip, r6, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) orr ip, ip, ip, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) subs r2, r2, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) bpl .Loutsw_8_lp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) tst r2, #7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) ldmfdeq sp!, {r4, r5, r6, pc}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .Lno_outsw_8: tst r2, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) beq .Lno_outsw_4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ldmia r1!, {r3, r4}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) mov ip, r3, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) orr ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) mov ip, r3, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) orr ip, ip, ip, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) mov ip, r4, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) orr ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) mov ip, r4, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) orr ip, ip, ip, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .Lno_outsw_4: tst r2, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) beq .Lno_outsw_2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ldr r3, [r1], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) mov ip, r3, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) orr ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) mov ip, r3, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) orr ip, ip, ip, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .Lno_outsw_2: tst r2, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) ldrne r3, [r1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) movne ip, r3, lsl #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) orrne ip, ip, ip, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) strne ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) ldmfd sp!, {r4, r5, r6, pc}