0001
0002
0003
0004
0005
0006
0007 #include <linux/linkage.h>
0008 #include <asm/assembler.h>
0009
0010 .Linsw_bad_alignment:
0011 adr r0, .Linsw_bad_align_msg
0012 mov r2, lr
0013 b panic
0014 .Linsw_bad_align_msg:
0015 .asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
0016 .align
0017
0018 .Linsw_align: tst r1, #1
0019 bne .Linsw_bad_alignment
0020
0021 ldr r3, [r0]
0022 strb r3, [r1], #1
0023 mov r3, r3, lsr #8
0024 strb r3, [r1], #1
0025
0026 subs r2, r2, #1
0027 reteq lr
0028
0029 ENTRY(__raw_readsw)
0030 teq r2, #0 @ do we have to check for the zero len?
0031 reteq lr
0032 tst r1, #3
0033 bne .Linsw_align
0034
0035 .Linsw_aligned: mov ip, #0xff
0036 orr ip, ip, ip, lsl #8
0037 stmfd sp!, {r4, r5, r6, lr}
0038
0039 subs r2, r2, #8
0040 bmi .Lno_insw_8
0041
0042 .Linsw_8_lp: ldr r3, [r0]
0043 and r3, r3, ip
0044 ldr r4, [r0]
0045 orr r3, r3, r4, lsl #16
0046
0047 ldr r4, [r0]
0048 and r4, r4, ip
0049 ldr r5, [r0]
0050 orr r4, r4, r5, lsl #16
0051
0052 ldr r5, [r0]
0053 and r5, r5, ip
0054 ldr r6, [r0]
0055 orr r5, r5, r6, lsl #16
0056
0057 ldr r6, [r0]
0058 and r6, r6, ip
0059 ldr lr, [r0]
0060 orr r6, r6, lr, lsl #16
0061
0062 stmia r1!, {r3 - r6}
0063
0064 subs r2, r2, #8
0065 bpl .Linsw_8_lp
0066
0067 tst r2, #7
0068 ldmfdeq sp!, {r4, r5, r6, pc}
0069
0070 .Lno_insw_8: tst r2, #4
0071 beq .Lno_insw_4
0072
0073 ldr r3, [r0]
0074 and r3, r3, ip
0075 ldr r4, [r0]
0076 orr r3, r3, r4, lsl #16
0077
0078 ldr r4, [r0]
0079 and r4, r4, ip
0080 ldr r5, [r0]
0081 orr r4, r4, r5, lsl #16
0082
0083 stmia r1!, {r3, r4}
0084
0085 .Lno_insw_4: tst r2, #2
0086 beq .Lno_insw_2
0087
0088 ldr r3, [r0]
0089 and r3, r3, ip
0090 ldr r4, [r0]
0091 orr r3, r3, r4, lsl #16
0092
0093 str r3, [r1], #4
0094
0095 .Lno_insw_2: tst r2, #1
0096 ldrne r3, [r0]
0097 strbne r3, [r1], #1
0098 movne r3, r3, lsr #8
0099 strbne r3, [r1]
0100
0101 ldmfd sp!, {r4, r5, r6, pc}
0102
0103