162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/io-writesw-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.Loutsw_bad_alignment: 1162306a36Sopenharmony_ci adr r0, .Loutsw_bad_align_msg 1262306a36Sopenharmony_ci mov r2, lr 1362306a36Sopenharmony_ci b panic 1462306a36Sopenharmony_ci.Loutsw_bad_align_msg: 1562306a36Sopenharmony_ci .asciz "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n" 1662306a36Sopenharmony_ci .align 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci.Loutsw_align: tst r1, #1 1962306a36Sopenharmony_ci bne .Loutsw_bad_alignment 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci add r1, r1, #2 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci ldr r3, [r1, #-4] 2462306a36Sopenharmony_ci mov r3, r3, lsr #16 2562306a36Sopenharmony_ci orr r3, r3, r3, lsl #16 2662306a36Sopenharmony_ci str r3, [r0] 2762306a36Sopenharmony_ci subs r2, r2, #1 2862306a36Sopenharmony_ci reteq lr 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciENTRY(__raw_writesw) 3162306a36Sopenharmony_ci teq r2, #0 @ do we have to check for the zero len? 3262306a36Sopenharmony_ci reteq lr 3362306a36Sopenharmony_ci tst r1, #3 3462306a36Sopenharmony_ci bne .Loutsw_align 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci stmfd sp!, {r4, r5, r6, lr} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci subs r2, r2, #8 3962306a36Sopenharmony_ci bmi .Lno_outsw_8 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci mov ip, r3, lsl #16 4462306a36Sopenharmony_ci orr ip, ip, ip, lsr #16 4562306a36Sopenharmony_ci str ip, [r0] 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci mov ip, r3, lsr #16 4862306a36Sopenharmony_ci orr ip, ip, ip, lsl #16 4962306a36Sopenharmony_ci str ip, [r0] 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci mov ip, r4, lsl #16 5262306a36Sopenharmony_ci orr ip, ip, ip, lsr #16 5362306a36Sopenharmony_ci str ip, [r0] 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci mov ip, r4, lsr #16 5662306a36Sopenharmony_ci orr ip, ip, ip, lsl #16 5762306a36Sopenharmony_ci str ip, [r0] 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci mov ip, r5, lsl #16 6062306a36Sopenharmony_ci orr ip, ip, ip, lsr #16 6162306a36Sopenharmony_ci str ip, [r0] 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci mov ip, r5, lsr #16 6462306a36Sopenharmony_ci orr ip, ip, ip, lsl #16 6562306a36Sopenharmony_ci str ip, [r0] 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci mov ip, r6, lsl #16 6862306a36Sopenharmony_ci orr ip, ip, ip, lsr #16 6962306a36Sopenharmony_ci str ip, [r0] 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci mov ip, r6, lsr #16 7262306a36Sopenharmony_ci orr ip, ip, ip, lsl #16 7362306a36Sopenharmony_ci str ip, [r0] 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci subs r2, r2, #8 7662306a36Sopenharmony_ci bpl .Loutsw_8_lp 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci tst r2, #7 7962306a36Sopenharmony_ci ldmfdeq sp!, {r4, r5, r6, pc} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci.Lno_outsw_8: tst r2, #4 8262306a36Sopenharmony_ci beq .Lno_outsw_4 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci ldmia r1!, {r3, r4} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci mov ip, r3, lsl #16 8762306a36Sopenharmony_ci orr ip, ip, ip, lsr #16 8862306a36Sopenharmony_ci str ip, [r0] 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci mov ip, r3, lsr #16 9162306a36Sopenharmony_ci orr ip, ip, ip, lsl #16 9262306a36Sopenharmony_ci str ip, [r0] 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci mov ip, r4, lsl #16 9562306a36Sopenharmony_ci orr ip, ip, ip, lsr #16 9662306a36Sopenharmony_ci str ip, [r0] 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci mov ip, r4, lsr #16 9962306a36Sopenharmony_ci orr ip, ip, ip, lsl #16 10062306a36Sopenharmony_ci str ip, [r0] 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci.Lno_outsw_4: tst r2, #2 10362306a36Sopenharmony_ci beq .Lno_outsw_2 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci ldr r3, [r1], #4 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci mov ip, r3, lsl #16 10862306a36Sopenharmony_ci orr ip, ip, ip, lsr #16 10962306a36Sopenharmony_ci str ip, [r0] 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci mov ip, r3, lsr #16 11262306a36Sopenharmony_ci orr ip, ip, ip, lsl #16 11362306a36Sopenharmony_ci str ip, [r0] 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci.Lno_outsw_2: tst r2, #1 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci ldrne r3, [r1] 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci movne ip, r3, lsl #16 12062306a36Sopenharmony_ci orrne ip, ip, ip, lsr #16 12162306a36Sopenharmony_ci strne ip, [r0] 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci ldmfd sp!, {r4, r5, r6, pc} 124