Linux Audio

Check our new training course

Loading...
v4.6
  1/*
  2 *  linux/arch/arm/lib/copy_to_user.S
  3 *
  4 *  Author:	Nicolas Pitre
  5 *  Created:	Sep 29, 2005
  6 *  Copyright:	MontaVista Software, Inc.
  7 *
  8 *  This program is free software; you can redistribute it and/or modify
  9 *  it under the terms of the GNU General Public License version 2 as
 10 *  published by the Free Software Foundation.
 11 */
 12
 13#include <linux/linkage.h>
 14#include <asm/assembler.h>
 15#include <asm/unwind.h>
 16
 17/*
 18 * Prototype:
 19 *
 20 *	size_t arm_copy_to_user(void *to, const void *from, size_t n)
 21 *
 22 * Purpose:
 23 *
 24 *	copy a block to user memory from kernel memory
 25 *
 26 * Params:
 27 *
 28 *	to = user memory
 29 *	from = kernel memory
 30 *	n = number of bytes to copy
 31 *
 32 * Return value:
 33 *
 34 *	Number of bytes NOT copied.
 35 */
 36
 37#define LDR1W_SHIFT	0
 38#ifndef CONFIG_THUMB2_KERNEL
 39#define STR1W_SHIFT	0
 40#else
 41#define STR1W_SHIFT	1
 42#endif
 43
 44	.macro ldr1w ptr reg abort
 45	W(ldr) \reg, [\ptr], #4
 46	.endm
 47
 48	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
 49	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
 50	.endm
 51
 52	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 53	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
 54	.endm
 55
 56	.macro ldr1b ptr reg cond=al abort
 57	ldr\cond\()b \reg, [\ptr], #1
 58	.endm
 59
 60	.macro str1w ptr reg abort
 61	strusr	\reg, \ptr, 4, abort=\abort
 62	.endm
 63
 64	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 65	str1w \ptr, \reg1, \abort
 66	str1w \ptr, \reg2, \abort
 67	str1w \ptr, \reg3, \abort
 68	str1w \ptr, \reg4, \abort
 69	str1w \ptr, \reg5, \abort
 70	str1w \ptr, \reg6, \abort
 71	str1w \ptr, \reg7, \abort
 72	str1w \ptr, \reg8, \abort
 73	.endm
 74
 75	.macro str1b ptr reg cond=al abort
 76	strusr	\reg, \ptr, 1, \cond, abort=\abort
 77	.endm
 78
 79	.macro enter reg1 reg2
 80	mov	r3, #0
 81	stmdb	sp!, {r0, r2, r3, \reg1, \reg2}
 82	.endm
 83
 84	.macro usave reg1 reg2
 85	UNWIND(	.save {r0, r2, r3, \reg1, \reg2}	)
 86	.endm
 87
 88	.macro exit reg1 reg2
 89	add	sp, sp, #8
 90	ldmfd	sp!, {r0, \reg1, \reg2}
 91	.endm
 92
 93	.text
 94
 95ENTRY(__copy_to_user_std)
 96WEAK(arm_copy_to_user)
 97
 98#include "copy_template.S"
 99
100ENDPROC(arm_copy_to_user)
101ENDPROC(__copy_to_user_std)
102
103	.pushsection .text.fixup,"ax"
104	.align 0
105	copy_abort_preamble
106	ldmfd	sp!, {r1, r2, r3}
107	sub	r0, r0, r1
108	rsb	r0, r0, r2
109	copy_abort_end
110	.popsection
111
v4.17
  1/*
  2 *  linux/arch/arm/lib/copy_to_user.S
  3 *
  4 *  Author:	Nicolas Pitre
  5 *  Created:	Sep 29, 2005
  6 *  Copyright:	MontaVista Software, Inc.
  7 *
  8 *  This program is free software; you can redistribute it and/or modify
  9 *  it under the terms of the GNU General Public License version 2 as
 10 *  published by the Free Software Foundation.
 11 */
 12
 13#include <linux/linkage.h>
 14#include <asm/assembler.h>
 15#include <asm/unwind.h>
 16
 17/*
 18 * Prototype:
 19 *
 20 *	size_t arm_copy_to_user(void *to, const void *from, size_t n)
 21 *
 22 * Purpose:
 23 *
 24 *	copy a block to user memory from kernel memory
 25 *
 26 * Params:
 27 *
 28 *	to = user memory
 29 *	from = kernel memory
 30 *	n = number of bytes to copy
 31 *
 32 * Return value:
 33 *
 34 *	Number of bytes NOT copied.
 35 */
 36
 37#define LDR1W_SHIFT	0
 38#ifndef CONFIG_THUMB2_KERNEL
 39#define STR1W_SHIFT	0
 40#else
 41#define STR1W_SHIFT	1
 42#endif
 43
 44	.macro ldr1w ptr reg abort
 45	W(ldr) \reg, [\ptr], #4
 46	.endm
 47
 48	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
 49	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
 50	.endm
 51
 52	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 53	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
 54	.endm
 55
 56	.macro ldr1b ptr reg cond=al abort
 57	ldr\cond\()b \reg, [\ptr], #1
 58	.endm
 59
 60	.macro str1w ptr reg abort
 61	strusr	\reg, \ptr, 4, abort=\abort
 62	.endm
 63
 64	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 65	str1w \ptr, \reg1, \abort
 66	str1w \ptr, \reg2, \abort
 67	str1w \ptr, \reg3, \abort
 68	str1w \ptr, \reg4, \abort
 69	str1w \ptr, \reg5, \abort
 70	str1w \ptr, \reg6, \abort
 71	str1w \ptr, \reg7, \abort
 72	str1w \ptr, \reg8, \abort
 73	.endm
 74
 75	.macro str1b ptr reg cond=al abort
 76	strusr	\reg, \ptr, 1, \cond, abort=\abort
 77	.endm
 78
 79	.macro enter reg1 reg2
 80	mov	r3, #0
 81	stmdb	sp!, {r0, r2, r3, \reg1, \reg2}
 82	.endm
 83
 84	.macro usave reg1 reg2
 85	UNWIND(	.save {r0, r2, r3, \reg1, \reg2}	)
 86	.endm
 87
 88	.macro exit reg1 reg2
 89	add	sp, sp, #8
 90	ldmfd	sp!, {r0, \reg1, \reg2}
 91	.endm
 92
 93	.text
 94
 95ENTRY(__copy_to_user_std)
 96WEAK(arm_copy_to_user)
 97
 98#include "copy_template.S"
 99
100ENDPROC(arm_copy_to_user)
101ENDPROC(__copy_to_user_std)
102
103	.pushsection .text.fixup,"ax"
104	.align 0
105	copy_abort_preamble
106	ldmfd	sp!, {r1, r2, r3}
107	sub	r0, r0, r1
108	rsb	r0, r0, r2
109	copy_abort_end
110	.popsection
111