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