cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clear_user.S (1294B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 *  linux/arch/arm/lib/clear_user.S
      4 *
      5 *  Copyright (C) 1995, 1996,1997,1998 Russell King
      6 */
      7#include <linux/linkage.h>
      8#include <asm/assembler.h>
      9#include <asm/unwind.h>
     10
     11		.text
     12
     13/* Prototype: unsigned long arm_clear_user(void *addr, size_t sz)
     14 * Purpose  : clear some user memory
     15 * Params   : addr - user memory address to clear
     16 *          : sz   - number of bytes to clear
     17 * Returns  : number of bytes NOT cleared
     18 */
     19ENTRY(__clear_user_std)
     20WEAK(arm_clear_user)
     21UNWIND(.fnstart)
     22UNWIND(.save {r1, lr})
     23		stmfd	sp!, {r1, lr}
     24		mov	r2, #0
     25		cmp	r1, #4
     26		blt	2f
     27		ands	ip, r0, #3
     28		beq	1f
     29		cmp	ip, #2
     30		strusr	r2, r0, 1
     31		strusr	r2, r0, 1, le
     32		strusr	r2, r0, 1, lt
     33		rsb	ip, ip, #4
     34		sub	r1, r1, ip		@  7  6  5  4  3  2  1
     351:		subs	r1, r1, #8		@ -1 -2 -3 -4 -5 -6 -7
     36		strusr	r2, r0, 4, pl, rept=2
     37		bpl	1b
     38		adds	r1, r1, #4		@  3  2  1  0 -1 -2 -3
     39		strusr	r2, r0, 4, pl
     402:		tst	r1, #2			@ 1x 1x 0x 0x 1x 1x 0x
     41		strusr	r2, r0, 1, ne, rept=2
     42		tst	r1, #1			@ x1 x0 x1 x0 x1 x0 x1
     43		it	ne			@ explicit IT needed for the label
     44USER(		strbtne	r2, [r0])
     45		mov	r0, #0
     46		ldmfd	sp!, {r1, pc}
     47UNWIND(.fnend)
     48ENDPROC(arm_clear_user)
     49ENDPROC(__clear_user_std)
     50
     51		.pushsection .text.fixup,"ax"
     52		.align	0
     539001:		ldmfd	sp!, {r0, pc}
     54		.popsection
     55