⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 segment.s

📁 arm平台上的uclinux系统全部源代码
💻 S
字号:
/* * linux/arch/arm/lib/segment.S * * Copyright (C) 1995, 1996 Russell King * Except memcpy/memmove routine. */#include <asm/assembler.h>		.text#define ENTER	\		MOV	ip,sp	;\		STMFD	sp!,{r4-r9,fp,ip,lr,pc}	;\		SUB	fp,ip,#4#define EXIT	\		LOADREGS(ea, fp, {r4 - r9, fp, sp, pc})#define EXITEQ	\		LOADREGS(eqea, fp, {r4 - r9, fp, sp, pc})# Prototype: void memcpy_tofs(void *to,const void *from,unsigned long n);Lmtfs_dest_not_aligned:		rsb	ip, ip, #4		cmp	ip, #2		ldrb	r3, [r1], #1		strbt	r3, [r0], #1		ldrgeb	r3, [r1], #1		strgebt	r3, [r0], #1		ldrgtb	r3, [r1], #1		strgtbt	r3, [r0], #1		sub	r2, r2, ip		b	Lmtfs_dest_aligned		.global	___memcpy_tofs,__memcpy_tofs__memcpy_tofs:___memcpy_tofs:		cmp	r0, #0x02000000			@ PHYS check		bge	_memcpy_fromfs		stmfd	sp!, {lr}		cmp	r2, #4		blt	Lmtfs_not_enough		ands	ip, r0, #3		bne	Lmtfs_dest_not_alignedLmtfs_dest_aligned:		stmfd	sp!, {r4 - r7}		ands	ip, r1, #3		bne	Lmtfs_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... */Lmtfs_0fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	Lmtfs_0nowords		ldr	r3, [r1], #4		strt	r3, [r0], #4		mov	ip, r0, lsl #17		rsb	ip, ip, #0		movs	ip, ip, lsr #17		beq	Lmtfs_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	Lmtfs_0rem8lpLmtfs_0cpy8lp:	ldmia	r1!, {r3 - r6}		stmia	r0!, {r3 - r6}		ldmia	r1!, {r3 - r6}		stmia	r0!, {r3 - r6}		subs	ip, ip, #32		bpl	Lmtfs_0cpy8lpLmtfs_0rem8lp:	cmn	ip, #16		ldmgeia	r1!, {r3 - r6}		stmgeia	r0!, {r3 - r6}		tst	ip, #8		ldmneia	r1!, {r3 - r4}		stmneia	r0!, {r3 - r4}		tst	ip, #4		ldrne	r3, [r1], #4		strnet	r3, [r0], #4		ands	ip, ip, #3		beq	Lmtfs_0fupiLmtfs_0nowords:	ldmfd	sp!, {r4 - r7}		teq	ip, #0		LOADREGS(eqfd,sp!,{pc})Lmtfs_nowords:	cmp	ip, #2		ldrb	r3, [r1], #1		strbt	r3, [r0], #1		ldrgeb	r3, [r1], #1		strgebt	r3, [r0], #1		ldrgtb	r3, [r1], #1		strgtbt	r3, [r0], #1		LOADREGS(fd,sp!,{pc})Lmtfs_not_enough:		movs	ip, r2		bne	Lmtfs_nowords		LOADREGS(fd,sp!,{pc})Lmtfs_src_not_aligned:		bic	r1, r1, #3		ldr	r7, [r1], #4		cmp	ip, #2		bgt	Lmtfs_3fupi		beq	Lmtfs_2fupiLmtfs_1fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	Lmtfs_1nowords		mov	r3, r7, lsr #8		ldr	r7, [r1], #4		orr	r3, r3, r7, lsl #24		strt	r3, [r0], #4		mov	ip, r0, lsl #17		rsb	ip, ip, #0		movs	ip, ip, lsr #17		beq	Lmtfs_1fupi		cmp	r2, ip		movlt	ip, r2		sub	r2, r2, ip		subs	ip, ip, #16		blt	Lmtfs_1rem8lpLmtfs_1cpy8lp:	mov	r3, r7, lsr #8		ldmia	r1!, {r4 - r7}		orr	r3, r3, r4, lsl #24		mov	r4, r4, lsr #8		orr	r4, r4, r5, lsl #24		mov	r5, r5, lsr #8		orr	r5, r5, r6, lsl #24		mov	r6, r6, lsr #8		orr	r6, r6, r7, lsl #24		stmia	r0!, {r3 - r6}		subs	ip, ip, #16		bpl	Lmtfs_1cpy8lpLmtfs_1rem8lp:	tst	ip, #8		movne	r3, r7, lsr #8		ldmneia	r1!, {r4, r7}		orrne	r3, r3, r4, lsl #24		movne	r4, r4, lsr #8		orrne	r4, r4, r7, lsl #24		stmneia	r0!, {r3 - r4}		tst	ip, #4		movne	r3, r7, lsr #8		ldrne	r7, [r1], #4		orrne	r3, r3, r7, lsl #24		strnet	r3, [r0], #4		ands	ip, ip, #3		beq	Lmtfs_1fupiLmtfs_1nowords:	teq	ip, #0		LOADREGS(eqfd,sp!,{r4 - r7, pc})		mov	r3, r7, lsr #8		cmp	ip, #2		strbt	r3, [r0], #1		movge	r3, r3, lsr #8		strgebt	r3, [r0], #1		movgt	r3, r3, lsr #8		strgtbt	r3, [r0], #1		LOADREGS(fd,sp!, {r4 - r7, pc})Lmtfs_2fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	Lmtfs_2nowords		mov	r3, r7, lsr #16		ldr	r7, [r1], #4		orr	r3, r3, r7, lsl #16		strt	r3, [r0], #4		mov	ip, r0, lsl #17		rsb	ip, ip, #0		movs	ip, ip, lsr #17		beq	Lmtfs_2fupi		cmp	r2, ip		movlt	ip, r2		sub	r2, r2, ip		subs	ip, ip, #16		blt	Lmtfs_2rem8lpLmtfs_2cpy8lp:	mov	r3, r7, lsr #16		ldmia	r1!, {r4 - r7}		orr	r3, r3, r4, lsl #16		mov	r4, r4, lsr #16		orr	r4, r4, r5, lsl #16		mov	r5, r5, lsr #16		orr	r5, r5, r6, lsl #16		mov	r6, r6, lsr #16		orr	r6, r6, r7, lsl #16		stmia	r0!, {r3 - r6}		subs	ip, ip, #16		bpl	Lmtfs_2cpy8lpLmtfs_2rem8lp:	tst	ip, #8		movne	r3, r7, lsr #16		ldmneia	r1!, {r4, r7}		orrne	r3, r3, r4, lsl #16		movne	r4, r4, lsr #16		orrne	r4, r4, r7, lsl #16		stmneia	r0!, {r3 - r4}		tst	ip, #4		movne	r3, r7, lsr #16		ldrne	r7, [r1], #4		orrne	r3, r3, r7, lsl #16		strnet	r3, [r0], #4		ands	ip, ip, #3		beq	Lmtfs_2fupiLmtfs_2nowords:	teq	ip, #0		LOADREGS(eqfd,sp!,{r4 - r7, pc})		mov	r3, r7, lsr #16		cmp	ip, #2		strbt	r3, [r0], #1		movge	r3, r3, lsr #8		strgebt	r3, [r0], #1		ldrgtb	r3, [r1], #0		strgtbt	r3, [r0], #1		LOADREGS(fd,sp!,{r4 - r7, pc})Lmtfs_3fupi:	subs	r2, r2, #4		addmi	ip, r2, #4		bmi	Lmtfs_3nowords		mov	r3, r7, lsr #24		ldr	r7, [r1], #4		orr	r3, r3, r7, lsl #8		strt	r3, [r0], #4		mov	ip, r0, lsl #17		rsb	ip, ip, #0		movs	ip, ip, lsr #17		beq	Lmtfs_3fupi		cmp	r2, ip		movlt	ip, r2		sub	r2, r2, ip		subs	ip, ip, #16		blt	Lmtfs_3rem8lpLmtfs_3cpy8lp:	mov	r3, r7, lsr #24		ldmia	r1!, {r4 - r7}		orr	r3, r3, r4, lsl #8		mov	r4, r4, lsr #24		orr	r4, r4, r5, lsl #8		mov	r5, r5, lsr #24		orr	r5, r5, r6, lsl #8		mov	r6, r6, lsr #24		orr	r6, r6, r7, lsl #8		stmia	r0!, {r3 - r6}		subs	ip, ip, #16		bpl	Lmtfs_3cpy8lpLmtfs_3rem8lp:	tst	ip, #8		movne	r3, r7, lsr #24		ldmneia	r1!, {r4, r7}		orrne	r3, r3, r4, lsl #8		movne	r4, r4, lsr #24		orrne	r4, r4, r7, lsl #8		stmneia	r0!, {r3 - r4}		tst	ip, #4		movne	r3, r7, lsr #24		ldrne	r7, [r1], #4		orrne	r3, r3, r7, lsl #8		strnet	r3, [r0], #4		ands	ip, ip, #3		beq	Lmtfs_3fupiLmtfs_3nowords:	teq	ip, #0		LOADREGS(eqfd,sp!,{r4 - r7, pc})		mov	r3, r7, lsr #24		cmp	ip, #2		strbt	r3, [r0], #1		ldrge	r3, [r1], #0		strgebt	r3, [r0], #1		movgt	r3, r3, lsr #8		strgtbt	r3, [r0], #1		LOADREGS(fd,sp!, {r4 - r7, pc})# Prototype: void memcpy_fromfs(void *to,const void *from,unsigned long n);# ARM3: cant use memcopy here!!!		.global	_memcpy,memcpy		.global	_memmove,memmove		.global	_memcpy_fromfs,memcpy_fromfs_memcpy:_memmove:_memcpy_fromfs:memcpy:memmove:memcpy_fromfs:		ENTER		cmp	r1, r0		bcc	Lother_copy		subs	r2, r2, #4		blt	Lup_no_double_words		ands	ip, r0, #3		bne	Lup_dest_not_aligned		ands	ip, r1, #3		bne	Lup_src_not_alignedLup_rest:	subs	r2, r2, #8		blt	Lup_cpy_2_lp		subs	r2, r2, #0x14		blt	Lup_not_long_copyLup_cpy_8_lp:	ldmia	r1!,{r3 - r9, ip}		stmia	r0!,{r3 - r9, ip}		subs	r2, r2, #32		bge	Lup_cpy_8_lp		cmn	r2, #16		ldmgeia	r1!, {r3 - r6}		stmgeia	r0!, {r3 - r6}		subge	r2, r2, #0x10Lup_not_long_copy:		adds	r2, r2, #0x14Lup_cpy_3_lp:	ldmgeia	r1!, {r3 - r5}		stmgeia	r0!, {r3 - r5}		subges	r2, r2, #12		bge	Lup_cpy_3_lpLup_cpy_2_lp:	adds	r2, r2, #8		blt	Lup_no_double_words		subs	r2, r2, #4		ldrlt	r3, [r1], #4		strlt	r3, [r0], #4		ldmgeia	r1!, {r3, r4}		stmgeia	r0!, {r3, r4}		subge	r2, r2, #4Lup_no_double_words:		adds	r2, r2, #4		EXITEQ		cmp	r2, #2		ldrb	r3, [r1], #1		strb	r3, [r0], #1		ldrgeb	r3, [r1], #1		strgeb	r3, [r0], #1		ldrgtb	r3, [r1], #1		strgtb	r3, [r0], #1		EXITLup_dest_not_aligned:		rsb	ip, ip, #4		cmp	ip, #2		ldrb	r3, [r1], #1		strb	r3, [r0], #1		ldrgeb	r3, [r1], #1		strgeb	r3, [r0], #1		ldrgtb	r3, [r1], #1		strgtb	r3, [r0], #1		subs	r2, r2, ip		blt	Lup_no_double_words		ands	ip, r1, #3		beq	Lup_restLup_src_not_aligned:		bic	r1, r1, #3		ldr	r7, [r1], #4		cmp	ip, #2		bgt	Lup_cpy_4_3		beq	Lup_cpy_4_2		cmp	r2, #12		blt	Lup_cpy_x_1_lp		sub	r2, r2, #12Lup_cpy_4_1_lp:	mov	r3, r7, lsr #8		ldmia	r1!, {r4 - r7}		orr	r3, r3, r4, lsl #24		mov	r4, r4, lsr #8		orr	r4, r4, r5, lsl #24		mov	r5, r5, lsr #8		orr	r5, r5, r6, lsl #24		mov	r6, r6, lsr #8		orr	r6, r6, r7, lsl #24		stmia	r0!, {r3 - r6}		subs	r2, r2, #16		bge	Lup_cpy_4_1_lp		adds	r2, r2, #12		blt	Lup_rest1Lup_cpy_x_1_lp:	mov	r3, r7, lsr #8		ldr	r7, [r1], #4		orr	r3, r3, r7, lsl #24		str	r3, [r0], #4		subs	r2, r2, #4		bge	Lup_cpy_x_1_lpLup_rest1:	sub	r1, r1, #3		b	Lup_no_double_wordsLup_cpy_4_2:	cmp	r2, #12		blt	Lup_cpy_x_2_lp		sub	r2, r2, #12Lup_cpy_4_2_lp:	mov	r3, r7, lsr #16		ldmia	r1!, {r4 - r7}		orr	r3, r3, r4, lsl #16		mov	r4, r4, lsr #16		orr	r4, r4, r5, lsl #16		mov	r5, r5, lsr #16		orr	r5, r5, r6, lsl #16		mov	r6, r6, lsr #16		orr	r6, r6, r7,LSL#16		stmia	r0!, {r3 - r6}		subs	r2, r2, #16		bge	Lup_cpy_4_2_lp		adds	r2, r2, #12		blt	Lup_rest2Lup_cpy_x_2_lp:	mov	r3, r7, lsr #16		ldr	r7, [r1], #4		orr	r3, r3, r7, lsl #16		str	r3, [r0], #4		subs	r2, r2, #4		bge	Lup_cpy_x_2_lpLup_rest2:	sub	r1, r1, #2		b	Lup_no_double_wordsLup_cpy_4_3:	cmp	r2, #12		blt	Lup_cpy_x_3_lp		sub	r2, r2, #12Lup_cpy_4_3_lp:	mov	r3, r7, lsr #24		ldmia	r1!,{r4 - r7}		orr	r3, r3, r4, lsl #8		mov	r4, r4, lsr #24		orr	r4, r4, r5, lsl #8		mov	r5, r5, lsr #24		orr	r5, r5, r6, lsl #8		mov	r6, r6, lsr #24		orr	r6, r6, r7, lsl #8		stmia	r0!, {r3 - r6}		subs	r2, r2, #16		bge	Lup_cpy_4_3_lp		adds	r2, r2, #12		blt	Lup_rest3Lup_cpy_x_3_lp:	mov	r3, r7, lsr #24		ldr	r7, [r1], #4		orr	r3, r3, r7, lsl#8		str	r3, [r0], #4		subs	r2, r2, #4		bge	Lup_cpy_x_3_lpLup_rest3:	sub	r1, r1, #1		b	Lup_no_double_wordsLother_copy:	add	r1, r1, r2		add	r0, r0, r2		subs	r2, r2, #4		blt	Ldown_no_double_words		ands	ip, r0, #3		bne	Ldown_dest_not_aligned		ands	ip, r1, #3		bne	Ldown_src_not_alignedLdown_rest:		subs	r2, r2, #8		blt	Ldown_cpy_2_lp		subs	r2, r2, #0x14		blt	Ldown_not_long_copyLdown_cpy_8_lp:		ldmdb	r1!, {r3 - r9, ip}		stmdb	r0!, {r3 - r9, ip}		subs	r2, r2, #32		bge	Ldown_cpy_8_lpLdown_not_long_copy:		cmn	r2, #16		ldmgedb	r1!, {r3 - r6}		stmgedb	r0!, {r3 - r6}		subge	r2, r2, #16		adds	r2, r2, #20		ldmgedb	r1!, {r3 - r5}		stmgedb	r0!, {r3 - r5}		subge	r2, r2, #12Ldown_cpy_2_lp:		adds	r2, r2, #8		blt	Ldown_no_double_words		subs	r2, r2, #4		ldrlt	r3, [r1, #-4]!		strlt	r3, [r0, #-4]!		ldmgedb	r1!, {r3, r4}		stmgedb	r0!, {r3, r4}		subge	r2, r2, #4Ldown_no_double_words:		adds	r2, r2, #4		EXITEQ		cmp	r2, #2		ldrb	r3, [r1, #-1]!		strb	r3, [r0, #-1]!		ldrgeb	r3, [r1, #-1]!		strgeb	r3, [r0, #-1]!		ldrgtb	r3, [r1, #-1]!		strgtb	r3, [r0, #-1]!		EXITLdown_dest_not_aligned:		CMP	ip,#2		LDRB	r3,[r1,#-1]!		STRB	r3,[r0,#-1]!		LDRGEB	r3,[r1,#-1]!		STRGEB	r3,[r0,#-1]!		LDRGTB	r3,[r1,#-1]!		STRGTB	r3,[r0,#-1]!		SUBS	r2,r2,ip		BLT	Ldown_no_double_words		ANDS	ip,r1,#3		BEQ	Ldown_restLdown_src_not_aligned:		BIC	r1,r1,#3		LDR	r3,[r1],#0		CMP	ip,#2		BLT	Ldown_cpy_4_3		BEQ	Ldown_cpy_4_2		CMP	r2,#12		BLT	Ldown_cpy_x_1_lp		SUB	r2,r2,#12Ldown_cpy_4_1_lp:		MOV	r7,r3,LSL#8		LDMDB	r1!,{r3,r4,r5,r6}		ORR	r7,r7,r6,LSR#24		MOV	r6,r6,LSL#8		ORR	r6,r6,r5,LSR#24		MOV	r5,r5,LSL#8		ORR	r5,r5,r4,LSR#24		MOV	r4,r4,LSL#8		ORR	r4,r4,r3,LSR#24		STMDB	r0!,{r4,r5,r6,r7}		SUBS	r2,r2,#16		BGE	Ldown_cpy_4_1_lp		ADDS	r2,r2,#12		BLT	Ldown_rest1Ldown_cpy_x_1_lp:		MOV	ip,r3,LSL#8		LDR	r3,[r1,#-4]!		ORR	ip,ip,r3,LSR#24		STR	ip,[r0,#-4]!		SUBS	r2,r2,#4		BGE	Ldown_cpy_x_1_lpLdown_rest1:		ADD	r1,r1,#3		B	Ldown_no_double_wordsLdown_cpy_4_2:		CMP	r2,#12		BLT	Ldown_cpy_x_2_lp		SUB	r2,r2,#12Ldown_cpy_4_2_lp:		MOV	r7,r3,LSL#16		LDMDB	r1!,{r3,r4,r5,r6}		ORR	r7,r7,r6,LSR#16		MOV	r6,r6,LSL#16		ORR	r6,r6,r5,LSR#16		MOV	r5,r5,LSL#16		ORR	r5,r5,r4,LSR#16		MOV	r4,r4,LSL#16		ORR	r4,r4,r3,LSR#16		STMDB	r0!,{r4,r5,r6,r7}		SUBS	r2,r2,#16		BGE	Ldown_cpy_4_2_lp		ADDS	r2,r2,#12		BLT	Ldown_rest2Ldown_cpy_x_2_lp:		MOV	ip,r3,LSL#16		LDR	r3,[r1,#-4]!		ORR	ip,ip,r3,LSR#16		STR	ip,[r0,#-4]!		SUBS	r2,r2,#4		BGE	Ldown_cpy_x_2_lpLdown_rest2:		ADD	r1,r1,#2		B	Ldown_no_double_wordsLdown_cpy_4_3:		CMP	r2,#12		BLT	Ldown_cpy_x_3_lp		SUB	r2,r2,#12Ldown_cpy_4_3_lp:		MOV	r7,r3,LSL#24		LDMDB	r1!,{r3,r4,r5,r6}		ORR	r7,r7,r6,LSR#8		MOV	r6,r6,LSL#24		ORR	r6,r6,r5,LSR#8		MOV	r5,r5,LSL#24		ORR	r5,r5,r4,LSR#8		MOV	r4,r4,LSL#24		ORR	r4,r4,r3,LSR#8		STMDB	r0!,{r4,r5,r6,r7}		SUBS	r2,r2,#16		BGE	Ldown_cpy_4_3_lp		ADDS	r2,r2,#12		BLT	Ldown_rest3Ldown_cpy_x_3_lp:		MOV	ip,r3,LSL#24		LDR	r3,[r1,#-4]!		ORR	ip,ip,r3,LSR#8		STR	ip,[r0,#-4]!		SUBS	r2,r2,#4		BGE	Ldown_cpy_x_3_lpLdown_rest3:		ADD	r1,r1,#1		B	Ldown_no_double_words		.align

⌨️ 快捷键说明

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