|
|
EDK_20080905(各家IBV的应该类似),文件Image.c,在CoreStartImage(),如下一段中:- Status = gEfiPeiTransferControl->SetJump (gEfiPeiTransferControl, Image->JumpContext);
+ {) D6 c5 m, e& P2 |/ l+ ^1 | - //
# S7 |$ [( `/ \ m, j" [9 } - // The SetJump returns EFI_SUCCESS when LongJump Buffer has been armed
( p" A- c9 }4 _- e2 q9 {0 i - // SetJump returns EFI_WARN_RETURN_FROM_LONG_JUMP as a result of the LongJump, e( d' s, | l8 L& a
- // All other return values for SetJump are undefined.- C; c8 ~6 R2 l W& B9 H
- //
/ W* [; c2 s" p( W3 p4 K# ] - if (Status == EFI_SUCCESS) {
, F& h; H# a2 \, k
0 w; I+ H; e5 A; a. s- //
$ Y! \* ~% u" r0 p+ u - // Call the image's entry point# o2 o+ _ n2 z) \
- //% \4 [3 l2 b0 t% Y( \7 X
- Image->Started = TRUE;
4 {# Y2 i3 S) g - Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable);. v; | n( z+ z2 y/ p& M
8 R$ i6 N8 M- ~1 K- //( z) g+ N4 h+ _! C; [
- // Add some debug information if the image returned with error.
0 \5 C- w7 }2 R" z3 z" k4 f - // This make the user aware and check if the driver image have already released + K" l3 ^9 s2 T( }! G
- // all the resource in this situation.
# I. a5 j( K" O% o - //
: Q* k/ O" w% J! q - DEBUG_CODE (
5 A6 e) R! U$ c) z% A - if (EFI_ERROR (Image->Status)) {
' h% {: c* ^% w) j i G - DEBUG ((EFI_D_ERROR, "Error: Image at %08X start failed: %x\n", Image->Info.ImageBase, Image->Status));; a# Y, x6 ]: z0 q1 b9 S1 l, N
- }
: z- S$ O' ~! ^! G/ K& I& _ - )
8 ]0 }3 z5 ?' u. X; q -
R7 F Z' T/ t% z1 f" j* Z$ f - //; j) I# D2 p" H8 P+ x" w
- // If the image returns, exit it through Exit()
J5 Y. o- l1 x, v - //4 N2 j j7 \3 ~; g! r
- CoreExit (ImageHandle, Image->Status, 0, NULL);
, i0 _/ a7 b. a1 u3 T, t$ ~) e7 x - }
复制代码 调用DXE driver前,为什么要用SetJump保存CPU的信息,driver返回后,再用CoreExit--LongJump恢复到SetJump时的状态5 y! J. t! L7 i2 p* \/ b% m
既然driver可以返回,为什么非要这样恢复到调用前的状态呢?难道在调用driver的过程CPU的状态可能会被破坏吗?- B+ Q' e% [0 M4 A6 h
而且目前来看driver只会返回Status而已,根据这个就可以做处理了.
1 Z2 S; Y% N$ I o& ]& R
% p6 y/ ^( r2 W$ c我感觉有点多此一举了...不解 |
|