162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 362306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 462306a36Sopenharmony_ci * for more details. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Quick'n'dirty IP checksum ... 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 1998, 1999 Ralf Baechle 962306a36Sopenharmony_ci * Copyright (C) 1999 Silicon Graphics, Inc. 1062306a36Sopenharmony_ci * Copyright (C) 2007 Maciej W. Rozycki 1162306a36Sopenharmony_ci * Copyright (C) 2014 Imagination Technologies Ltd. 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci#include <linux/errno.h> 1462306a36Sopenharmony_ci#include <linux/export.h> 1562306a36Sopenharmony_ci#include <asm/asm.h> 1662306a36Sopenharmony_ci#include <asm/asm-offsets.h> 1762306a36Sopenharmony_ci#include <asm/regdef.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#ifdef CONFIG_64BIT 2062306a36Sopenharmony_ci/* 2162306a36Sopenharmony_ci * As we are sharing code base with the mips32 tree (which use the o32 ABI 2262306a36Sopenharmony_ci * register definitions). We need to redefine the register definitions from 2362306a36Sopenharmony_ci * the n64 ABI register naming to the o32 ABI register naming. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci#undef t0 2662306a36Sopenharmony_ci#undef t1 2762306a36Sopenharmony_ci#undef t2 2862306a36Sopenharmony_ci#undef t3 2962306a36Sopenharmony_ci#define t0 $8 3062306a36Sopenharmony_ci#define t1 $9 3162306a36Sopenharmony_ci#define t2 $10 3262306a36Sopenharmony_ci#define t3 $11 3362306a36Sopenharmony_ci#define t4 $12 3462306a36Sopenharmony_ci#define t5 $13 3562306a36Sopenharmony_ci#define t6 $14 3662306a36Sopenharmony_ci#define t7 $15 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define USE_DOUBLE 3962306a36Sopenharmony_ci#endif 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#ifdef USE_DOUBLE 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define LOAD ld 4462306a36Sopenharmony_ci#define LOAD32 lwu 4562306a36Sopenharmony_ci#define ADD daddu 4662306a36Sopenharmony_ci#define NBYTES 8 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#else 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define LOAD lw 5162306a36Sopenharmony_ci#define LOAD32 lw 5262306a36Sopenharmony_ci#define ADD addu 5362306a36Sopenharmony_ci#define NBYTES 4 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#endif /* USE_DOUBLE */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define UNIT(unit) ((unit)*NBYTES) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define ADDC(sum,reg) \ 6062306a36Sopenharmony_ci .set push; \ 6162306a36Sopenharmony_ci .set noat; \ 6262306a36Sopenharmony_ci ADD sum, reg; \ 6362306a36Sopenharmony_ci sltu v1, sum, reg; \ 6462306a36Sopenharmony_ci ADD sum, v1; \ 6562306a36Sopenharmony_ci .set pop 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#define ADDC32(sum,reg) \ 6862306a36Sopenharmony_ci .set push; \ 6962306a36Sopenharmony_ci .set noat; \ 7062306a36Sopenharmony_ci addu sum, reg; \ 7162306a36Sopenharmony_ci sltu v1, sum, reg; \ 7262306a36Sopenharmony_ci addu sum, v1; \ 7362306a36Sopenharmony_ci .set pop 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define CSUM_BIGCHUNK1(src, offset, sum, _t0, _t1, _t2, _t3) \ 7662306a36Sopenharmony_ci LOAD _t0, (offset + UNIT(0))(src); \ 7762306a36Sopenharmony_ci LOAD _t1, (offset + UNIT(1))(src); \ 7862306a36Sopenharmony_ci LOAD _t2, (offset + UNIT(2))(src); \ 7962306a36Sopenharmony_ci LOAD _t3, (offset + UNIT(3))(src); \ 8062306a36Sopenharmony_ci ADDC(_t0, _t1); \ 8162306a36Sopenharmony_ci ADDC(_t2, _t3); \ 8262306a36Sopenharmony_ci ADDC(sum, _t0); \ 8362306a36Sopenharmony_ci ADDC(sum, _t2) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#ifdef USE_DOUBLE 8662306a36Sopenharmony_ci#define CSUM_BIGCHUNK(src, offset, sum, _t0, _t1, _t2, _t3) \ 8762306a36Sopenharmony_ci CSUM_BIGCHUNK1(src, offset, sum, _t0, _t1, _t2, _t3) 8862306a36Sopenharmony_ci#else 8962306a36Sopenharmony_ci#define CSUM_BIGCHUNK(src, offset, sum, _t0, _t1, _t2, _t3) \ 9062306a36Sopenharmony_ci CSUM_BIGCHUNK1(src, offset, sum, _t0, _t1, _t2, _t3); \ 9162306a36Sopenharmony_ci CSUM_BIGCHUNK1(src, offset + 0x10, sum, _t0, _t1, _t2, _t3) 9262306a36Sopenharmony_ci#endif 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* 9562306a36Sopenharmony_ci * a0: source address 9662306a36Sopenharmony_ci * a1: length of the area to checksum 9762306a36Sopenharmony_ci * a2: partial checksum 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define src a0 10162306a36Sopenharmony_ci#define sum v0 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci .text 10462306a36Sopenharmony_ci .set noreorder 10562306a36Sopenharmony_ci .align 5 10662306a36Sopenharmony_ciLEAF(csum_partial) 10762306a36Sopenharmony_ciEXPORT_SYMBOL(csum_partial) 10862306a36Sopenharmony_ci move sum, zero 10962306a36Sopenharmony_ci move t7, zero 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci sltiu t8, a1, 0x8 11262306a36Sopenharmony_ci bnez t8, .Lsmall_csumcpy /* < 8 bytes to copy */ 11362306a36Sopenharmony_ci move t2, a1 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci andi t7, src, 0x1 /* odd buffer? */ 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci.Lhword_align: 11862306a36Sopenharmony_ci beqz t7, .Lword_align 11962306a36Sopenharmony_ci andi t8, src, 0x2 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci lbu t0, (src) 12262306a36Sopenharmony_ci LONG_SUBU a1, a1, 0x1 12362306a36Sopenharmony_ci#ifdef __MIPSEL__ 12462306a36Sopenharmony_ci sll t0, t0, 8 12562306a36Sopenharmony_ci#endif 12662306a36Sopenharmony_ci ADDC(sum, t0) 12762306a36Sopenharmony_ci PTR_ADDU src, src, 0x1 12862306a36Sopenharmony_ci andi t8, src, 0x2 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci.Lword_align: 13162306a36Sopenharmony_ci beqz t8, .Ldword_align 13262306a36Sopenharmony_ci sltiu t8, a1, 56 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci lhu t0, (src) 13562306a36Sopenharmony_ci LONG_SUBU a1, a1, 0x2 13662306a36Sopenharmony_ci ADDC(sum, t0) 13762306a36Sopenharmony_ci sltiu t8, a1, 56 13862306a36Sopenharmony_ci PTR_ADDU src, src, 0x2 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci.Ldword_align: 14162306a36Sopenharmony_ci bnez t8, .Ldo_end_words 14262306a36Sopenharmony_ci move t8, a1 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci andi t8, src, 0x4 14562306a36Sopenharmony_ci beqz t8, .Lqword_align 14662306a36Sopenharmony_ci andi t8, src, 0x8 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci LOAD32 t0, 0x00(src) 14962306a36Sopenharmony_ci LONG_SUBU a1, a1, 0x4 15062306a36Sopenharmony_ci ADDC(sum, t0) 15162306a36Sopenharmony_ci PTR_ADDU src, src, 0x4 15262306a36Sopenharmony_ci andi t8, src, 0x8 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci.Lqword_align: 15562306a36Sopenharmony_ci beqz t8, .Loword_align 15662306a36Sopenharmony_ci andi t8, src, 0x10 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci#ifdef USE_DOUBLE 15962306a36Sopenharmony_ci ld t0, 0x00(src) 16062306a36Sopenharmony_ci LONG_SUBU a1, a1, 0x8 16162306a36Sopenharmony_ci ADDC(sum, t0) 16262306a36Sopenharmony_ci#else 16362306a36Sopenharmony_ci lw t0, 0x00(src) 16462306a36Sopenharmony_ci lw t1, 0x04(src) 16562306a36Sopenharmony_ci LONG_SUBU a1, a1, 0x8 16662306a36Sopenharmony_ci ADDC(sum, t0) 16762306a36Sopenharmony_ci ADDC(sum, t1) 16862306a36Sopenharmony_ci#endif 16962306a36Sopenharmony_ci PTR_ADDU src, src, 0x8 17062306a36Sopenharmony_ci andi t8, src, 0x10 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci.Loword_align: 17362306a36Sopenharmony_ci beqz t8, .Lbegin_movement 17462306a36Sopenharmony_ci LONG_SRL t8, a1, 0x7 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#ifdef USE_DOUBLE 17762306a36Sopenharmony_ci ld t0, 0x00(src) 17862306a36Sopenharmony_ci ld t1, 0x08(src) 17962306a36Sopenharmony_ci ADDC(sum, t0) 18062306a36Sopenharmony_ci ADDC(sum, t1) 18162306a36Sopenharmony_ci#else 18262306a36Sopenharmony_ci CSUM_BIGCHUNK1(src, 0x00, sum, t0, t1, t3, t4) 18362306a36Sopenharmony_ci#endif 18462306a36Sopenharmony_ci LONG_SUBU a1, a1, 0x10 18562306a36Sopenharmony_ci PTR_ADDU src, src, 0x10 18662306a36Sopenharmony_ci LONG_SRL t8, a1, 0x7 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci.Lbegin_movement: 18962306a36Sopenharmony_ci beqz t8, 1f 19062306a36Sopenharmony_ci andi t2, a1, 0x40 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci.Lmove_128bytes: 19362306a36Sopenharmony_ci CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) 19462306a36Sopenharmony_ci CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4) 19562306a36Sopenharmony_ci CSUM_BIGCHUNK(src, 0x40, sum, t0, t1, t3, t4) 19662306a36Sopenharmony_ci CSUM_BIGCHUNK(src, 0x60, sum, t0, t1, t3, t4) 19762306a36Sopenharmony_ci LONG_SUBU t8, t8, 0x01 19862306a36Sopenharmony_ci .set reorder /* DADDI_WAR */ 19962306a36Sopenharmony_ci PTR_ADDU src, src, 0x80 20062306a36Sopenharmony_ci bnez t8, .Lmove_128bytes 20162306a36Sopenharmony_ci .set noreorder 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci1: 20462306a36Sopenharmony_ci beqz t2, 1f 20562306a36Sopenharmony_ci andi t2, a1, 0x20 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci.Lmove_64bytes: 20862306a36Sopenharmony_ci CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) 20962306a36Sopenharmony_ci CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4) 21062306a36Sopenharmony_ci PTR_ADDU src, src, 0x40 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci1: 21362306a36Sopenharmony_ci beqz t2, .Ldo_end_words 21462306a36Sopenharmony_ci andi t8, a1, 0x1c 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci.Lmove_32bytes: 21762306a36Sopenharmony_ci CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) 21862306a36Sopenharmony_ci andi t8, a1, 0x1c 21962306a36Sopenharmony_ci PTR_ADDU src, src, 0x20 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci.Ldo_end_words: 22262306a36Sopenharmony_ci beqz t8, .Lsmall_csumcpy 22362306a36Sopenharmony_ci andi t2, a1, 0x3 22462306a36Sopenharmony_ci LONG_SRL t8, t8, 0x2 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci.Lend_words: 22762306a36Sopenharmony_ci LOAD32 t0, (src) 22862306a36Sopenharmony_ci LONG_SUBU t8, t8, 0x1 22962306a36Sopenharmony_ci ADDC(sum, t0) 23062306a36Sopenharmony_ci .set reorder /* DADDI_WAR */ 23162306a36Sopenharmony_ci PTR_ADDU src, src, 0x4 23262306a36Sopenharmony_ci bnez t8, .Lend_words 23362306a36Sopenharmony_ci .set noreorder 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci/* unknown src alignment and < 8 bytes to go */ 23662306a36Sopenharmony_ci.Lsmall_csumcpy: 23762306a36Sopenharmony_ci move a1, t2 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci andi t0, a1, 4 24062306a36Sopenharmony_ci beqz t0, 1f 24162306a36Sopenharmony_ci andi t0, a1, 2 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci /* Still a full word to go */ 24462306a36Sopenharmony_ci ulw t1, (src) 24562306a36Sopenharmony_ci PTR_ADDIU src, 4 24662306a36Sopenharmony_ci#ifdef USE_DOUBLE 24762306a36Sopenharmony_ci dsll t1, t1, 32 /* clear lower 32bit */ 24862306a36Sopenharmony_ci#endif 24962306a36Sopenharmony_ci ADDC(sum, t1) 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci1: move t1, zero 25262306a36Sopenharmony_ci beqz t0, 1f 25362306a36Sopenharmony_ci andi t0, a1, 1 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* Still a halfword to go */ 25662306a36Sopenharmony_ci ulhu t1, (src) 25762306a36Sopenharmony_ci PTR_ADDIU src, 2 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci1: beqz t0, 1f 26062306a36Sopenharmony_ci sll t1, t1, 16 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci lbu t2, (src) 26362306a36Sopenharmony_ci nop 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci#ifdef __MIPSEB__ 26662306a36Sopenharmony_ci sll t2, t2, 8 26762306a36Sopenharmony_ci#endif 26862306a36Sopenharmony_ci or t1, t2 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci1: ADDC(sum, t1) 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci /* fold checksum */ 27362306a36Sopenharmony_ci#ifdef USE_DOUBLE 27462306a36Sopenharmony_ci dsll32 v1, sum, 0 27562306a36Sopenharmony_ci daddu sum, v1 27662306a36Sopenharmony_ci sltu v1, sum, v1 27762306a36Sopenharmony_ci dsra32 sum, sum, 0 27862306a36Sopenharmony_ci addu sum, v1 27962306a36Sopenharmony_ci#endif 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci /* odd buffer alignment? */ 28262306a36Sopenharmony_ci#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR5) || \ 28362306a36Sopenharmony_ci defined(CONFIG_CPU_LOONGSON64) 28462306a36Sopenharmony_ci .set push 28562306a36Sopenharmony_ci .set arch=mips32r2 28662306a36Sopenharmony_ci wsbh v1, sum 28762306a36Sopenharmony_ci movn sum, v1, t7 28862306a36Sopenharmony_ci .set pop 28962306a36Sopenharmony_ci#else 29062306a36Sopenharmony_ci beqz t7, 1f /* odd buffer alignment? */ 29162306a36Sopenharmony_ci lui v1, 0x00ff 29262306a36Sopenharmony_ci addu v1, 0x00ff 29362306a36Sopenharmony_ci and t0, sum, v1 29462306a36Sopenharmony_ci sll t0, t0, 8 29562306a36Sopenharmony_ci srl sum, sum, 8 29662306a36Sopenharmony_ci and sum, sum, v1 29762306a36Sopenharmony_ci or sum, sum, t0 29862306a36Sopenharmony_ci1: 29962306a36Sopenharmony_ci#endif 30062306a36Sopenharmony_ci .set reorder 30162306a36Sopenharmony_ci /* Add the passed partial csum. */ 30262306a36Sopenharmony_ci ADDC32(sum, a2) 30362306a36Sopenharmony_ci jr ra 30462306a36Sopenharmony_ci .set noreorder 30562306a36Sopenharmony_ci END(csum_partial) 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci/* 30962306a36Sopenharmony_ci * checksum and copy routines based on memcpy.S 31062306a36Sopenharmony_ci * 31162306a36Sopenharmony_ci * csum_partial_copy_nocheck(src, dst, len) 31262306a36Sopenharmony_ci * __csum_partial_copy_kernel(src, dst, len) 31362306a36Sopenharmony_ci * 31462306a36Sopenharmony_ci * See "Spec" in memcpy.S for details. Unlike __copy_user, all 31562306a36Sopenharmony_ci * function in this file use the standard calling convention. 31662306a36Sopenharmony_ci */ 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci#define src a0 31962306a36Sopenharmony_ci#define dst a1 32062306a36Sopenharmony_ci#define len a2 32162306a36Sopenharmony_ci#define sum v0 32262306a36Sopenharmony_ci#define odd t8 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci/* 32562306a36Sopenharmony_ci * All exception handlers simply return 0. 32662306a36Sopenharmony_ci */ 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci/* Instruction type */ 32962306a36Sopenharmony_ci#define LD_INSN 1 33062306a36Sopenharmony_ci#define ST_INSN 2 33162306a36Sopenharmony_ci#define LEGACY_MODE 1 33262306a36Sopenharmony_ci#define EVA_MODE 2 33362306a36Sopenharmony_ci#define USEROP 1 33462306a36Sopenharmony_ci#define KERNELOP 2 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci/* 33762306a36Sopenharmony_ci * Wrapper to add an entry in the exception table 33862306a36Sopenharmony_ci * in case the insn causes a memory exception. 33962306a36Sopenharmony_ci * Arguments: 34062306a36Sopenharmony_ci * insn : Load/store instruction 34162306a36Sopenharmony_ci * type : Instruction type 34262306a36Sopenharmony_ci * reg : Register 34362306a36Sopenharmony_ci * addr : Address 34462306a36Sopenharmony_ci * handler : Exception handler 34562306a36Sopenharmony_ci */ 34662306a36Sopenharmony_ci#define EXC(insn, type, reg, addr) \ 34762306a36Sopenharmony_ci .if \mode == LEGACY_MODE; \ 34862306a36Sopenharmony_ci9: insn reg, addr; \ 34962306a36Sopenharmony_ci .section __ex_table,"a"; \ 35062306a36Sopenharmony_ci PTR_WD 9b, .L_exc; \ 35162306a36Sopenharmony_ci .previous; \ 35262306a36Sopenharmony_ci /* This is enabled in EVA mode */ \ 35362306a36Sopenharmony_ci .else; \ 35462306a36Sopenharmony_ci /* If loading from user or storing to user */ \ 35562306a36Sopenharmony_ci .if ((\from == USEROP) && (type == LD_INSN)) || \ 35662306a36Sopenharmony_ci ((\to == USEROP) && (type == ST_INSN)); \ 35762306a36Sopenharmony_ci9: __BUILD_EVA_INSN(insn##e, reg, addr); \ 35862306a36Sopenharmony_ci .section __ex_table,"a"; \ 35962306a36Sopenharmony_ci PTR_WD 9b, .L_exc; \ 36062306a36Sopenharmony_ci .previous; \ 36162306a36Sopenharmony_ci .else; \ 36262306a36Sopenharmony_ci /* EVA without exception */ \ 36362306a36Sopenharmony_ci insn reg, addr; \ 36462306a36Sopenharmony_ci .endif; \ 36562306a36Sopenharmony_ci .endif 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci#undef LOAD 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci#ifdef USE_DOUBLE 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci#define LOADK ld /* No exception */ 37262306a36Sopenharmony_ci#define LOAD(reg, addr) EXC(ld, LD_INSN, reg, addr) 37362306a36Sopenharmony_ci#define LOADBU(reg, addr) EXC(lbu, LD_INSN, reg, addr) 37462306a36Sopenharmony_ci#define LOADL(reg, addr) EXC(ldl, LD_INSN, reg, addr) 37562306a36Sopenharmony_ci#define LOADR(reg, addr) EXC(ldr, LD_INSN, reg, addr) 37662306a36Sopenharmony_ci#define STOREB(reg, addr) EXC(sb, ST_INSN, reg, addr) 37762306a36Sopenharmony_ci#define STOREL(reg, addr) EXC(sdl, ST_INSN, reg, addr) 37862306a36Sopenharmony_ci#define STORER(reg, addr) EXC(sdr, ST_INSN, reg, addr) 37962306a36Sopenharmony_ci#define STORE(reg, addr) EXC(sd, ST_INSN, reg, addr) 38062306a36Sopenharmony_ci#define ADD daddu 38162306a36Sopenharmony_ci#define SUB dsubu 38262306a36Sopenharmony_ci#define SRL dsrl 38362306a36Sopenharmony_ci#define SLL dsll 38462306a36Sopenharmony_ci#define SLLV dsllv 38562306a36Sopenharmony_ci#define SRLV dsrlv 38662306a36Sopenharmony_ci#define NBYTES 8 38762306a36Sopenharmony_ci#define LOG_NBYTES 3 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci#else 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci#define LOADK lw /* No exception */ 39262306a36Sopenharmony_ci#define LOAD(reg, addr) EXC(lw, LD_INSN, reg, addr) 39362306a36Sopenharmony_ci#define LOADBU(reg, addr) EXC(lbu, LD_INSN, reg, addr) 39462306a36Sopenharmony_ci#define LOADL(reg, addr) EXC(lwl, LD_INSN, reg, addr) 39562306a36Sopenharmony_ci#define LOADR(reg, addr) EXC(lwr, LD_INSN, reg, addr) 39662306a36Sopenharmony_ci#define STOREB(reg, addr) EXC(sb, ST_INSN, reg, addr) 39762306a36Sopenharmony_ci#define STOREL(reg, addr) EXC(swl, ST_INSN, reg, addr) 39862306a36Sopenharmony_ci#define STORER(reg, addr) EXC(swr, ST_INSN, reg, addr) 39962306a36Sopenharmony_ci#define STORE(reg, addr) EXC(sw, ST_INSN, reg, addr) 40062306a36Sopenharmony_ci#define ADD addu 40162306a36Sopenharmony_ci#define SUB subu 40262306a36Sopenharmony_ci#define SRL srl 40362306a36Sopenharmony_ci#define SLL sll 40462306a36Sopenharmony_ci#define SLLV sllv 40562306a36Sopenharmony_ci#define SRLV srlv 40662306a36Sopenharmony_ci#define NBYTES 4 40762306a36Sopenharmony_ci#define LOG_NBYTES 2 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci#endif /* USE_DOUBLE */ 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci#ifdef CONFIG_CPU_LITTLE_ENDIAN 41262306a36Sopenharmony_ci#define LDFIRST LOADR 41362306a36Sopenharmony_ci#define LDREST LOADL 41462306a36Sopenharmony_ci#define STFIRST STORER 41562306a36Sopenharmony_ci#define STREST STOREL 41662306a36Sopenharmony_ci#define SHIFT_DISCARD SLLV 41762306a36Sopenharmony_ci#define SHIFT_DISCARD_REVERT SRLV 41862306a36Sopenharmony_ci#else 41962306a36Sopenharmony_ci#define LDFIRST LOADL 42062306a36Sopenharmony_ci#define LDREST LOADR 42162306a36Sopenharmony_ci#define STFIRST STOREL 42262306a36Sopenharmony_ci#define STREST STORER 42362306a36Sopenharmony_ci#define SHIFT_DISCARD SRLV 42462306a36Sopenharmony_ci#define SHIFT_DISCARD_REVERT SLLV 42562306a36Sopenharmony_ci#endif 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci#define FIRST(unit) ((unit)*NBYTES) 42862306a36Sopenharmony_ci#define REST(unit) (FIRST(unit)+NBYTES-1) 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci#define ADDRMASK (NBYTES-1) 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci#ifndef CONFIG_CPU_DADDI_WORKAROUNDS 43362306a36Sopenharmony_ci .set noat 43462306a36Sopenharmony_ci#else 43562306a36Sopenharmony_ci .set at=v1 43662306a36Sopenharmony_ci#endif 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci .macro __BUILD_CSUM_PARTIAL_COPY_USER mode, from, to 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci li sum, -1 44162306a36Sopenharmony_ci move odd, zero 44262306a36Sopenharmony_ci /* 44362306a36Sopenharmony_ci * Note: dst & src may be unaligned, len may be 0 44462306a36Sopenharmony_ci * Temps 44562306a36Sopenharmony_ci */ 44662306a36Sopenharmony_ci /* 44762306a36Sopenharmony_ci * The "issue break"s below are very approximate. 44862306a36Sopenharmony_ci * Issue delays for dcache fills will perturb the schedule, as will 44962306a36Sopenharmony_ci * load queue full replay traps, etc. 45062306a36Sopenharmony_ci * 45162306a36Sopenharmony_ci * If len < NBYTES use byte operations. 45262306a36Sopenharmony_ci */ 45362306a36Sopenharmony_ci sltu t2, len, NBYTES 45462306a36Sopenharmony_ci and t1, dst, ADDRMASK 45562306a36Sopenharmony_ci bnez t2, .Lcopy_bytes_checklen\@ 45662306a36Sopenharmony_ci and t0, src, ADDRMASK 45762306a36Sopenharmony_ci andi odd, dst, 0x1 /* odd buffer? */ 45862306a36Sopenharmony_ci bnez t1, .Ldst_unaligned\@ 45962306a36Sopenharmony_ci nop 46062306a36Sopenharmony_ci bnez t0, .Lsrc_unaligned_dst_aligned\@ 46162306a36Sopenharmony_ci /* 46262306a36Sopenharmony_ci * use delay slot for fall-through 46362306a36Sopenharmony_ci * src and dst are aligned; need to compute rem 46462306a36Sopenharmony_ci */ 46562306a36Sopenharmony_ci.Lboth_aligned\@: 46662306a36Sopenharmony_ci SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter 46762306a36Sopenharmony_ci beqz t0, .Lcleanup_both_aligned\@ # len < 8*NBYTES 46862306a36Sopenharmony_ci nop 46962306a36Sopenharmony_ci SUB len, 8*NBYTES # subtract here for bgez loop 47062306a36Sopenharmony_ci .align 4 47162306a36Sopenharmony_ci1: 47262306a36Sopenharmony_ci LOAD(t0, UNIT(0)(src)) 47362306a36Sopenharmony_ci LOAD(t1, UNIT(1)(src)) 47462306a36Sopenharmony_ci LOAD(t2, UNIT(2)(src)) 47562306a36Sopenharmony_ci LOAD(t3, UNIT(3)(src)) 47662306a36Sopenharmony_ci LOAD(t4, UNIT(4)(src)) 47762306a36Sopenharmony_ci LOAD(t5, UNIT(5)(src)) 47862306a36Sopenharmony_ci LOAD(t6, UNIT(6)(src)) 47962306a36Sopenharmony_ci LOAD(t7, UNIT(7)(src)) 48062306a36Sopenharmony_ci SUB len, len, 8*NBYTES 48162306a36Sopenharmony_ci ADD src, src, 8*NBYTES 48262306a36Sopenharmony_ci STORE(t0, UNIT(0)(dst)) 48362306a36Sopenharmony_ci ADDC(t0, t1) 48462306a36Sopenharmony_ci STORE(t1, UNIT(1)(dst)) 48562306a36Sopenharmony_ci ADDC(sum, t0) 48662306a36Sopenharmony_ci STORE(t2, UNIT(2)(dst)) 48762306a36Sopenharmony_ci ADDC(t2, t3) 48862306a36Sopenharmony_ci STORE(t3, UNIT(3)(dst)) 48962306a36Sopenharmony_ci ADDC(sum, t2) 49062306a36Sopenharmony_ci STORE(t4, UNIT(4)(dst)) 49162306a36Sopenharmony_ci ADDC(t4, t5) 49262306a36Sopenharmony_ci STORE(t5, UNIT(5)(dst)) 49362306a36Sopenharmony_ci ADDC(sum, t4) 49462306a36Sopenharmony_ci STORE(t6, UNIT(6)(dst)) 49562306a36Sopenharmony_ci ADDC(t6, t7) 49662306a36Sopenharmony_ci STORE(t7, UNIT(7)(dst)) 49762306a36Sopenharmony_ci ADDC(sum, t6) 49862306a36Sopenharmony_ci .set reorder /* DADDI_WAR */ 49962306a36Sopenharmony_ci ADD dst, dst, 8*NBYTES 50062306a36Sopenharmony_ci bgez len, 1b 50162306a36Sopenharmony_ci .set noreorder 50262306a36Sopenharmony_ci ADD len, 8*NBYTES # revert len (see above) 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci /* 50562306a36Sopenharmony_ci * len == the number of bytes left to copy < 8*NBYTES 50662306a36Sopenharmony_ci */ 50762306a36Sopenharmony_ci.Lcleanup_both_aligned\@: 50862306a36Sopenharmony_ci#define rem t7 50962306a36Sopenharmony_ci beqz len, .Ldone\@ 51062306a36Sopenharmony_ci sltu t0, len, 4*NBYTES 51162306a36Sopenharmony_ci bnez t0, .Lless_than_4units\@ 51262306a36Sopenharmony_ci and rem, len, (NBYTES-1) # rem = len % NBYTES 51362306a36Sopenharmony_ci /* 51462306a36Sopenharmony_ci * len >= 4*NBYTES 51562306a36Sopenharmony_ci */ 51662306a36Sopenharmony_ci LOAD(t0, UNIT(0)(src)) 51762306a36Sopenharmony_ci LOAD(t1, UNIT(1)(src)) 51862306a36Sopenharmony_ci LOAD(t2, UNIT(2)(src)) 51962306a36Sopenharmony_ci LOAD(t3, UNIT(3)(src)) 52062306a36Sopenharmony_ci SUB len, len, 4*NBYTES 52162306a36Sopenharmony_ci ADD src, src, 4*NBYTES 52262306a36Sopenharmony_ci STORE(t0, UNIT(0)(dst)) 52362306a36Sopenharmony_ci ADDC(t0, t1) 52462306a36Sopenharmony_ci STORE(t1, UNIT(1)(dst)) 52562306a36Sopenharmony_ci ADDC(sum, t0) 52662306a36Sopenharmony_ci STORE(t2, UNIT(2)(dst)) 52762306a36Sopenharmony_ci ADDC(t2, t3) 52862306a36Sopenharmony_ci STORE(t3, UNIT(3)(dst)) 52962306a36Sopenharmony_ci ADDC(sum, t2) 53062306a36Sopenharmony_ci .set reorder /* DADDI_WAR */ 53162306a36Sopenharmony_ci ADD dst, dst, 4*NBYTES 53262306a36Sopenharmony_ci beqz len, .Ldone\@ 53362306a36Sopenharmony_ci .set noreorder 53462306a36Sopenharmony_ci.Lless_than_4units\@: 53562306a36Sopenharmony_ci /* 53662306a36Sopenharmony_ci * rem = len % NBYTES 53762306a36Sopenharmony_ci */ 53862306a36Sopenharmony_ci beq rem, len, .Lcopy_bytes\@ 53962306a36Sopenharmony_ci nop 54062306a36Sopenharmony_ci1: 54162306a36Sopenharmony_ci LOAD(t0, 0(src)) 54262306a36Sopenharmony_ci ADD src, src, NBYTES 54362306a36Sopenharmony_ci SUB len, len, NBYTES 54462306a36Sopenharmony_ci STORE(t0, 0(dst)) 54562306a36Sopenharmony_ci ADDC(sum, t0) 54662306a36Sopenharmony_ci .set reorder /* DADDI_WAR */ 54762306a36Sopenharmony_ci ADD dst, dst, NBYTES 54862306a36Sopenharmony_ci bne rem, len, 1b 54962306a36Sopenharmony_ci .set noreorder 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci /* 55262306a36Sopenharmony_ci * src and dst are aligned, need to copy rem bytes (rem < NBYTES) 55362306a36Sopenharmony_ci * A loop would do only a byte at a time with possible branch 55462306a36Sopenharmony_ci * mispredicts. Can't do an explicit LOAD dst,mask,or,STORE 55562306a36Sopenharmony_ci * because can't assume read-access to dst. Instead, use 55662306a36Sopenharmony_ci * STREST dst, which doesn't require read access to dst. 55762306a36Sopenharmony_ci * 55862306a36Sopenharmony_ci * This code should perform better than a simple loop on modern, 55962306a36Sopenharmony_ci * wide-issue mips processors because the code has fewer branches and 56062306a36Sopenharmony_ci * more instruction-level parallelism. 56162306a36Sopenharmony_ci */ 56262306a36Sopenharmony_ci#define bits t2 56362306a36Sopenharmony_ci beqz len, .Ldone\@ 56462306a36Sopenharmony_ci ADD t1, dst, len # t1 is just past last byte of dst 56562306a36Sopenharmony_ci li bits, 8*NBYTES 56662306a36Sopenharmony_ci SLL rem, len, 3 # rem = number of bits to keep 56762306a36Sopenharmony_ci LOAD(t0, 0(src)) 56862306a36Sopenharmony_ci SUB bits, bits, rem # bits = number of bits to discard 56962306a36Sopenharmony_ci SHIFT_DISCARD t0, t0, bits 57062306a36Sopenharmony_ci STREST(t0, -1(t1)) 57162306a36Sopenharmony_ci SHIFT_DISCARD_REVERT t0, t0, bits 57262306a36Sopenharmony_ci .set reorder 57362306a36Sopenharmony_ci ADDC(sum, t0) 57462306a36Sopenharmony_ci b .Ldone\@ 57562306a36Sopenharmony_ci .set noreorder 57662306a36Sopenharmony_ci.Ldst_unaligned\@: 57762306a36Sopenharmony_ci /* 57862306a36Sopenharmony_ci * dst is unaligned 57962306a36Sopenharmony_ci * t0 = src & ADDRMASK 58062306a36Sopenharmony_ci * t1 = dst & ADDRMASK; T1 > 0 58162306a36Sopenharmony_ci * len >= NBYTES 58262306a36Sopenharmony_ci * 58362306a36Sopenharmony_ci * Copy enough bytes to align dst 58462306a36Sopenharmony_ci * Set match = (src and dst have same alignment) 58562306a36Sopenharmony_ci */ 58662306a36Sopenharmony_ci#define match rem 58762306a36Sopenharmony_ci LDFIRST(t3, FIRST(0)(src)) 58862306a36Sopenharmony_ci ADD t2, zero, NBYTES 58962306a36Sopenharmony_ci LDREST(t3, REST(0)(src)) 59062306a36Sopenharmony_ci SUB t2, t2, t1 # t2 = number of bytes copied 59162306a36Sopenharmony_ci xor match, t0, t1 59262306a36Sopenharmony_ci STFIRST(t3, FIRST(0)(dst)) 59362306a36Sopenharmony_ci SLL t4, t1, 3 # t4 = number of bits to discard 59462306a36Sopenharmony_ci SHIFT_DISCARD t3, t3, t4 59562306a36Sopenharmony_ci /* no SHIFT_DISCARD_REVERT to handle odd buffer properly */ 59662306a36Sopenharmony_ci ADDC(sum, t3) 59762306a36Sopenharmony_ci beq len, t2, .Ldone\@ 59862306a36Sopenharmony_ci SUB len, len, t2 59962306a36Sopenharmony_ci ADD dst, dst, t2 60062306a36Sopenharmony_ci beqz match, .Lboth_aligned\@ 60162306a36Sopenharmony_ci ADD src, src, t2 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci.Lsrc_unaligned_dst_aligned\@: 60462306a36Sopenharmony_ci SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter 60562306a36Sopenharmony_ci beqz t0, .Lcleanup_src_unaligned\@ 60662306a36Sopenharmony_ci and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES 60762306a36Sopenharmony_ci1: 60862306a36Sopenharmony_ci/* 60962306a36Sopenharmony_ci * Avoid consecutive LD*'s to the same register since some mips 61062306a36Sopenharmony_ci * implementations can't issue them in the same cycle. 61162306a36Sopenharmony_ci * It's OK to load FIRST(N+1) before REST(N) because the two addresses 61262306a36Sopenharmony_ci * are to the same unit (unless src is aligned, but it's not). 61362306a36Sopenharmony_ci */ 61462306a36Sopenharmony_ci LDFIRST(t0, FIRST(0)(src)) 61562306a36Sopenharmony_ci LDFIRST(t1, FIRST(1)(src)) 61662306a36Sopenharmony_ci SUB len, len, 4*NBYTES 61762306a36Sopenharmony_ci LDREST(t0, REST(0)(src)) 61862306a36Sopenharmony_ci LDREST(t1, REST(1)(src)) 61962306a36Sopenharmony_ci LDFIRST(t2, FIRST(2)(src)) 62062306a36Sopenharmony_ci LDFIRST(t3, FIRST(3)(src)) 62162306a36Sopenharmony_ci LDREST(t2, REST(2)(src)) 62262306a36Sopenharmony_ci LDREST(t3, REST(3)(src)) 62362306a36Sopenharmony_ci ADD src, src, 4*NBYTES 62462306a36Sopenharmony_ci#ifdef CONFIG_CPU_SB1 62562306a36Sopenharmony_ci nop # improves slotting 62662306a36Sopenharmony_ci#endif 62762306a36Sopenharmony_ci STORE(t0, UNIT(0)(dst)) 62862306a36Sopenharmony_ci ADDC(t0, t1) 62962306a36Sopenharmony_ci STORE(t1, UNIT(1)(dst)) 63062306a36Sopenharmony_ci ADDC(sum, t0) 63162306a36Sopenharmony_ci STORE(t2, UNIT(2)(dst)) 63262306a36Sopenharmony_ci ADDC(t2, t3) 63362306a36Sopenharmony_ci STORE(t3, UNIT(3)(dst)) 63462306a36Sopenharmony_ci ADDC(sum, t2) 63562306a36Sopenharmony_ci .set reorder /* DADDI_WAR */ 63662306a36Sopenharmony_ci ADD dst, dst, 4*NBYTES 63762306a36Sopenharmony_ci bne len, rem, 1b 63862306a36Sopenharmony_ci .set noreorder 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci.Lcleanup_src_unaligned\@: 64162306a36Sopenharmony_ci beqz len, .Ldone\@ 64262306a36Sopenharmony_ci and rem, len, NBYTES-1 # rem = len % NBYTES 64362306a36Sopenharmony_ci beq rem, len, .Lcopy_bytes\@ 64462306a36Sopenharmony_ci nop 64562306a36Sopenharmony_ci1: 64662306a36Sopenharmony_ci LDFIRST(t0, FIRST(0)(src)) 64762306a36Sopenharmony_ci LDREST(t0, REST(0)(src)) 64862306a36Sopenharmony_ci ADD src, src, NBYTES 64962306a36Sopenharmony_ci SUB len, len, NBYTES 65062306a36Sopenharmony_ci STORE(t0, 0(dst)) 65162306a36Sopenharmony_ci ADDC(sum, t0) 65262306a36Sopenharmony_ci .set reorder /* DADDI_WAR */ 65362306a36Sopenharmony_ci ADD dst, dst, NBYTES 65462306a36Sopenharmony_ci bne len, rem, 1b 65562306a36Sopenharmony_ci .set noreorder 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ci.Lcopy_bytes_checklen\@: 65862306a36Sopenharmony_ci beqz len, .Ldone\@ 65962306a36Sopenharmony_ci nop 66062306a36Sopenharmony_ci.Lcopy_bytes\@: 66162306a36Sopenharmony_ci /* 0 < len < NBYTES */ 66262306a36Sopenharmony_ci#ifdef CONFIG_CPU_LITTLE_ENDIAN 66362306a36Sopenharmony_ci#define SHIFT_START 0 66462306a36Sopenharmony_ci#define SHIFT_INC 8 66562306a36Sopenharmony_ci#else 66662306a36Sopenharmony_ci#define SHIFT_START 8*(NBYTES-1) 66762306a36Sopenharmony_ci#define SHIFT_INC -8 66862306a36Sopenharmony_ci#endif 66962306a36Sopenharmony_ci move t2, zero # partial word 67062306a36Sopenharmony_ci li t3, SHIFT_START # shift 67162306a36Sopenharmony_ci#define COPY_BYTE(N) \ 67262306a36Sopenharmony_ci LOADBU(t0, N(src)); \ 67362306a36Sopenharmony_ci SUB len, len, 1; \ 67462306a36Sopenharmony_ci STOREB(t0, N(dst)); \ 67562306a36Sopenharmony_ci SLLV t0, t0, t3; \ 67662306a36Sopenharmony_ci addu t3, SHIFT_INC; \ 67762306a36Sopenharmony_ci beqz len, .Lcopy_bytes_done\@; \ 67862306a36Sopenharmony_ci or t2, t0 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci COPY_BYTE(0) 68162306a36Sopenharmony_ci COPY_BYTE(1) 68262306a36Sopenharmony_ci#ifdef USE_DOUBLE 68362306a36Sopenharmony_ci COPY_BYTE(2) 68462306a36Sopenharmony_ci COPY_BYTE(3) 68562306a36Sopenharmony_ci COPY_BYTE(4) 68662306a36Sopenharmony_ci COPY_BYTE(5) 68762306a36Sopenharmony_ci#endif 68862306a36Sopenharmony_ci LOADBU(t0, NBYTES-2(src)) 68962306a36Sopenharmony_ci SUB len, len, 1 69062306a36Sopenharmony_ci STOREB(t0, NBYTES-2(dst)) 69162306a36Sopenharmony_ci SLLV t0, t0, t3 69262306a36Sopenharmony_ci or t2, t0 69362306a36Sopenharmony_ci.Lcopy_bytes_done\@: 69462306a36Sopenharmony_ci ADDC(sum, t2) 69562306a36Sopenharmony_ci.Ldone\@: 69662306a36Sopenharmony_ci /* fold checksum */ 69762306a36Sopenharmony_ci .set push 69862306a36Sopenharmony_ci .set noat 69962306a36Sopenharmony_ci#ifdef USE_DOUBLE 70062306a36Sopenharmony_ci dsll32 v1, sum, 0 70162306a36Sopenharmony_ci daddu sum, v1 70262306a36Sopenharmony_ci sltu v1, sum, v1 70362306a36Sopenharmony_ci dsra32 sum, sum, 0 70462306a36Sopenharmony_ci addu sum, v1 70562306a36Sopenharmony_ci#endif 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_ci#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR5) || \ 70862306a36Sopenharmony_ci defined(CONFIG_CPU_LOONGSON64) 70962306a36Sopenharmony_ci .set push 71062306a36Sopenharmony_ci .set arch=mips32r2 71162306a36Sopenharmony_ci wsbh v1, sum 71262306a36Sopenharmony_ci movn sum, v1, odd 71362306a36Sopenharmony_ci .set pop 71462306a36Sopenharmony_ci#else 71562306a36Sopenharmony_ci beqz odd, 1f /* odd buffer alignment? */ 71662306a36Sopenharmony_ci lui v1, 0x00ff 71762306a36Sopenharmony_ci addu v1, 0x00ff 71862306a36Sopenharmony_ci and t0, sum, v1 71962306a36Sopenharmony_ci sll t0, t0, 8 72062306a36Sopenharmony_ci srl sum, sum, 8 72162306a36Sopenharmony_ci and sum, sum, v1 72262306a36Sopenharmony_ci or sum, sum, t0 72362306a36Sopenharmony_ci1: 72462306a36Sopenharmony_ci#endif 72562306a36Sopenharmony_ci .set pop 72662306a36Sopenharmony_ci .set reorder 72762306a36Sopenharmony_ci jr ra 72862306a36Sopenharmony_ci .set noreorder 72962306a36Sopenharmony_ci .endm 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci .set noreorder 73262306a36Sopenharmony_ci.L_exc: 73362306a36Sopenharmony_ci jr ra 73462306a36Sopenharmony_ci li v0, 0 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_ciFEXPORT(__csum_partial_copy_nocheck) 73762306a36Sopenharmony_ciEXPORT_SYMBOL(__csum_partial_copy_nocheck) 73862306a36Sopenharmony_ci#ifndef CONFIG_EVA 73962306a36Sopenharmony_ciFEXPORT(__csum_partial_copy_to_user) 74062306a36Sopenharmony_ciEXPORT_SYMBOL(__csum_partial_copy_to_user) 74162306a36Sopenharmony_ciFEXPORT(__csum_partial_copy_from_user) 74262306a36Sopenharmony_ciEXPORT_SYMBOL(__csum_partial_copy_from_user) 74362306a36Sopenharmony_ci#endif 74462306a36Sopenharmony_ci__BUILD_CSUM_PARTIAL_COPY_USER LEGACY_MODE USEROP USEROP 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_ci#ifdef CONFIG_EVA 74762306a36Sopenharmony_ciLEAF(__csum_partial_copy_to_user) 74862306a36Sopenharmony_ci__BUILD_CSUM_PARTIAL_COPY_USER EVA_MODE KERNELOP USEROP 74962306a36Sopenharmony_ciEND(__csum_partial_copy_to_user) 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ciLEAF(__csum_partial_copy_from_user) 75262306a36Sopenharmony_ci__BUILD_CSUM_PARTIAL_COPY_USER EVA_MODE USEROP KERNELOP 75362306a36Sopenharmony_ciEND(__csum_partial_copy_from_user) 75462306a36Sopenharmony_ci#endif 755