首页 > 编程语言 >A15 汇编启动阶段-BSP

A15 汇编启动阶段-BSP

时间:2024-06-24 09:53:54浏览次数:12  
标签:A15 汇编 r0 setup BSP vector mode c0 p15

	MSR     CPSR_c, #Mode_SVC | I_Bit | F_Bit		// SVC mode
	
	// setup vector mode
	/*BIT[13]:
	0 :选择低端异常中断向量 0x0~0x1c 
	1 :选择高端异常中断向量0xffff0000~ 0xffff001c*/
	MRC		p15, 0, r0, c1, c0, 0		// Read Control Register
	BIC		r0, r0, #(1 << 13)			// use 0x00000000 address vectorַַ
	MCR		p15, 0, r0, c1, c0, 0		// Write Control Register

	// setup vector base
	LDR    r0, =Vectors
	MCR    p15, 0, r0, c12, c0, 0		// Write Secure or Non-secure Vector Base Address
	
	/*
	 * Invalidate L1 I/D
	 */
	mov	r0, #0			@ set up for MCR
	/* BY BSP : uboot do these in v7_inval_tlb
	MCR     p15, 0, r0, c8, c5, 0    	// ITLBIALL - Invalidate entire Instruction TLB
	MCR     p15, 0, r0, c8, c6, 0    	// DTLBIALL - Invalidate entire Data TLB
	*/
	mcr	p15, 0, r0, c8, c7, 0	@ invalidate TLBs
	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
	mcr	p15, 0, r0, c7, c5, 6	@ invalidate BP array
	mcr     p15, 0, r0, c7, c10, 4	@ DSB
	mcr     p15, 0, r0, c7, c5, 4	@ ISB

	/*
	 * disable MMU stuff and caches
	 */
	 //BSP only set bit:0 1 2 11 12 to zero
	mrc	p15, 0, r0, c1, c0, 0
	bic	r0, r0, #0x00002000	@ clear bits 13 (--V-)
	bic	r0, r0, #0x00000007	@ clear bits 2:0 (-CAM)
	orr	r0, r0, #0x00000002	@ set bit 1 (--A-) Align
	orr	r0, r0, #0x00000800	@ set bit 11 (Z---) BTB
#if CONFIG_IS_ENABLED(SYS_ICACHE_OFF)
	bic	r0, r0, #0x00001000	@ clear bit 12 (I) I-cache
#else
	orr	r0, r0, #0x00001000	@ set bit 12 (I) I-cache
#endif
	mcr	p15, 0, r0, c1, c0, 0
	
	//-------------------------above uboot,below bsp-------------------------
	
	// enable multicore coherent notice //enable_smp
	MRC		p15, 0, r0, c1, c0, 1		// Read ACTLR
	MOV		r1, r0
	ORR		r0, r0, #0x040				// Set bit 6
	CMP		r0, r1
	MCRNE	p15, 0, r0, c1, c0, 1		// Write ACTLR
	ISB
	/*TM: ACTLR
	MRC p15, 0, r0, c1, c0, 1
	orr r0,r0,#0x40
	MCR p15, 0, r0, c1, c0, 1
	
	UBOOT:
	ENTRY(psci_disable_smp)
	mrc	p15, 0, r0, c1, c0, 1		@ ACTLR
	bic	r0, r0, #(1 << 6)		@ Clear SMP bit
	mcr	p15, 0, r0, c1, c0, 1		@ ACTLR
	isb
	dsb
	bx	lr
	ENDPROC(psci_disable_smp)
	.weak psci_disable_smp

	ENTRY(psci_enable_smp)
	mrc	p15, 0, r0, c1, c0, 1		@ ACTLR
	orr	r0, r0, #(1 << 6)		@ Set SMP bit
	mcr	p15, 0, r0, c1, c0, 1		@ ACTLR
	isb
	bx	lr
	ENDPROC(psci_enable_smp)
	.weak psci_enable_smp

	*/
	
 	// setup domain
	MRC     p15, 0, r0, c3, c0, 0		// Read Domain Access Control Register
	LDR     r0, =0x55555555				// Initialize every domain entry to b01 (client)
	MCR     p15, 0, r0, c3, c0, 0		// Write Domain Access Control Register
	////////////////////////////////////////////////
 	// enable vfp
	MOV		r0, #0x00F00000				// clear ASEDIS, enable cp10/cp11 access
	MCR		p15, 0, r0, c1, c0, 2		// Write Coprocessor Access Control Register (CPACR)
	ISB
	MOV		r0, #0x40000000
	VMSR	FPEXC, r0					// Write FPEXC register, EN bit set
	ISB
	

//most done by OS system:
// init mmu
// enable mmu & cache
	// setup vector base
	LDR    r0, =Vectors
	MCR    p15, 0, r0, c12, c0, 0		// Write Secure or Non-secure Vector Base Address
	////////////////////////////////////////////////
 	// setup vector mode
	MRC		p15, 0, r0, c1, c0, 0		// Read Control Register
	BIC		r0, r0, #(1 << 13)			// use 0x00000000 address vectorַַ
	MCR		p15, 0, r0, c1, c0, 0		// Write Control Register
	////////////////////////////////////////////////
	// enable multicore coherent notice
	MRC		p15, 0, r0, c1, c0, 1		// Read ACTLR
	MOV		r1, r0
	ORR		r0, r0, #0x040				// Set bit 6
	CMP		r0, r1
	MCRNE	p15, 0, r0, c1, c0, 1		// Write ACTLR
	ISB
	////////////////////////////////////////////////
	// disable mmu and cache
	MRC     p15, 0, r0, c1, c0, 0       // Read CP15 System Control register
	BIC     r0, r0, #(0x1 << 12)        // Clear I, bit 12, to disable I Cache
	BIC     r0, r0, #(0x1 << 11)        // Clear Z, bit 11, to disable branch prediction
	BIC     r0, r0, #(0x1 <<  2)        // Clear C, bit  2, to disable D Cache
	BIC     r0, r0, #(0x1 <<  1)        // Clear A, bit  1, to disable strict alignment fault checking
	BIC     r0, r0, #0x1                // Clear M, bit  0, to disable MMU
	MCR     p15, 0, r0, c1, c0, 0       // Write CP15 System Control register
	ISB
	////////////////////////////////////////////////
 	// setup domain
	MRC     p15, 0, r0, c3, c0, 0		// Read Domain Access Control Register
	LDR     r0, =0x55555555				// Initialize every domain entry to b01 (client)
	MCR     p15, 0, r0, c3, c0, 0		// Write Domain Access Control Register
	////////////////////////////////////////////////
 	// enable vfp
	MOV		r0, #0x00F00000				// clear ASEDIS, enable cp10/cp11 access
	MCR		p15, 0, r0, c1, c0, 2		// Write Coprocessor Access Control Register (CPACR)
	ISB
	MOV		r0, #0x40000000
	VMSR	FPEXC, r0					// Write FPEXC register, EN bit set
	ISB
	////////////////////////////////////////////////
 	// multi-core different init branch
	MRC		p15, 0, r0, c0, c0, 5       // Read CPU ID register
	ANDS	r0, r0, #0x03               // Mask off, leaving the CPU ID field
	CMP		r0, #0
	BEQ     core_0_init
	B	    core_1_init
	
		.global	core_0_init
core_0_init:
	////////////////////////////////////////////////
	//setup stack
	LDR     r1, =_core0_stack_top_
	MSR     CPSR_c, #Mode_IRQ | I_Bit | F_Bit		// IRQ mode
	MOV     sp, r1
	SUB		r1, #4096

	MSR     CPSR_c, #Mode_FIQ | I_Bit | F_Bit		// FIQ mode
	MOV     sp, r1
	SUB		r1, #256

	MSR     CPSR_c, #Mode_ABT | I_Bit | F_Bit		// ABT mode
	MOV     sp, r1
	SUB		r1, #256

	MSR     CPSR_c, #Mode_UNDEF | I_Bit | F_Bit		// UNDEF mode
	MOV     sp, r1
	SUB		r1, #256

	MSR     CPSR_c, #Mode_SYS | I_Bit | F_Bit		// SYS mode
	MOV     sp, r1
	SUB		r1, #2048

	MSR     CPSR_c, #Mode_SVC | I_Bit | F_Bit		// SVC mode
	MOV     sp, r1
	////////////////////////////////////////////////
	// init branch predictor
	MOV     r0, #0x0
	MCR     p15, 0, r0, c7, c5, 6		// BPIALL - Invalidate entire branch predictor array
	////////////////////////////////////////////////
	// init cache
	MOV		r0, #0
	MCR		p15, 0, r0, c7, c5, 0       // Invalidate entire instruction cache

	.if (DCACHE_INVALID==1)
	.if (ASSEMBLE_PRINT==1)
	LDR		r0, =msg_cache_invalid
	BL		print_msg
	.endif
	MOV		r0, #0						// invalidate dcache
	BL		arm_all_dcache_operation
	.endif
	////////////////////////////////////////////////
	// init TLB
	MOV     r0, #0x0
	MCR     p15, 0, r0, c8, c5, 0    	// ITLBIALL - Invalidate entire Instruction TLB
	MCR     p15, 0, r0, c8, c6, 0    	// DTLBIALL - Invalidate entire Data TLB
	MCR     p15, 0, r0, c8, c7, 0    	// TLBIALL  - Invalidate entire Unified TLB
	////////////////////////////////////////////////
	// clear bss
	.if (ASSEMBLE_PRINT==1)
	LDR		r0, =msg_clear_bss
	BL		print_msg
	.endif

	MOV     r2, #0x0
	MOV     r3, #0x0
	MOV     r4, #0x0
	MOV     r5, #0x0
	MOV     r6, #0x0
	MOV     r7, #0x0
	MOV     r8, #0x0
	MOV     r9, #0x0
    LDR     r0, =_bss_start_
    LDR     r1, =_bss_end_
loop_clear_bss:
	STMIA   r0!, {r2-r9}
	CMP     r0, r1
	BCC     loop_clear_bss
	DSB
	////////////////////////////////////////////////
	// init mmu
	LDR		r0, =(MMU_S1_NL_WT_RAWA<<24) | (MMU_S1_NL_NCE<<16) | (MMU_S1_DEV<<8) | MMU_S1_SGO
	MCR		p15, 0, r0, c10, c2, 0		// write MAIR0
	LDR		r0, =(MMU_S1_NL_WB_NA<<16) | (MMU_S1_NL_WB_RAWA<<8) | MMU_S1_NL_WT_NA
	MCR		p15, 0, r0, c10, c2, 1		// write MAIR1

	LDR     r0, =0x80000000				// enable EAE, non shareable, non cacheable, only use TTBR0
	MCR     p15, 0, r0, c2, c0, 2		// write TTBCR
	ISB
	LDR		r0, =_mmu_l1_base_
	LDR     r1, =0						// table high address[39:32]=0, ASID=0
	MCRR	p15, 0, r0, r1, c2			// write 64-bit TTBR0

	BL		setup_mmu_l2_table_base
	////////////////////////////////////////////////
	// enable mmu
	DSB
	ISB
	MRC		p15, 0, r0, c1, c0, 0		// Read CP15 System Control register
	ORR		r0, r0, #0x1				// Set M bit 0 to enable MMU
	MCR		p15, 0, r0, c1, c0, 0		// Write CP15 System Control register
	ISB
	////////////////////////////////////////////////
	// enable cache
	MRC		p15, 0, r0, c1, c0, 0		// Read System Control Register
	ORR		r0, r0, #(0x1 << 12)		// Set I bit 12 to enable I Cache
	//ORR		r0, r0, #(0x1 << 2)			// Set C bit  2 to enable D Cache
	ORR		r0, r0, #(0x1 << 11)		// Set Z bit 11 to enable branch prediction
	MCR		p15, 0, r0, c1, c0, 0		// Write System Control Register
	ISB
	////////////////////////////////////////////////
	// wake core1
	//SEV
	////////////////////////////////////////////////
	// branch to main program
	LDR		r12, =core_0_main
	BX		r12

标签:A15,汇编,r0,setup,BSP,vector,mode,c0,p15
From: https://www.cnblogs.com/solo666/p/18264331

相关文章

  • 编码器的稀疏注意力块(ProbSparse Self-Attention Block)
    编码器的稀疏注意力块(ProbSparseSelf-AttentionBlock)详细解释1.概述稀疏注意力块是Informer模型的核心组件之一,旨在高效处理长时间序列数据。它通过稀疏自注意力机制(ProbSparseSelf-Attention)显著降低计算复杂度,同时保持较高的性能。2.主要组件稀疏注意力块由以下......
  • 2024.6.19 Subspace更名Autonomys后的首次社区会议:Autonomys新任CEO首秀
    本次社区会议为Subspace更名为Autonomys以及新任CEO LabheshPatel赴任后的首次社区会议。会议信息量较多,TimeDao择取重要信息如下:新任CEO介绍主网将会在第三季度末上线,在内部称为“GenesisProject”,每周多次会议确保这一目标的实现。TGE,TokenGenesisEvent,第一个代币......
  • 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础
    ARM-CP15协处理器ARM处理器使用协处理器15(CP15)的寄存器来控制cache、TCM和存储器管理。CP15的寄存器只能被MRC和MCR(MovetoCoprocessorfromARMRegister)指令访问,包含16个32位的寄存器,其编号为0~15。本篇重点讲解其中的C7,C2,C13三个寄存器。先拆解一段汇编代码上来......
  • 鸿蒙内核源码分析(汇编传参篇) | 如何传递复杂的参数
    汇编如何传复杂的参数?汇编基础篇中很详细的介绍了一段具有代表性很经典的汇编代码,有循环,有判断,有运算,有多级函数调用。但有一个问题没有涉及,就是很复杂的参数如何处理?在实际开发过程中函数参数往往是很复杂的参数,(比如结构体)汇编怎么传递呢?先看一段C语言及汇编代码,......
  • Excel和Word等工具小技能分享汇编(一)
    这里汇集刘小生前期微信公众号分享的Excel和Word等工具小技能,为方便大家查看学习,刘小生对其进行分类整理,后期也会不定期整理更新,如有想学习交流或其他小技巧需求,欢迎留言,我们一起学习进步!如喜欢也可以关注刘小生微信公众号!一、Excel小技能汇编1、拆分和合并表格Excel如果......
  • 汇编语言程序设计 - 显示EXE文件的头信息
    一、问题描述本程序旨在读取并显示一个DOS可执行文件(.EXE文件)的头信息。具体来说,该程序需要打开一个名为“xxx.exe”的文件,读取其头部信息并将其逐项打印出来,并在每个信息前面加上相应的标注,使输出的信息清晰易读。二、数据结构程序使用的主要数据结构包括:文件名字符串:存......
  • 汇编语言程序设计 - 统计字符串中非数字字符的数
    80x86汇编习题题目描述:从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。思路:有两种思路,一种是先输出,后计数;另一种是边输入,边计数。本文是用前者。1,逐个字符输入到BUFF,指针后移,判断是否为'$',是则结束输入2,逐个判断数组内容是否为数字,是则......
  • 汇编语言程序设计 - 将当前目录下文件 FIE10.TXT 的所有小写字母改为大写字母,然后拷贝
    80x86汇编题目题目描述:编写一个程序,将当前目录下文件FIE10.TXT 的所有小写字母改为大写字母,然后拷贝到当前目录文件FILE20.TXT。思路:1,分别打开两个文件,保存文件句柄2,读取FILE10文件的一个字节到BUF内存中。3,判断是否为小写。非小写字母直接写入到FILE20文件中,小写字母......
  • 第一章 进制,寄存器,汇编指令(公开课)
     一、进制1、十进制:由0.1.2.3.4.5.6.7.8.9组成,逢十进一2、二进制:由0.1组成,逢二进一eg:0--01--12--103--114--1005--1016--1103、十六进制:由0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F组成,逢十六进一4、八进制eg:2-3=?二、exe程序1、PE文件结构:任何一个在Windows上运行的可执行文件都要遵......
  • 《计算机组成原理与汇编语言程序设计》读书笔记
    信息《计算机组成原理与汇编语言程序设计(第4版)(高等学校规划教材)》徐洁电子工业出版社摘录硬件组成在早期,冯·诺依曼将计算机的硬件组成分为5大部件。几十年来,计算机硬件系统已有了许多重大变化。首先,现在采用的大规模及超大规模集成电路,可将运算器和控制器集成在一块芯片......