|
|
EDK_20080905(各家IBV的应该类似),文件Image.c,在CoreStartImage(),如下一段中:- Status = gEfiPeiTransferControl->SetJump (gEfiPeiTransferControl, Image->JumpContext);
3 N, I( ?9 a: H6 E! P! n& w5 P! Q. `& q - //
5 W9 |9 g" e% X4 Z: i; `: \ - // The SetJump returns EFI_SUCCESS when LongJump Buffer has been armed( R, X ?: \8 ^$ U8 e" x- a
- // SetJump returns EFI_WARN_RETURN_FROM_LONG_JUMP as a result of the LongJump( [- _" ^+ o) j- p8 o
- // All other return values for SetJump are undefined.+ W% K+ W. {: E4 `! x6 J/ a
- //
+ z3 N: b* F! x4 V" w* ^ - if (Status == EFI_SUCCESS) {
+ w- r/ v! F* n% S$ @) X - 5 l& N4 z2 i! H5 D: X4 X' t
- //3 n4 F3 z8 p, { u. B r
- // Call the image's entry point
- Y# z4 X+ S) a% u% H1 {0 ~ - //) t8 y5 u* c) c+ U0 h1 {
- Image->Started = TRUE;
2 L( L, K1 v3 t& N2 I, h - Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable);1 P# Y/ F* T9 o& X0 o6 |4 |5 U
3 b4 P; W. T- p9 A$ M; s- //
# I @- h8 h# z) B2 g+ U6 W - // Add some debug information if the image returned with error.
) }% @6 `" C' R' ?0 {$ Q& E# {. c - // This make the user aware and check if the driver image have already released 3 U2 q8 e( H; p( ~, u$ G& |2 t) |, w
- // all the resource in this situation.
0 [# |; c5 |. V6 \& u3 \! | - //
I& N1 I! a' k8 b0 e - DEBUG_CODE (
$ ]' Z7 p5 d: P9 L" S: ~$ X+ K - if (EFI_ERROR (Image->Status)) {
& c0 a6 O z- X4 O - DEBUG ((EFI_D_ERROR, "Error: Image at %08X start failed: %x\n", Image->Info.ImageBase, Image->Status));) Y7 y F( ]/ D$ _% o" B
- }# f3 f% Z3 s5 H$ ^
- )) A: A2 s3 R; B. a0 W
-
4 ^/ `( t1 \% R4 f. T8 b d' @ - //( }5 B; i' r8 G
- // If the image returns, exit it through Exit() h) p% v8 J6 s, ?9 x& q
- //& ~# ~2 g+ u4 w- B3 s O& I
- CoreExit (ImageHandle, Image->Status, 0, NULL); s+ d9 h( O H0 m
- }
复制代码 调用DXE driver前,为什么要用SetJump保存CPU的信息,driver返回后,再用CoreExit--LongJump恢复到SetJump时的状态
0 n8 J3 C; w5 S) e1 O; Z* d; h6 u1 P既然driver可以返回,为什么非要这样恢复到调用前的状态呢?难道在调用driver的过程CPU的状态可能会被破坏吗?( N0 ^$ _) ~0 I- i) O* `# O7 N9 Z
而且目前来看driver只会返回Status而已,根据这个就可以做处理了.
! y; T" a; E/ n8 m! A( D- L1 S2 L, s ?: K) e% a& {: L4 h
我感觉有点多此一举了...不解 |
|