162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/csumpartialcopyuser.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1995-1998 Russell King 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * 27/03/03 Ian Molton Clean up CONFIG_CPU 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#include <linux/linkage.h> 1062306a36Sopenharmony_ci#include <asm/assembler.h> 1162306a36Sopenharmony_ci#include <asm/errno.h> 1262306a36Sopenharmony_ci#include <asm/asm-offsets.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci .text 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#ifdef CONFIG_CPU_SW_DOMAIN_PAN 1762306a36Sopenharmony_ci .macro save_regs 1862306a36Sopenharmony_ci mrc p15, 0, ip, c3, c0, 0 1962306a36Sopenharmony_ci stmfd sp!, {r1, r2, r4 - r8, ip, lr} 2062306a36Sopenharmony_ci uaccess_enable ip 2162306a36Sopenharmony_ci .endm 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci .macro load_regs 2462306a36Sopenharmony_ci ldmfd sp!, {r1, r2, r4 - r8, ip, lr} 2562306a36Sopenharmony_ci mcr p15, 0, ip, c3, c0, 0 2662306a36Sopenharmony_ci ret lr 2762306a36Sopenharmony_ci .endm 2862306a36Sopenharmony_ci#else 2962306a36Sopenharmony_ci .macro save_regs 3062306a36Sopenharmony_ci stmfd sp!, {r1, r2, r4 - r8, lr} 3162306a36Sopenharmony_ci .endm 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci .macro load_regs 3462306a36Sopenharmony_ci ldmfd sp!, {r1, r2, r4 - r8, pc} 3562306a36Sopenharmony_ci .endm 3662306a36Sopenharmony_ci#endif 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci .macro load1b, reg1 3962306a36Sopenharmony_ci ldrusr \reg1, r0, 1 4062306a36Sopenharmony_ci .endm 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci .macro load2b, reg1, reg2 4362306a36Sopenharmony_ci ldrusr \reg1, r0, 1 4462306a36Sopenharmony_ci ldrusr \reg2, r0, 1 4562306a36Sopenharmony_ci .endm 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci .macro load1l, reg1 4862306a36Sopenharmony_ci ldrusr \reg1, r0, 4 4962306a36Sopenharmony_ci .endm 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci .macro load2l, reg1, reg2 5262306a36Sopenharmony_ci ldrusr \reg1, r0, 4 5362306a36Sopenharmony_ci ldrusr \reg2, r0, 4 5462306a36Sopenharmony_ci .endm 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci .macro load4l, reg1, reg2, reg3, reg4 5762306a36Sopenharmony_ci ldrusr \reg1, r0, 4 5862306a36Sopenharmony_ci ldrusr \reg2, r0, 4 5962306a36Sopenharmony_ci ldrusr \reg3, r0, 4 6062306a36Sopenharmony_ci ldrusr \reg4, r0, 4 6162306a36Sopenharmony_ci .endm 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* 6462306a36Sopenharmony_ci * unsigned int 6562306a36Sopenharmony_ci * csum_partial_copy_from_user(const char *src, char *dst, int len) 6662306a36Sopenharmony_ci * r0 = src, r1 = dst, r2 = len 6762306a36Sopenharmony_ci * Returns : r0 = checksum or 0 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define FN_ENTRY ENTRY(csum_partial_copy_from_user) 7162306a36Sopenharmony_ci#define FN_EXIT ENDPROC(csum_partial_copy_from_user) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#include "csumpartialcopygeneric.S" 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* 7662306a36Sopenharmony_ci * We report fault by returning 0 csum - impossible in normal case, since 7762306a36Sopenharmony_ci * we start with 0xffffffff for initial sum. 7862306a36Sopenharmony_ci */ 7962306a36Sopenharmony_ci .pushsection .text.fixup,"ax" 8062306a36Sopenharmony_ci .align 4 8162306a36Sopenharmony_ci9001: mov r0, #0 8262306a36Sopenharmony_ci load_regs 8362306a36Sopenharmony_ci .popsection 84