1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * __clear_user_page, __clear_user, clear_page implementation of SuperH 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2001 Kaz Kojima 6*4882a593Smuzhiyun * Copyright (C) 2001, 2002 Niibe Yutaka 7*4882a593Smuzhiyun * Copyright (C) 2006 Paul Mundt 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun#include <linux/linkage.h> 10*4882a593Smuzhiyun#include <asm/page.h> 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunENTRY(__clear_user) 13*4882a593Smuzhiyun ! 14*4882a593Smuzhiyun mov #0, r0 15*4882a593Smuzhiyun mov #0xffffffe0, r1 16*4882a593Smuzhiyun ! 17*4882a593Smuzhiyun ! r4..(r4+31)&~32 -------- not aligned [ Area 0 ] 18*4882a593Smuzhiyun ! (r4+31)&~32..(r4+r5)&~32 -------- aligned [ Area 1 ] 19*4882a593Smuzhiyun ! (r4+r5)&~32..r4+r5 -------- not aligned [ Area 2 ] 20*4882a593Smuzhiyun ! 21*4882a593Smuzhiyun ! Clear area 0 22*4882a593Smuzhiyun mov r4, r2 23*4882a593Smuzhiyun ! 24*4882a593Smuzhiyun tst r1, r5 ! length < 32 25*4882a593Smuzhiyun bt .Larea2 ! skip to remainder 26*4882a593Smuzhiyun ! 27*4882a593Smuzhiyun add #31, r2 28*4882a593Smuzhiyun and r1, r2 29*4882a593Smuzhiyun cmp/eq r4, r2 30*4882a593Smuzhiyun bt .Larea1 31*4882a593Smuzhiyun mov r2, r3 32*4882a593Smuzhiyun sub r4, r3 33*4882a593Smuzhiyun mov r3, r7 34*4882a593Smuzhiyun mov r4, r2 35*4882a593Smuzhiyun ! 36*4882a593Smuzhiyun.L0: dt r3 37*4882a593Smuzhiyun0: mov.b r0, @r2 38*4882a593Smuzhiyun bf/s .L0 39*4882a593Smuzhiyun add #1, r2 40*4882a593Smuzhiyun ! 41*4882a593Smuzhiyun sub r7, r5 42*4882a593Smuzhiyun mov r2, r4 43*4882a593Smuzhiyun.Larea1: 44*4882a593Smuzhiyun mov r4, r3 45*4882a593Smuzhiyun add r5, r3 46*4882a593Smuzhiyun and r1, r3 47*4882a593Smuzhiyun cmp/hi r2, r3 48*4882a593Smuzhiyun bf .Larea2 49*4882a593Smuzhiyun ! 50*4882a593Smuzhiyun ! Clear area 1 51*4882a593Smuzhiyun#if defined(CONFIG_CPU_SH4) 52*4882a593Smuzhiyun1: movca.l r0, @r2 53*4882a593Smuzhiyun#else 54*4882a593Smuzhiyun1: mov.l r0, @r2 55*4882a593Smuzhiyun#endif 56*4882a593Smuzhiyun add #4, r2 57*4882a593Smuzhiyun2: mov.l r0, @r2 58*4882a593Smuzhiyun add #4, r2 59*4882a593Smuzhiyun3: mov.l r0, @r2 60*4882a593Smuzhiyun add #4, r2 61*4882a593Smuzhiyun4: mov.l r0, @r2 62*4882a593Smuzhiyun add #4, r2 63*4882a593Smuzhiyun5: mov.l r0, @r2 64*4882a593Smuzhiyun add #4, r2 65*4882a593Smuzhiyun6: mov.l r0, @r2 66*4882a593Smuzhiyun add #4, r2 67*4882a593Smuzhiyun7: mov.l r0, @r2 68*4882a593Smuzhiyun add #4, r2 69*4882a593Smuzhiyun8: mov.l r0, @r2 70*4882a593Smuzhiyun add #4, r2 71*4882a593Smuzhiyun cmp/hi r2, r3 72*4882a593Smuzhiyun bt/s 1b 73*4882a593Smuzhiyun nop 74*4882a593Smuzhiyun ! 75*4882a593Smuzhiyun ! Clear area 2 76*4882a593Smuzhiyun.Larea2: 77*4882a593Smuzhiyun mov r4, r3 78*4882a593Smuzhiyun add r5, r3 79*4882a593Smuzhiyun cmp/hs r3, r2 80*4882a593Smuzhiyun bt/s .Ldone 81*4882a593Smuzhiyun sub r2, r3 82*4882a593Smuzhiyun.L2: dt r3 83*4882a593Smuzhiyun9: mov.b r0, @r2 84*4882a593Smuzhiyun bf/s .L2 85*4882a593Smuzhiyun add #1, r2 86*4882a593Smuzhiyun ! 87*4882a593Smuzhiyun.Ldone: rts 88*4882a593Smuzhiyun mov #0, r0 ! return 0 as normal return 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun ! return the number of bytes remained 91*4882a593Smuzhiyun.Lbad_clear_user: 92*4882a593Smuzhiyun mov r4, r0 93*4882a593Smuzhiyun add r5, r0 94*4882a593Smuzhiyun rts 95*4882a593Smuzhiyun sub r2, r0 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun.section __ex_table,"a" 98*4882a593Smuzhiyun .align 2 99*4882a593Smuzhiyun .long 0b, .Lbad_clear_user 100*4882a593Smuzhiyun .long 1b, .Lbad_clear_user 101*4882a593Smuzhiyun .long 2b, .Lbad_clear_user 102*4882a593Smuzhiyun .long 3b, .Lbad_clear_user 103*4882a593Smuzhiyun .long 4b, .Lbad_clear_user 104*4882a593Smuzhiyun .long 5b, .Lbad_clear_user 105*4882a593Smuzhiyun .long 6b, .Lbad_clear_user 106*4882a593Smuzhiyun .long 7b, .Lbad_clear_user 107*4882a593Smuzhiyun .long 8b, .Lbad_clear_user 108*4882a593Smuzhiyun .long 9b, .Lbad_clear_user 109*4882a593Smuzhiyun.previous 110