162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/io-readsw-armv3.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1995-2000 Russell King 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/linkage.h> 862306a36Sopenharmony_ci#include <asm/assembler.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci.Linsw_bad_alignment: 1162306a36Sopenharmony_ci adr r0, .Linsw_bad_align_msg 1262306a36Sopenharmony_ci mov r2, lr 1362306a36Sopenharmony_ci b panic 1462306a36Sopenharmony_ci.Linsw_bad_align_msg: 1562306a36Sopenharmony_ci .asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n" 1662306a36Sopenharmony_ci .align 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci.Linsw_align: tst r1, #1 1962306a36Sopenharmony_ci bne .Linsw_bad_alignment 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci ldr r3, [r0] 2262306a36Sopenharmony_ci strb r3, [r1], #1 2362306a36Sopenharmony_ci mov r3, r3, lsr #8 2462306a36Sopenharmony_ci strb r3, [r1], #1 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci subs r2, r2, #1 2762306a36Sopenharmony_ci reteq lr 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ciENTRY(__raw_readsw) 3062306a36Sopenharmony_ci teq r2, #0 @ do we have to check for the zero len? 3162306a36Sopenharmony_ci reteq lr 3262306a36Sopenharmony_ci tst r1, #3 3362306a36Sopenharmony_ci bne .Linsw_align 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci.Linsw_aligned: mov ip, #0xff 3662306a36Sopenharmony_ci orr ip, ip, ip, lsl #8 3762306a36Sopenharmony_ci stmfd sp!, {r4, r5, r6, lr} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci subs r2, r2, #8 4062306a36Sopenharmony_ci bmi .Lno_insw_8 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci.Linsw_8_lp: ldr r3, [r0] 4362306a36Sopenharmony_ci and r3, r3, ip 4462306a36Sopenharmony_ci ldr r4, [r0] 4562306a36Sopenharmony_ci orr r3, r3, r4, lsl #16 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci ldr r4, [r0] 4862306a36Sopenharmony_ci and r4, r4, ip 4962306a36Sopenharmony_ci ldr r5, [r0] 5062306a36Sopenharmony_ci orr r4, r4, r5, lsl #16 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci ldr r5, [r0] 5362306a36Sopenharmony_ci and r5, r5, ip 5462306a36Sopenharmony_ci ldr r6, [r0] 5562306a36Sopenharmony_ci orr r5, r5, r6, lsl #16 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci ldr r6, [r0] 5862306a36Sopenharmony_ci and r6, r6, ip 5962306a36Sopenharmony_ci ldr lr, [r0] 6062306a36Sopenharmony_ci orr r6, r6, lr, lsl #16 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci stmia r1!, {r3 - r6} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci subs r2, r2, #8 6562306a36Sopenharmony_ci bpl .Linsw_8_lp 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci tst r2, #7 6862306a36Sopenharmony_ci ldmfdeq sp!, {r4, r5, r6, pc} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci.Lno_insw_8: tst r2, #4 7162306a36Sopenharmony_ci beq .Lno_insw_4 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci ldr r3, [r0] 7462306a36Sopenharmony_ci and r3, r3, ip 7562306a36Sopenharmony_ci ldr r4, [r0] 7662306a36Sopenharmony_ci orr r3, r3, r4, lsl #16 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci ldr r4, [r0] 7962306a36Sopenharmony_ci and r4, r4, ip 8062306a36Sopenharmony_ci ldr r5, [r0] 8162306a36Sopenharmony_ci orr r4, r4, r5, lsl #16 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci stmia r1!, {r3, r4} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci.Lno_insw_4: tst r2, #2 8662306a36Sopenharmony_ci beq .Lno_insw_2 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci ldr r3, [r0] 8962306a36Sopenharmony_ci and r3, r3, ip 9062306a36Sopenharmony_ci ldr r4, [r0] 9162306a36Sopenharmony_ci orr r3, r3, r4, lsl #16 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci str r3, [r1], #4 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci.Lno_insw_2: tst r2, #1 9662306a36Sopenharmony_ci ldrne r3, [r0] 9762306a36Sopenharmony_ci strbne r3, [r1], #1 9862306a36Sopenharmony_ci movne r3, r3, lsr #8 9962306a36Sopenharmony_ci strbne r3, [r1] 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci ldmfd sp!, {r4, r5, r6, pc} 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci 104