|
|
EDK_20080905(各家IBV的应该类似),文件Image.c,在CoreStartImage(),如下一段中:- Status = gEfiPeiTransferControl->SetJump (gEfiPeiTransferControl, Image->JumpContext);" A, q5 g9 h+ o6 Z0 m; W
- //2 V! h: K$ o* Y* c6 p( u/ y6 m
- // The SetJump returns EFI_SUCCESS when LongJump Buffer has been armed
+ z6 p. [) ~' K% R M1 L2 e) t% @ - // SetJump returns EFI_WARN_RETURN_FROM_LONG_JUMP as a result of the LongJump
4 o; o8 Z3 v: f! P) } - // All other return values for SetJump are undefined.
7 [, E2 }8 x% s0 X7 w - //
" Z! K4 B/ j+ N+ ?8 N1 i - if (Status == EFI_SUCCESS) {; E& q& [1 x6 E
- 5 o& i8 R4 p3 h8 I
- //) x, B5 T8 B, `8 ]# `* Y- k
- // Call the image's entry point2 e# v- q% f7 W$ ]) D5 @' @$ ]
- //
5 ]1 e1 E* F6 V k& a1 ?8 u) R/ o - Image->Started = TRUE;
) I& Z& N& s% Y8 p' F0 p3 B - Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable);
- {# x8 t4 [1 e0 M3 n
4 P1 B, l* o& w/ l3 ^9 X- //! W P# n3 y0 m+ M- `. `. l8 ^
- // Add some debug information if the image returned with error.
3 O8 N# w$ P& U* B g( D% Q - // This make the user aware and check if the driver image have already released
$ Q Y5 K. ^& k3 l: E0 ]3 K* w9 K- X) U - // all the resource in this situation.
! Y% c5 c1 b. T7 Q# g7 _6 c# x - //6 M2 n9 \/ o; O6 l5 F3 f. R) V
- DEBUG_CODE (9 A0 _( R J/ a
- if (EFI_ERROR (Image->Status)) {( R9 a0 t. U# N9 V# P+ R
- DEBUG ((EFI_D_ERROR, "Error: Image at %08X start failed: %x\n", Image->Info.ImageBase, Image->Status));: E7 ]5 K! U5 m* i* g% g
- }' {" k# s3 B; p, q
- )
, j, M/ l0 x5 i - 1 t4 @2 M- v# ~- @7 X! w* p
- //
. x4 R4 V* n" a: v7 O - // If the image returns, exit it through Exit()" e, s+ o. G+ S
- //
$ v; M3 J9 a- z4 X; I, b% _ - CoreExit (ImageHandle, Image->Status, 0, NULL);1 I. V3 H/ B: y/ P
- }
复制代码 调用DXE driver前,为什么要用SetJump保存CPU的信息,driver返回后,再用CoreExit--LongJump恢复到SetJump时的状态
1 I* O# O B z既然driver可以返回,为什么非要这样恢复到调用前的状态呢?难道在调用driver的过程CPU的状态可能会被破坏吗?
. W+ l; Z1 W7 U' n2 |$ ?而且目前来看driver只会返回Status而已,根据这个就可以做处理了." V" n7 f0 p7 P
3 b# Y4 `, \7 X1 j3 p+ V我感觉有点多此一举了...不解 |
|