Linux Audio

Check our new training course

Loading...
v3.5.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
 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
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