|
3#
樓主 |
發表於 2008-10-13 17:20:35
|
只看該作者
我們從 head-common.S返回之後,接著繼續看。, S+ a7 Z: R1 F6 U' @
' @% p' t; @* i; A7 @line 84, movs的意思是說,做mov的動作,並且將指令的S bit設起來,最後的結果也會update CPSR。這個指令執行的過程當中,會根據你要搬動的值去把N and Z flag設好。這個是有助於下個指令做check的動作。2 w9 K% h$ S$ @( D1 t) N0 q, }
line 85, 就是r5 = 0的話,就跳到__error_p去執行。1 R) j2 J5 Q m& d
line 86, 跳到__lookup_machine_type。原理跟剛剛找proc的資料一樣。- 83 bl __lookup_processor_type @ r5=procinfo r9=cpuid
8 W/ D4 L1 ?$ F5 `) g - 84 movs r10, r5 @ invalid processor (r5=0)?
0 J/ B5 i$ ]( n2 J, n1 n1 | F - 85 beq __error_p @ yes, error 'p'
" U, m7 U) e& r7 A - 86 bl __lookup_machine_type @ r5=machinfo
複製代碼 看得出來跟proc很像,有個兩個小地方是5 j1 v3 |+ W6 C1 o* s! G) Q. \
+ B* H0 M2 F7 X8 H% Q
1. line 207,用ldmia不是用ldmda。原因就在於存放arch 和 proc info 的位址剛好相反。一個在lable3的上面。一個在的下方。設計上應該是可以做修改的。
1 X/ e5 ~, A( r7 w1 N' X0 P5 n+ F1 x: J
2. arch定義的方式是透過macro,可以先看 ./include/asm-arm/mach/arch.h。裡頭有個 MACHINE_START ,這邊會設好macro,到時候直接使用就可以把arch的info宣告好。 例如 ./arch/arm/mach-omap1/board-generic.c- /* macro */, x( P/ |, c+ f/ A
- 50 #define MACHINE_START(_type,_name) \
+ P+ J2 F% I* B! M: {% E) G6 I& z - 51 static const struct machine_desc __mach_desc_##_type \
1 Y& W/ m2 x! t4 V7 Y! P$ m - 52 __used \
% R$ j5 y4 Y. p# N( k - 53 __attribute__((__section__(".arch.info.init"))) = { \& ~4 P& S4 e6 V7 x! L3 G
- 54 .nr = MACH_TYPE_##_type, \8 n$ x9 X2 r( _1 _+ ?
- 55 .name = _name,
+ Q% t: k" }; F7 P5 I& _ - 56
( F: a/ k% p, F! k/ C - 57 #define MACHINE_END \/ [" h* p+ b) b" W
- 58 };
" `) L9 u: u3 e! J: d; ] - /* 用法 */# Z7 z( I( f* M" Z2 l$ a# W% c
- 93 MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
% Y8 j" N6 i+ ?" c7 e8 U - 94 /* Maintainer: Tony Lindgren <tony@atomide.com> */* J0 Z; J4 p2 | S0 J- a8 R# T
- 95 .phys_io = 0xfff00000,# m# n( i2 G5 S+ Q! O3 s t
- 96 .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
- V! o5 p3 w" r) ]. d0 O - 97 .boot_params = 0x10000100,
# U% u- k9 _- ~' y) X - 98 .map_io = omap_generic_map_io,5 |9 W, E2 {# a5 J, s
- 99 .init_irq = omap_generic_init_irq," f, j% h. Z( f- O
- 100 .init_machine = omap_generic_init,
) p, |; p: Z& N - 101 .timer = &omap_timer,1 M( c9 ]8 E& ^: O1 J: w/ _1 m" ?, p* d
- 102 MACHINE_END
& m2 m4 P0 q: H1 p' d; r0 ~ - % i" h3 j* n( H) h* Y. p( w4 f
- /* func */
) _" P; q( q$ Z6 E' E - 204 .type __lookup_machine_type, %function& i- g$ m& d" M1 W6 u) B, Q" z. f
- 205 __lookup_machine_type:6 t( Z1 Y/ }, v' u
- 206 adr r3, 3b
- ]- U+ `/ m- m* n3 }1 ^ - 207 ldmia r3, {r4, r5, r6}
5 u' W) f; i1 L2 B( y( z, S* P - 208 sub r3, r3, r4 @ get offset between virt&phys. G! c' ]5 r2 | {# X, q3 t. B# g
- 209 add r5, r5, r3 @ convert virt addresses to
# }4 e v6 V+ |% k8 [ ] - 210 add r6, r6, r3 @ physical address space' D8 X7 F. b, t3 L
- 211 1: ldr r3, [r5, #MACHINFO_TYPE] @ get machine type
c. f* D! r$ e - 212 teq r3, r1 @ matches loader number?
, E/ @4 A1 M0 ^$ e6 C2 l/ t# H - 213 beq 2f @ found3 W8 I5 O, ?+ f+ ^6 K; @
- 214 add r5, r5, #SIZEOF_MACHINE_DESC @ next machine_desc
% ?+ o" U2 K& g - 215 cmp r5, r6
' m* e# t( v- ?2 P; U* s - 216 blo 1b
' W* j# w6 w8 Q - 217 mov r5, #0 @ unknown machine
$ b) P2 }" a& g/ w) p& S4 e - 218 2: mov pc, lr
複製代碼 |
|