Linux Audio

Check our new training course

Loading...
v6.2
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * arch/alpha/lib/clear_user.S
  4 * Contributed by Richard Henderson <rth@tamu.edu>
  5 *
  6 * Zero user space, handling exceptions as we go.
  7 *
  8 * We have to make sure that $0 is always up-to-date and contains the
  9 * right "bytes left to zero" value (and that it is updated only _after_
 10 * a successful copy).  There is also some rather minor exception setup
 11 * stuff.
 12 */
 13#include <asm/export.h>
 14
 15/* Allow an exception for an insn; exit if we get one.  */
 16#define EX(x,y...)			\
 17	99: x,##y;			\
 18	.section __ex_table,"a";	\
 19	.long 99b - .;			\
 20	lda $31, $exception-99b($31); 	\
 21	.previous
 22
 23	.set noat
 24	.set noreorder
 25	.align 4
 26
 27	.globl __clear_user
 28	.ent __clear_user
 29	.frame	$30, 0, $26
 30	.prologue 0
 31
 32$loop:
 33	and	$1, 3, $4	# e0    :
 34	beq	$4, 1f		# .. e1 :
 35
 360:	EX( stq_u $31, 0($16) )	# e0    : zero one word
 37	subq	$0, 8, $0	# .. e1 :
 38	subq	$4, 1, $4	# e0    :
 39	addq	$16, 8, $16	# .. e1 :
 40	bne	$4, 0b		# e1    :
 41	unop			#       :
 42
 431:	bic	$1, 3, $1	# e0    :
 44	beq	$1, $tail	# .. e1 :
 45
 462:	EX( stq_u $31, 0($16) )	# e0    : zero four words
 47	subq	$0, 8, $0	# .. e1 :
 48	EX( stq_u $31, 8($16) )	# e0    :
 49	subq	$0, 8, $0	# .. e1 :
 50	EX( stq_u $31, 16($16) )	# e0    :
 51	subq	$0, 8, $0	# .. e1 :
 52	EX( stq_u $31, 24($16) )	# e0    :
 53	subq	$0, 8, $0	# .. e1 :
 54	subq	$1, 4, $1	# e0    :
 55	addq	$16, 32, $16	# .. e1 :
 56	bne	$1, 2b		# e1    :
 57
 58$tail:
 59	bne	$2, 1f		# e1    : is there a tail to do?
 60	ret	$31, ($26), 1	# .. e1 :
 61
 621:	EX( ldq_u $5, 0($16) )	# e0    :
 63	clr	$0		# .. e1 :
 64	nop			# e1    :
 65	mskqh	$5, $0, $5	# e0    :
 66	EX( stq_u $5, 0($16) )	# e0    :
 67	ret	$31, ($26), 1	# .. e1 :
 68
 69__clear_user:
 70	and	$17, $17, $0
 71	and	$16, 7, $4	# e0    : find dest misalignment
 72	beq	$0, $zerolength # .. e1 :
 73	addq	$0, $4, $1	# e0    : bias counter
 74	and	$1, 7, $2	# e1    : number of bytes in tail
 75	srl	$1, 3, $1	# e0    :
 76	beq	$4, $loop	# .. e1 :
 77
 78	EX( ldq_u $5, 0($16) )	# e0    : load dst word to mask back in
 79	beq	$1, $oneword	# .. e1 : sub-word store?
 80
 81	mskql	$5, $16, $5	# e0    : take care of misaligned head
 82	addq	$16, 8, $16	# .. e1 :
 83	EX( stq_u $5, -8($16) )	# e0    :
 84	addq	$0, $4, $0	# .. e1 : bytes left -= 8 - misalignment
 85	subq	$1, 1, $1	# e0    :
 86	subq	$0, 8, $0	# .. e1 :
 87	br	$loop		# e1    :
 88	unop			#       :
 89
 90$oneword:
 91	mskql	$5, $16, $4	# e0    :
 92	mskqh	$5, $2, $5	# e0    :
 93	or	$5, $4, $5	# e1    :
 94	EX( stq_u $5, 0($16) )	# e0    :
 95	clr	$0		# .. e1 :
 96
 97$zerolength:
 98$exception:
 99	ret	$31, ($26), 1	# .. e1 :
100
101	.end __clear_user
102	EXPORT_SYMBOL(__clear_user)
v5.14.15
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * arch/alpha/lib/clear_user.S
  4 * Contributed by Richard Henderson <rth@tamu.edu>
  5 *
  6 * Zero user space, handling exceptions as we go.
  7 *
  8 * We have to make sure that $0 is always up-to-date and contains the
  9 * right "bytes left to zero" value (and that it is updated only _after_
 10 * a successful copy).  There is also some rather minor exception setup
 11 * stuff.
 12 */
 13#include <asm/export.h>
 14
 15/* Allow an exception for an insn; exit if we get one.  */
 16#define EX(x,y...)			\
 17	99: x,##y;			\
 18	.section __ex_table,"a";	\
 19	.long 99b - .;			\
 20	lda $31, $exception-99b($31); 	\
 21	.previous
 22
 23	.set noat
 24	.set noreorder
 25	.align 4
 26
 27	.globl __clear_user
 28	.ent __clear_user
 29	.frame	$30, 0, $26
 30	.prologue 0
 31
 32$loop:
 33	and	$1, 3, $4	# e0    :
 34	beq	$4, 1f		# .. e1 :
 35
 360:	EX( stq_u $31, 0($16) )	# e0    : zero one word
 37	subq	$0, 8, $0	# .. e1 :
 38	subq	$4, 1, $4	# e0    :
 39	addq	$16, 8, $16	# .. e1 :
 40	bne	$4, 0b		# e1    :
 41	unop			#       :
 42
 431:	bic	$1, 3, $1	# e0    :
 44	beq	$1, $tail	# .. e1 :
 45
 462:	EX( stq_u $31, 0($16) )	# e0    : zero four words
 47	subq	$0, 8, $0	# .. e1 :
 48	EX( stq_u $31, 8($16) )	# e0    :
 49	subq	$0, 8, $0	# .. e1 :
 50	EX( stq_u $31, 16($16) )	# e0    :
 51	subq	$0, 8, $0	# .. e1 :
 52	EX( stq_u $31, 24($16) )	# e0    :
 53	subq	$0, 8, $0	# .. e1 :
 54	subq	$1, 4, $1	# e0    :
 55	addq	$16, 32, $16	# .. e1 :
 56	bne	$1, 2b		# e1    :
 57
 58$tail:
 59	bne	$2, 1f		# e1    : is there a tail to do?
 60	ret	$31, ($26), 1	# .. e1 :
 61
 621:	EX( ldq_u $5, 0($16) )	# e0    :
 63	clr	$0		# .. e1 :
 64	nop			# e1    :
 65	mskqh	$5, $0, $5	# e0    :
 66	EX( stq_u $5, 0($16) )	# e0    :
 67	ret	$31, ($26), 1	# .. e1 :
 68
 69__clear_user:
 70	and	$17, $17, $0
 71	and	$16, 7, $4	# e0    : find dest misalignment
 72	beq	$0, $zerolength # .. e1 :
 73	addq	$0, $4, $1	# e0    : bias counter
 74	and	$1, 7, $2	# e1    : number of bytes in tail
 75	srl	$1, 3, $1	# e0    :
 76	beq	$4, $loop	# .. e1 :
 77
 78	EX( ldq_u $5, 0($16) )	# e0    : load dst word to mask back in
 79	beq	$1, $oneword	# .. e1 : sub-word store?
 80
 81	mskql	$5, $16, $5	# e0    : take care of misaligned head
 82	addq	$16, 8, $16	# .. e1 :
 83	EX( stq_u $5, -8($16) )	# e0    :
 84	addq	$0, $4, $0	# .. e1 : bytes left -= 8 - misalignment
 85	subq	$1, 1, $1	# e0    :
 86	subq	$0, 8, $0	# .. e1 :
 87	br	$loop		# e1    :
 88	unop			#       :
 89
 90$oneword:
 91	mskql	$5, $16, $4	# e0    :
 92	mskqh	$5, $2, $5	# e0    :
 93	or	$5, $4, $5	# e1    :
 94	EX( stq_u $5, 0($16) )	# e0    :
 95	clr	$0		# .. e1 :
 96
 97$zerolength:
 98$exception:
 99	ret	$31, ($26), 1	# .. e1 :
100
101	.end __clear_user
102	EXPORT_SYMBOL(__clear_user)