Linux Audio

Check our new training course

Loading...
v6.13.7
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 *  linux/arch/arm/lib/copy_to_user.S
  4 *
  5 *  Author:	Nicolas Pitre
  6 *  Created:	Sep 29, 2005
  7 *  Copyright:	MontaVista Software, Inc.
 
 
 
 
  8 */
  9
 10#include <linux/linkage.h>
 11#include <asm/assembler.h>
 12#include <asm/unwind.h>
 13
 14/*
 15 * Prototype:
 16 *
 17 *	size_t arm_copy_to_user(void *to, const void *from, size_t n)
 18 *
 19 * Purpose:
 20 *
 21 *	copy a block to user memory from kernel memory
 22 *
 23 * Params:
 24 *
 25 *	to = user memory
 26 *	from = kernel memory
 27 *	n = number of bytes to copy
 28 *
 29 * Return value:
 30 *
 31 *	Number of bytes NOT copied.
 32 */
 33
 34#define LDR1W_SHIFT	0
 
 
 
 
 
 35
 36	.macro ldr1w ptr reg abort
 37	W(ldr) \reg, [\ptr], #4
 38	.endm
 39
 40	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
 41	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
 42	.endm
 43
 44	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 45	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
 46	.endm
 47
 48	.macro ldr1b ptr reg cond=al abort
 49	ldrb\cond \reg, [\ptr], #1
 50	.endm
 51
 52#ifdef CONFIG_CPU_USE_DOMAINS
 53
 54#ifndef CONFIG_THUMB2_KERNEL
 55#define STR1W_SHIFT	0
 56#else
 57#define STR1W_SHIFT	1
 58#endif
 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#else
 76
 77#define STR1W_SHIFT	0
 78
 79	.macro str1w ptr reg abort
 80	USERL(\abort, W(str) \reg, [\ptr], #4)
 81	.endm
 82
 83	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 84	USERL(\abort, stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8})
 85	.endm
 86
 87#endif /* CONFIG_CPU_USE_DOMAINS */
 88
 89	.macro str1b ptr reg cond=al abort
 90	strusr	\reg, \ptr, 1, \cond, abort=\abort
 91	.endm
 92
 93	.macro enter regs:vararg
 94	mov	r3, #0
 95UNWIND( .save	{r0, r2, r3, \regs}		)
 96	stmdb	sp!, {r0, r2, r3, \regs}
 97	.endm
 98
 99	.macro exit regs:vararg
100	add	sp, sp, #8
101	ldmfd	sp!, {r0, \regs}
102	.endm
103
104	.text
105
106ENTRY(__copy_to_user_std)
107WEAK(arm_copy_to_user)
108#ifdef CONFIG_CPU_SPECTRE
109	ldr	r3, =TASK_SIZE
110	uaccess_mask_range_ptr r0, r2, r3, ip
111#endif
112
113#include "copy_template.S"
114
115ENDPROC(arm_copy_to_user)
116ENDPROC(__copy_to_user_std)
117
118	.pushsection .text.fixup,"ax"
119	.align 0
120	copy_abort_preamble
121	ldmfd	sp!, {r1, r2, r3}
122	sub	r0, r0, r1
123	rsb	r0, r0, r2
124	copy_abort_end
125	.popsection
v3.1
 
  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
 16/*
 17 * Prototype:
 18 *
 19 *	size_t __copy_to_user(void *to, const void *from, size_t n)
 20 *
 21 * Purpose:
 22 *
 23 *	copy a block to user memory from kernel memory
 24 *
 25 * Params:
 26 *
 27 *	to = user memory
 28 *	from = kernel memory
 29 *	n = number of bytes to copy
 30 *
 31 * Return value:
 32 *
 33 *	Number of bytes NOT copied.
 34 */
 35
 36#define LDR1W_SHIFT	0
 37#ifndef CONFIG_THUMB2_KERNEL
 38#define STR1W_SHIFT	0
 39#else
 40#define STR1W_SHIFT	1
 41#endif
 42
 43	.macro ldr1w ptr reg abort
 44	W(ldr) \reg, [\ptr], #4
 45	.endm
 46
 47	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
 48	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
 49	.endm
 50
 51	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 52	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
 53	.endm
 54
 55	.macro ldr1b ptr reg cond=al abort
 56	ldr\cond\()b \reg, [\ptr], #1
 57	.endm
 58
 
 
 
 
 
 
 
 
 59	.macro str1w ptr reg abort
 60	strusr	\reg, \ptr, 4, abort=\abort
 61	.endm
 62
 63	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 64	str1w \ptr, \reg1, \abort
 65	str1w \ptr, \reg2, \abort
 66	str1w \ptr, \reg3, \abort
 67	str1w \ptr, \reg4, \abort
 68	str1w \ptr, \reg5, \abort
 69	str1w \ptr, \reg6, \abort
 70	str1w \ptr, \reg7, \abort
 71	str1w \ptr, \reg8, \abort
 72	.endm
 73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 74	.macro str1b ptr reg cond=al abort
 75	strusr	\reg, \ptr, 1, \cond, abort=\abort
 76	.endm
 77
 78	.macro enter reg1 reg2
 79	mov	r3, #0
 80	stmdb	sp!, {r0, r2, r3, \reg1, \reg2}
 
 81	.endm
 82
 83	.macro exit reg1 reg2
 84	add	sp, sp, #8
 85	ldmfd	sp!, {r0, \reg1, \reg2}
 86	.endm
 87
 88	.text
 89
 90ENTRY(__copy_to_user_std)
 91WEAK(__copy_to_user)
 
 
 
 
 92
 93#include "copy_template.S"
 94
 95ENDPROC(__copy_to_user)
 96ENDPROC(__copy_to_user_std)
 97
 98	.pushsection .fixup,"ax"
 99	.align 0
100	copy_abort_preamble
101	ldmfd	sp!, {r1, r2, r3}
102	sub	r0, r0, r1
103	rsb	r0, r0, r2
104	copy_abort_end
105	.popsection
106