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

📄 head-armv.s

📁 arm平台上的uclinux系统全部源代码
💻 S
字号:
/* * linux/arch/arm/kernel/head32.S * * Copyright (C) 1994, 1995, 1996, 1997 Russell King * * Kernel 32 bit startup code for ARM6 / ARM7 / StrongARM */#include <linux/config.h>		.text		.align		.globl	_swapper_pg_dir		.equ	_swapper_pg_dir,	0xc0004000		.globl	__entry		.globl	__stext/* * Entry point and restart point.  Entry *must* be called with r0 == 0, * MMU off. * *  r1 = 0 -> ebsa  (Ram @ 0x00000000) *  r1 = 1 -> RPC   (Ram @ 0x10000000) *  r1 = 2 -> ebsit (???) */__stext:__entry:		teq	r0, #0					@ check for illegal entry...		bne	Lerror					@ loop indefinitely		cmp	r1, #2					@ Unknown machine architecture		bge	Lerror@@ First thing to do is to get the page tables set up so that we can call the kernel@ in the correct place.  This is relocatable code...@		mrc	p15, 0, r9, c0, c0			@ get Processor ID@@ Read processor ID register (CP#15, CR0).@ NOTE: ARM2 & ARM250 cause an undefined instruction exception...@ Values are:@		XX01XXXX = ARMv4 architecture (StrongARM)@		XX00XXXX = ARMv3 architecture@		4156061X = ARM 610@ 		4156030X = ARM 3@		4156025X = ARM 250@		4156020X = ARM 2@		adr	r10, LCProcTypes1:		ldmia	r10!, {r5, r6, r8}			@ Get Set, Mask, MMU Flags		teq	r5, #0					@ End of list?		beq	Lerror		eor	r5, r5, r9		tst	r5, r6		addne	r10, r10, #8		bne	1b		adr	r4, LCMachTypes		add	r4, r4, r1, lsl #4		ldmia	r4, {r4, r5, r6}			@ r4 = page dir in physical ram		mov	r0, r4		mov	r1, #0		add	r2, r0, #0x40001:		str	r1, [r0], #4				@ Clear page table		teq	r0, r2		bne	1b@@ Add enough entries to allow the kernel to be called.@ It will sort out the real mapping in paging_init@		add	r0, r4, #0x3000		mov	r1, #0x0000000c				@ SECT_CACHEABLE | SECT_BUFFERABLE		orr	r1, r1, r8		add	r1, r1, r5		str	r1, [r0], #4		add	r1, r1, #1 << 20		str	r1, [r0], #4		add	r1, r1, #1 << 20@@ Map in IO space@		add	r0, r4, #0x3800		orr	r1, r6, r8		add	r2, r0, #0x08001:		str	r1, [r0], #4		add	r1, r1, #1 << 20		teq	r0, r2		bne	1b@@ Map in screen at 0x02000000 & SCREEN2_BASE@		teq	r5, #0		addne	r0, r4, #0x80				@ 02000000		movne	r1, #0x02000000		orrne	r1, r1, r8		strne	r1, [r0]		addne	r0, r4, #0x3600				@ d8000000		strne	r1, [r0]@@ The following should work on both v3 and v4 implementations@		mov	lr, pc		mov	pc, r10					@ Call processor flush (returns ctrl reg)		adr	r5, __entry		sub	r10, r10, r5				@ Make r10 PIC		ldr	lr, Lbranch		mcr	p15, 0, r0, c1, c0			@ Enable MMU & caches.  In 3 instructions								@ we loose this page!		mov	pc, lrLerror:		mov	r0, #0x02000000		mov	r1, #0x11		orr	r1, r1, r1, lsl #8		orr	r1, r1, r1, lsl #16		str	r1, [r0], #4		str	r1, [r0], #4		str	r1, [r0], #4		str	r1, [r0], #4		b	LerrorLbranch:	.long	Lalready_done_mmap			@ Real address of routine		@ EBSA (pg dir phys, phys ram start, phys i/o)LCMachTypes:	.long	_swapper_pg_dir - 0xc0000000		@ Address of page tables (physical)		.long	0					@ Address of RAM		.long	0xe0000000				@ I/O address		.long	0		@ RPC		.long	_swapper_pg_dir - 0xc0000000 + 0x10000000		.long	0x10000000		.long	0x03000000		.long	0		@ EBSIT ???		.long	_swapper_pg_dir - 0xc0000000		.long	0		.long	0xe0000000		.long	0LCProcTypes:	@ ARM6 / 610		.long	0x41560600		.long	0xffffff00		.long	0x00000c12		b	Larmv3_flush_early			@ arm v3 flush & ctrl early setup		mov	pc, lr		@ ARM7		.long	0x41007000		.long	0xfffff000		.long	0x00000c12		b	Larmv3_flush_late			@ arm v3 flush & ctrl late setup		mov	pc, lr		@ ARM710		.long	0x41007000		.long	0xfff8f000				@ ARM710 does not follow spec		.long	0x00000c12		b	Larmv3_flush_late			@ arm v3 flush & ctrl late setup		mov	pc, lr		@ StrongARM		.long	0x4401a100		.long	0xfffffff0		.long	0x00000c02		b	Larmv4_flush_early		b	Lsa_fastclock		.long	0LC0:		.long	_edata		.long	_arm_id		.long	_end		.long	_init_user_stack + 4096		.alignLarmv3_flush_early:		mov	r0, #0		mcr	p15, 0, r0, c7, c0			@ flush caches on v3		mcr	p15, 0, r0, c5, c0			@ flush TLBs on v3		mcr	p15, 0, r4, c2, c0			@ load page table pointer		mov	r0, #5					@ Domains 0, 1 = client		mcr	p15, 0, r0, c3, c0			@ load domain access register		mov	r0, #0x3d				@ ....DPWCAM		mov	pc, lrLarmv3_flush_late:		mov	r0, #0		mcr	p15, 0, r0, c7, c0			@ flush caches on v3		mcr	p15, 0, r0, c5, c0			@ flush TLBs on v3		mcr	p15, 0, r4, c2, c0			@ load page table pointer		mov	r0, #5					@ Domains 0, 1 = client		mcr	p15, 0, r0, c3, c0			@ load domain access register		mov	r0, #0x7d				@ ...LDPWCAM		mov	pc, lrLarmv4_flush_early:		mov	r0, #0		mcr	p15, 0, r0, c7, c7			@ flush I,D caches on v4		mcr	p15, 0, r0, c7, c10, 4			@ drain write buffer on v4		mcr	p15, 0, r0, c8, c7			@ flush I,D TLBs on v4		mcr	p15, 0, r4, c2, c0			@ load page table pointer		mov	r0, #5					@ Domains 0, 1 = client		mcr	p15, 0, r0, c3, c0			@ load domain access register		mrc	p15, 0, r0, c1, c0			@ get control register v4		orr	r0, r0, #0x3d				@ I......DPWCAM		orr	r0, r0, #1 << 12			@ v4 supports separate I cache		mov	pc, lrLsa_fastclock:	mcr	p15, 0, r4, c15, c1, 2			@ Enable clock switching		mov	pc, lrLalready_done_mmap:		adr	r5, __entry				@ Add base back in		add	r10, r10, r5		adr	r5, LC0		ldmia	r5, {r5, r6, r8, sp}			@ Setup stack		mov	r4, #01:		cmp	r5, r8					@ Clear BSS		strcc	r4, [r5],#4		bcc	1b		str	r9, [r6]				@ Save processor ID		mov	lr, pc		add	pc, r10, #4				@ Call post-processor init		mov	fp, #0		b	_start_kernel#if 1/* * Useful debugging routines */		.globl	_printhex8_printhex8:	mov	r1, #8		b	printhex		.globl	_printhex4_printhex4:	mov	r1, #4		b	printhex		.globl	_printhex2_printhex2:	mov	r1, #2printhex:	ldr	r2, =hexbuf		add	r3, r2, r1		mov	r1, #0		strb	r1, [r3]1:		and	r1, r0, #15		mov	r0, r0, lsr #4		cmp	r1, #10		addlt	r1, r1, #'0'		addge	r1, r1, #'a' - 10		strb	r1, [r3, #-1]!		teq	r3, r2		bne	1b		mov	r0, r2		.globl	_printascii_printascii:#ifdef CONFIG_ARCH_RPC		mov	r3, #0xe0000000		orr	r3, r3, #0x00010000		orr	r3, r3, #0x00000fe0#else		mov	r3, #0xf0000000		orr	r3, r3, #0x0be0#endif		b	3f1:		ldrb	r2, [r3, #0x18]		tst	r2, #0x10		beq	1b		strb	r1, [r3]2:		ldrb	r2, [r3, #0x14]		and	r2, r2, #0x60		teq	r2, #0x60		bne	2b		teq	r1, #'\n'		moveq	r1, #'\r'		beq	1b3:		teq	r0, #0		ldrneb	r1, [r0], #1		teqne	r1, #0		bne	1b		mov	pc, lr		.globl	_printch_printch:#ifdef CONFIG_ARCH_RPC		mov	r3, #0xe0000000		orr	r3, r3, #0x00010000		orr	r3, r3, #0x00000fe0#else		mov	r3, #0xf0000000		orr	r3, r3, #0x0be0#endif		mov	r1, r0		mov	r0, #0		b	1b		.bsshexbuf:		.space 16#endif

⌨️ 快捷键说明

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