uaccess.s

来自「底层驱动开发」· S 代码 · 共 698 行 · 第 1/2 页

S
698
字号
USER(		ldrgtbt	r3, [r1], #1)			@ May fault		strgtb	r3, [r0], #1		sub	r2, r2, ip		b	.cfu_dest_alignedENTRY(__arch_copy_from_user)		stmfd	sp!, {r0, r2, r4 - r7, lr}		cmp	r2, #4		blt	.cfu_not_enough	PLD(	pld	[r1, #0]		)	PLD(	pld	[r0, #0]		)		ands	ip, r0, #3		bne	.cfu_dest_not_aligned.cfu_dest_aligned:		ands	ip, r1, #3		bne	.cfu_src_not_aligned/* * Seeing as there has to be at least 8 bytes to copy, we can * copy one word, and force a user-mode page fault... */.cfu_0fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	.cfu_0nowordsUSER(		ldrt	r3, [r1], #4)		str	r3, [r0], #4		mov	ip, r1, lsl #32 - PAGE_SHIFT	@ On each page, use a ld/st??t instruction		rsb	ip, ip, #0		movs	ip, ip, lsr #32 - PAGE_SHIFT		beq	.cfu_0fupi/* * ip = max no. of bytes to copy before needing another "strt" insn */		cmp	r2, ip		movlt	ip, r2		sub	r2, r2, ip		subs	ip, ip, #32		blt	.cfu_0rem8lp	PLD(	pld	[r1, #28]		)	PLD(	pld	[r0, #28]		)	PLD(	subs	ip, ip, #64			)	PLD(	blt	.cfu_0cpynopld		)	PLD(	pld	[r1, #60]		)	PLD(	pld	[r0, #60]		).cfu_0cpy8lp:	PLD(	pld	[r1, #92]		)	PLD(	pld	[r0, #92]		).cfu_0cpynopld:	ldmia	r1!, {r3 - r6}			@ Shouldnt fault		stmia	r0!, {r3 - r6}		ldmia	r1!, {r3 - r6}			@ Shouldnt fault		subs	ip, ip, #32		stmia	r0!, {r3 - r6}		bpl	.cfu_0cpy8lp	PLD(	cmn	ip, #64			)	PLD(	bge	.cfu_0cpynopld		)	PLD(	add	ip, ip, #64		).cfu_0rem8lp:	cmn	ip, #16		ldmgeia	r1!, {r3 - r6}			@ Shouldnt fault		stmgeia	r0!, {r3 - r6}		tst	ip, #8		ldmneia	r1!, {r3 - r4}			@ Shouldnt fault		stmneia	r0!, {r3 - r4}		tst	ip, #4		ldrnet	r3, [r1], #4			@ Shouldnt fault		strne	r3, [r0], #4		ands	ip, ip, #3		beq	.cfu_0fupi.cfu_0nowords:	teq	ip, #0		beq	.cfu_finished.cfu_nowords:	cmp	ip, #2USER(		ldrbt	r3, [r1], #1)			@ May fault		strb	r3, [r0], #1USER(		ldrgebt	r3, [r1], #1)			@ May fault		strgeb	r3, [r0], #1USER(		ldrgtbt	r3, [r1], #1)			@ May fault		strgtb	r3, [r0], #1		b	.cfu_finished.cfu_not_enough:		movs	ip, r2		bne	.cfu_nowords.cfu_finished:	mov	r0, #0		add	sp, sp, #8		LOADREGS(fd,sp!,{r4 - r7, pc}).cfu_src_not_aligned:		bic	r1, r1, #3USER(		ldrt	r7, [r1], #4)			@ May fault		cmp	ip, #2		bgt	.cfu_3fupi		beq	.cfu_2fupi.cfu_1fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	.cfu_1nowords		mov	r3, r7, pull #8USER(		ldrt	r7, [r1], #4)			@ May fault		orr	r3, r3, r7, push #24		str	r3, [r0], #4		mov	ip, r1, lsl #32 - PAGE_SHIFT		rsb	ip, ip, #0		movs	ip, ip, lsr #32 - PAGE_SHIFT		beq	.cfu_1fupi		cmp	r2, ip		movlt	ip, r2		sub	r2, r2, ip		subs	ip, ip, #16		blt	.cfu_1rem8lp	PLD(	pld	[r1, #12]		)	PLD(	pld	[r0, #12]		)	PLD(	subs	ip, ip, #32		)	PLD(	blt	.cfu_1cpynopld		)	PLD(	pld	[r1, #28]		)	PLD(	pld	[r0, #28]		).cfu_1cpy8lp:	PLD(	pld	[r1, #44]		)	PLD(	pld	[r0, #44]		).cfu_1cpynopld:	mov	r3, r7, pull #8		ldmia	r1!, {r4 - r7}			@ Shouldnt fault		subs	ip, ip, #16		orr	r3, r3, r4, push #24		mov	r4, r4, pull #8		orr	r4, r4, r5, push #24		mov	r5, r5, pull #8		orr	r5, r5, r6, push #24		mov	r6, r6, pull #8		orr	r6, r6, r7, push #24		stmia	r0!, {r3 - r6}		bpl	.cfu_1cpy8lp	PLD(	cmn	ip, #32			)	PLD(	bge	.cfu_1cpynopld		)	PLD(	add	ip, ip, #32		).cfu_1rem8lp:	tst	ip, #8		movne	r3, r7, pull #8		ldmneia	r1!, {r4, r7}			@ Shouldnt fault		orrne	r3, r3, r4, push #24		movne	r4, r4, pull #8		orrne	r4, r4, r7, push #24		stmneia	r0!, {r3 - r4}		tst	ip, #4		movne	r3, r7, pull #8USER(		ldrnet	r7, [r1], #4)			@ May fault		orrne	r3, r3, r7, push #24		strne	r3, [r0], #4		ands	ip, ip, #3		beq	.cfu_1fupi.cfu_1nowords:	mov	r3, r7, get_byte_1		teq	ip, #0		beq	.cfu_finished		cmp	ip, #2		strb	r3, [r0], #1		movge	r3, r7, get_byte_2		strgeb	r3, [r0], #1		movgt	r3, r7, get_byte_3		strgtb	r3, [r0], #1		b	.cfu_finished.cfu_2fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	.cfu_2nowords		mov	r3, r7, pull #16USER(		ldrt	r7, [r1], #4)			@ May fault		orr	r3, r3, r7, push #16		str	r3, [r0], #4		mov	ip, r1, lsl #32 - PAGE_SHIFT		rsb	ip, ip, #0		movs	ip, ip, lsr #32 - PAGE_SHIFT		beq	.cfu_2fupi		cmp	r2, ip		movlt	ip, r2		sub	r2, r2, ip		subs	ip, ip, #16		blt	.cfu_2rem8lp	PLD(	pld	[r1, #12]		)	PLD(	pld	[r0, #12]		)	PLD(	subs	ip, ip, #32		)	PLD(	blt	.cfu_2cpynopld		)	PLD(	pld	[r1, #28]		)	PLD(	pld	[r0, #28]		).cfu_2cpy8lp:	PLD(	pld	[r1, #44]		)	PLD(	pld	[r0, #44]		).cfu_2cpynopld:	mov	r3, r7, pull #16		ldmia	r1!, {r4 - r7}			@ Shouldnt fault		subs	ip, ip, #16		orr	r3, r3, r4, push #16		mov	r4, r4, pull #16		orr	r4, r4, r5, push #16		mov	r5, r5, pull #16		orr	r5, r5, r6, push #16		mov	r6, r6, pull #16		orr	r6, r6, r7, push #16		stmia	r0!, {r3 - r6}		bpl	.cfu_2cpy8lp	PLD(	cmn	ip, #32			)	PLD(	bge	.cfu_2cpynopld		)	PLD(	add	ip, ip, #32		).cfu_2rem8lp:	tst	ip, #8		movne	r3, r7, pull #16		ldmneia	r1!, {r4, r7}			@ Shouldnt fault		orrne	r3, r3, r4, push #16		movne	r4, r4, pull #16		orrne	r4, r4, r7, push #16		stmneia	r0!, {r3 - r4}		tst	ip, #4		movne	r3, r7, pull #16USER(		ldrnet	r7, [r1], #4)			@ May fault		orrne	r3, r3, r7, push #16		strne	r3, [r0], #4		ands	ip, ip, #3		beq	.cfu_2fupi.cfu_2nowords:	mov	r3, r7, get_byte_2		teq	ip, #0		beq	.cfu_finished		cmp	ip, #2		strb	r3, [r0], #1		movge	r3, r7, get_byte_3		strgeb	r3, [r0], #1USER(		ldrgtbt	r3, [r1], #0)			@ May fault		strgtb	r3, [r0], #1		b	.cfu_finished.cfu_3fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	.cfu_3nowords		mov	r3, r7, pull #24USER(		ldrt	r7, [r1], #4)			@ May fault		orr	r3, r3, r7, push #8		str	r3, [r0], #4		mov	ip, r1, lsl #32 - PAGE_SHIFT		rsb	ip, ip, #0		movs	ip, ip, lsr #32 - PAGE_SHIFT		beq	.cfu_3fupi		cmp	r2, ip		movlt	ip, r2		sub	r2, r2, ip		subs	ip, ip, #16		blt	.cfu_3rem8lp	PLD(	pld	[r1, #12]		)	PLD(	pld	[r0, #12]		)	PLD(	subs	ip, ip, #32		)	PLD(	blt	.cfu_3cpynopld		)	PLD(	pld	[r1, #28]		)	PLD(	pld	[r0, #28]		).cfu_3cpy8lp:	PLD(	pld	[r1, #44]		)	PLD(	pld	[r0, #44]		).cfu_3cpynopld:	mov	r3, r7, pull #24		ldmia	r1!, {r4 - r7}			@ Shouldnt fault		orr	r3, r3, r4, push #8		mov	r4, r4, pull #24		orr	r4, r4, r5, push #8		mov	r5, r5, pull #24		orr	r5, r5, r6, push #8		mov	r6, r6, pull #24		orr	r6, r6, r7, push #8		stmia	r0!, {r3 - r6}		subs	ip, ip, #16		bpl	.cfu_3cpy8lp	PLD(	cmn	ip, #32			)	PLD(	bge	.cfu_3cpynopld		)	PLD(	add	ip, ip, #32		).cfu_3rem8lp:	tst	ip, #8		movne	r3, r7, pull #24		ldmneia	r1!, {r4, r7}			@ Shouldnt fault		orrne	r3, r3, r4, push #8		movne	r4, r4, pull #24		orrne	r4, r4, r7, push #8		stmneia	r0!, {r3 - r4}		tst	ip, #4		movne	r3, r7, pull #24USER(		ldrnet	r7, [r1], #4)			@ May fault		orrne	r3, r3, r7, push #8		strne	r3, [r0], #4		ands	ip, ip, #3		beq	.cfu_3fupi.cfu_3nowords:	mov	r3, r7, get_byte_3		teq	ip, #0		beq	.cfu_finished		cmp	ip, #2		strb	r3, [r0], #1USER(		ldrgebt	r3, [r1], #1)			@ May fault		strgeb	r3, [r0], #1USER(		ldrgtbt	r3, [r1], #1)			@ May fault		strgtb	r3, [r0], #1		b	.cfu_finished		.section .fixup,"ax"		.align	0		/*		 * We took an exception.  r0 contains a pointer to		 * the byte not copied.		 */9001:		ldr	r2, [sp], #4			@ void *to		sub	r2, r0, r2			@ bytes copied		ldr	r1, [sp], #4			@ unsigned long count		subs	r4, r1, r2			@ bytes left to copy		movne	r1, r4		blne	__memzero		mov	r0, r4		LOADREGS(fd,sp!, {r4 - r7, pc})		.previous/* Prototype: int __arch_clear_user(void *addr, size_t sz) * Purpose  : clear some user memory * Params   : addr - user memory address to clear *          : sz   - number of bytes to clear * Returns  : number of bytes NOT cleared */ENTRY(__arch_clear_user)		stmfd	sp!, {r1, lr}		mov	r2, #0		cmp	r1, #4		blt	2f		ands	ip, r0, #3		beq	1f		cmp	ip, #2USER(		strbt	r2, [r0], #1)USER(		strlebt	r2, [r0], #1)USER(		strltbt	r2, [r0], #1)		rsb	ip, ip, #4		sub	r1, r1, ip		@  7  6  5  4  3  2  11:		subs	r1, r1, #8		@ -1 -2 -3 -4 -5 -6 -7USER(		strplt	r2, [r0], #4)USER(		strplt	r2, [r0], #4)		bpl	1b		adds	r1, r1, #4		@  3  2  1  0 -1 -2 -3USER(		strplt	r2, [r0], #4)2:		tst	r1, #2			@ 1x 1x 0x 0x 1x 1x 0xUSER(		strnebt	r2, [r0], #1)USER(		strnebt	r2, [r0], #1)		tst	r1, #1			@ x1 x0 x1 x0 x1 x0 x1USER(		strnebt	r2, [r0], #1)		mov	r0, #0		LOADREGS(fd,sp!, {r1, pc})		.section .fixup,"ax"		.align	09001:		LOADREGS(fd,sp!, {r0, pc})		.previous

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?