Introduction
By utilizing the make cscope
to create cscope
database, I could browse a
specific build without being confused by a lot of symbols with same names.
This document describe very basic scenario on how to read the u-boot source
code.
start.S
After loading the cscope.out, I could find search the starting point by the following command
cs find f start.S
This leads me to the file arm/cpu/arm1136/start.S
.
SVC32
SVC32 mode is the mode with highest privilege.
reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
From the ARM11 specification, http://infocenter.arm.com/help/topic/com.arm.doc.ddi0360f/DDI0360F_arm11_mpcore_r2p0_trm.pdf, Section 2.9, we could learn that the register CPSR’s bit 0 to bit 4 contains the processor operating mode.
In Section 2.9.7, we learned that value b10011
will set the processor to
supervisor mode.
bic
(bit clear) clears the r0’s bit 0 to bit 4. And orr
instruction sets
the bit 0b11010011
, apart from setting the mode to SVC mode, it also disables
FIQ and IRQ.
flash caches
cpu_init_crit:
/*
* flush v4 I/D caches
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* Invalidate I+D+BTB caches */
mcr p15, 0, r0, c8, c7, 0 /* Invalidate Unified TLB */
The first instruction about “Invalidate I+D+BTB caches” could be understood from the following figure in “ARM11 MPCore™ Processor Revision: r2p0 Technical Reference Manual”:
The instruction about TLB could be understood from following figure:
disable MMU and data cache
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 1 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0, 0
According to following figure:
The code first reads the control register to r0
, then modifies the value of
r0
and writes it back to control register.
Detailed description are in following figures. The code first clears following bits:
- bit 13, which selects the low normal exception vectors which range is address range = 0x00000000-0x0000001C.
- bits 9:8 is the ROM protection and System protection.
- bit 7 is “Reserved”, I am not sure why the code needs to clear the bit.
- bit 2:0 which is C , data cache disabled; A, strict alignment fault checking disabled; M, MMU disabled.
The code set following bits:
- bit 1: strict alignment fault checking enabled
- bit 12: instruction cache enabled
The instruction cache is enabled in the code which looks not aligned with the comments “instruction cache enabled”.
Continue with part 2