00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
#include "ki.h"
00028 
#include "ntfpia64.h"
00029 
00030 
00031 
00032 ULONGLONG
00033 KiGetRegisterValue (
00034     IN ULONG Register,
00035     IN PKEXCEPTION_FRAME ExceptionFrame,
00036     IN PKTRAP_FRAME TrapFrame
00037     )
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 {
00063     
00064     
00065     
00066 
00067     
if (Register == 0) {
00068         
return 0;
00069     } 
else if (Register <= 3) {
00070         Register -= 1;
00071         
return ( *(&TrapFrame->IntGp + Register) );
00072     } 
else if (Register <= 7) {
00073         Register -= 4;
00074         
return ( *(&ExceptionFrame->IntS0 + Register) );
00075     } 
else if (Register <= 31) {
00076         Register -= 8;
00077         
return ( *(&TrapFrame->IntV0 + Register) );
00078     }
00079     
00080     
00081     
00082     
00083     
00084     
00085 
00086     {
00087         PULONGLONG UserBStore, KernelBStore;
00088         ULONG RegisterOffset;
00089         ULONG i;
00090         ULONG SizeOfCurrentFrame;
00091         ULONG SizeOfDirty;
00092         LONG NumberOfDirty;
00093 
00094         SizeOfDirty = (ULONG)(TrapFrame->RsBSP - TrapFrame->RsBSPSTORE);
00095         NumberOfDirty = SizeOfDirty >> 3;
00096         SizeOfCurrentFrame = (ULONG)(TrapFrame->StIFS & 0x7F);
00097 
00098         
if (TrapFrame->PreviousMode == 
UserMode) {
00099 
00100             
00101             
00102             
00103 
00104             KernelBStore = (PULONGLONG)(PCR->InitialBStore + (TrapFrame->RsBSPSTORE & 0x1F8) + SizeOfDirty);
00105 
00106             UserBStore = (ULONGLONG *) TrapFrame->RsBSP; 
00107 
00108             RegisterOffset = Register - 32;
00109 
00110             
do {
00111 
00112                 KernelBStore = KernelBStore - 1;
00113                 UserBStore = UserBStore - 1;
00114                 NumberOfDirty = NumberOfDirty -1;
00115                 
00116                 SizeOfCurrentFrame = SizeOfCurrentFrame - 1;
00117 
00118                 
if (((ULONG_PTR) KernelBStore & 0x1F8) == 0x1F8) {
00119                     
00120                     
00121                     
00122                     
00123 
00124                     KernelBStore = KernelBStore -1;
00125                 }
00126 
00127                 
if (((ULONG_PTR) UserBStore & 0x1F8) == 0x1F8) {
00128                     
00129                     
00130                     
00131                     
00132 
00133                     UserBStore = UserBStore -1;
00134                 }
00135 
00136             } 
while (RegisterOffset < SizeOfCurrentFrame); 
00137 
00138             
if (NumberOfDirty >= 0) {
00139                 
00140                 
return (*KernelBStore);
00141 
00142             } 
else {
00143 
00144                 
return (*UserBStore);
00145             }
00146             
00147         } 
else {
00148 
00149             
00150             
00151             
00152 
00153             KernelBStore = (ULONGLONG *) TrapFrame->RsBSP;
00154 
00155             RegisterOffset = Register - 32;
00156 
00157             
do {
00158 
00159                 KernelBStore = KernelBStore - 1;
00160 
00161                 SizeOfCurrentFrame = SizeOfCurrentFrame - 1;
00162 
00163                 
if (((ULONG_PTR) KernelBStore & 0x1F8) == 0x1F8) {
00164                     
00165                     
00166                     
00167                     
00168 
00169                     KernelBStore = KernelBStore -1;
00170                 }
00171                 
00172             } 
while (RegisterOffset < SizeOfCurrentFrame); 
00173             
00174             
return (*KernelBStore);
00175         }
00176     }
00177 }   
00178 
00179 
00180 
VOID
00181 KiSetRegisterValue (
00182     IN ULONG Register,
00183     IN ULONGLONG Value,
00184     OUT PKEXCEPTION_FRAME ExceptionFrame,
00185     OUT PKTRAP_FRAME TrapFrame
00186     )
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 {
00214 
00215     
00216     
00217     
00218 
00219     
if (Register == 0) {
00220         
return;
00221     } 
else if (Register <= 3) {
00222         Register -= 1;
00223         *(&TrapFrame->IntGp + Register) = Value;
00224         
return;
00225     } 
else if (Register <= 7) {
00226         Register -= 4;
00227         *(&ExceptionFrame->IntS0 + Register) = Value;
00228         
return;
00229     } 
else if (Register <= 31) {
00230         Register -= 8;
00231         *(&TrapFrame->IntV0 + Register) = Value;
00232         
return;
00233     }
00234 
00235     
00236     
00237     
00238     
00239     
00240 
00241     {
00242         PULONGLONG UserBStore, KernelBStore;
00243         ULONG RegisterOffset;
00244         ULONG i;
00245         ULONG SizeOfCurrentFrame;
00246         ULONG SizeOfDirty;
00247         LONG NumberOfDirty;
00248 
00249         SizeOfDirty = (ULONG)(TrapFrame->RsBSP - TrapFrame->RsBSPSTORE);
00250         NumberOfDirty = SizeOfDirty >> 3;
00251         SizeOfCurrentFrame = (ULONG)(TrapFrame->StIFS & 0x7F);
00252 
00253         
if (TrapFrame->PreviousMode == 
UserMode) {
00254 
00255             
00256             
00257             
00258 
00259             KernelBStore = (PULONGLONG)(PCR->InitialBStore + (TrapFrame->RsBSPSTORE & 0x1F8) + SizeOfDirty);
00260 
00261             UserBStore = (ULONGLONG *) TrapFrame->RsBSP; 
00262 
00263             RegisterOffset = Register - 32;
00264 
00265             
do {
00266 
00267                 KernelBStore = KernelBStore - 1;
00268                 UserBStore = UserBStore - 1;
00269                 NumberOfDirty = NumberOfDirty -1;
00270                 
00271                 SizeOfCurrentFrame = SizeOfCurrentFrame - 1;
00272 
00273                 
if (((ULONG_PTR) KernelBStore & 0x1F8) == 0x1F8) {
00274                     
00275                     
00276                     
00277                     
00278 
00279                     KernelBStore = KernelBStore -1;
00280                 }
00281 
00282                 
if (((ULONG_PTR) UserBStore & 0x1F8) == 0x1F8) {
00283                     
00284                     
00285                     
00286                     
00287 
00288                     UserBStore = UserBStore -1;
00289                 }
00290 
00291             } 
while (RegisterOffset < SizeOfCurrentFrame); 
00292 
00293             
if (NumberOfDirty >= 0) {
00294                 
00295                 *KernelBStore = Value;
00296 
00297             } 
else {
00298 
00299                 *UserBStore = Value;
00300             }
00301             
00302         } 
else {
00303 
00304             
00305             
00306             
00307 
00308             KernelBStore = (ULONGLONG *) TrapFrame->RsBSP;
00309 
00310             RegisterOffset = Register - 32;
00311 
00312             
do {
00313 
00314                 KernelBStore = KernelBStore - 1;
00315 
00316                 SizeOfCurrentFrame = SizeOfCurrentFrame - 1;
00317 
00318                 
if (((ULONG_PTR) KernelBStore & 0x1F8) == 0x1F8) {
00319                     
00320                     
00321                     
00322                     
00323 
00324                     KernelBStore = KernelBStore -1;
00325                 }
00326                 
00327             } 
while (RegisterOffset < SizeOfCurrentFrame); 
00328             
00329             *KernelBStore = Value;
00330         }
00331     }
00332 }   
00333 
00334 #define GET_NAT_ADDRESS(addr) (((ULONG_PTR) (addr) >> 3) & 0x3F)
00335 
00336 #define GET_NAT(Nats, addr) (UCHAR)((Nats >> GET_NAT_ADDRESS(addr)) & 1)
00337 
00338 
00339 UCHAR
00340 KiGetRegisterNaT (
00341     IN ULONG Register,
00342     IN PKEXCEPTION_FRAME ExceptionFrame,
00343     IN PKTRAP_FRAME TrapFrame
00344     )
00345 {
00346     
00347     
00348     
00349 
00350     
switch (Register) {
00351 
00352         
00353         
00354         
00355 
00356     
case 0:
00357         
return 0;
00358 
00359         
00360         
00361         
00362 
00363     
case 1:
00364         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntGp));
00365         
00366         
00367         
00368         
00369 
00370     
case 2:
00371         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT0));
00372 
00373         
00374         
00375         
00376 
00377     
case 3:
00378         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT1));
00379 
00380         
00381         
00382         
00383 
00384     
case 4:
00385         
return (
GET_NAT(ExceptionFrame->IntNats, &ExceptionFrame->IntS0));
00386 
00387         
00388         
00389         
00390 
00391     
case 5:
00392         
return (
GET_NAT(ExceptionFrame->IntNats, &ExceptionFrame->IntS1));
00393 
00394         
00395         
00396         
00397 
00398     
case 6:
00399         
return (
GET_NAT(ExceptionFrame->IntNats, &ExceptionFrame->IntS2));
00400 
00401         
00402         
00403         
00404 
00405     
case 7:
00406         
return (
GET_NAT(ExceptionFrame->IntNats, &ExceptionFrame->IntS3));
00407 
00408         
00409         
00410         
00411 
00412     
case 8:
00413         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntV0));
00414         
00415         
00416         
00417         
00418    
00419     
case 9:
00420         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT2));
00421 
00422         
00423         
00424         
00425 
00426     
case 10:
00427         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT3));
00428 
00429         
00430         
00431         
00432 
00433     
case 11:
00434         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT4));
00435 
00436         
00437         
00438         
00439 
00440     
case 12:
00441         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntSp));
00442 
00443         
00444         
00445         
00446    
00447     
case 13:
00448         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntTeb));
00449 
00450         
00451         
00452         
00453    
00454     
case 14:
00455         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT5));
00456 
00457         
00458         
00459         
00460    
00461     
case 15:
00462         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT6));
00463 
00464         
00465         
00466         
00467    
00468     
case 16:
00469         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT7));
00470 
00471         
00472         
00473         
00474    
00475     
case 17:
00476         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT8));
00477 
00478         
00479         
00480         
00481    
00482     
case 18:
00483         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT9));
00484 
00485         
00486         
00487         
00488    
00489     
case 19:
00490         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT10));
00491 
00492         
00493         
00494         
00495    
00496     
case 20:
00497         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT11));
00498 
00499         
00500         
00501         
00502    
00503     
case 21:
00504         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT12));
00505 
00506         
00507         
00508         
00509    
00510     
case 22:
00511         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT13));
00512 
00513         
00514         
00515         
00516    
00517     
case 23:
00518         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT14));
00519 
00520         
00521         
00522         
00523    
00524     
case 24:
00525         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT15));
00526 
00527         
00528         
00529         
00530    
00531     
case 25:
00532         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT16));
00533 
00534         
00535         
00536         
00537    
00538     
case 26:
00539         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT17));
00540 
00541         
00542         
00543         
00544    
00545     
case 27:
00546         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT18));
00547 
00548         
00549         
00550         
00551    
00552     
case 28:
00553         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT19));
00554 
00555         
00556         
00557         
00558    
00559     
case 29:
00560         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT20));
00561 
00562         
00563         
00564         
00565    
00566     
case 30:
00567         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT21));
00568 
00569         
00570         
00571         
00572 
00573     
case 31:
00574         
return (
GET_NAT(TrapFrame->IntNats, &TrapFrame->IntT22));
00575 
00576     
default:
00577         
break;
00578    
00579     }
00580 
00581     
return 0;
00582 }
00583 
00584 
00585 FLOAT128
00586 KiGetFloatRegisterValue (
00587     IN ULONG Register,
00588     IN 
struct _KEXCEPTION_FRAME *ExceptionFrame,
00589     IN 
struct _KTRAP_FRAME *TrapFrame
00590     )
00591 
00592 {
00593     
if (Register == 0) {
00594         FLOAT128 
t = {0ULL,0ULL};
00595         
return t;
00596     } 
else if (Register == 1) {
00597         FLOAT128 
t = {0x8000000000000000ULL,0x000000000000FFFFULL}; 
00598         
return t;
00599     } 
else if (Register <= 5) {
00600         Register -= 2;
00601         
return ( *(&ExceptionFrame->FltS0 + Register) );
00602     } 
else if (Register <= 15) {
00603         Register -= 6;
00604         
return ( *(&TrapFrame->FltT0 + Register) );
00605     } 
else if (Register <= 31) {
00606         Register -= 16;
00607         
return ( *(&ExceptionFrame->FltS4 + Register) );
00608     } 
else {
00609         PKHIGHER_FP_VOLATILE HigherVolatile;
00610 
00611         HigherVolatile = GET_HIGH_FLOATING_POINT_REGISTER_SAVEAREA();
00612         Register -= 32;
00613         
return ( *(&HigherVolatile->FltF32 + Register) );
00614     }
00615 }
00616 
00617 
00618 
VOID
00619 KiSetFloatRegisterValue (
00620     IN ULONG Register,
00621     IN FLOAT128 Value,
00622     OUT 
struct _KEXCEPTION_FRAME *ExceptionFrame,
00623     OUT 
struct _KTRAP_FRAME *TrapFrame
00624     )
00625 
00626 {
00627     
if (Register <= 1) {
00628         
return;
00629     } 
else if (Register <= 5) {
00630         Register -= 2;
00631         *(&ExceptionFrame->FltS0 + Register) = Value;
00632         
return;
00633     } 
else if (Register <= 15) {
00634         Register -= 6;
00635         *(&TrapFrame->FltT0 + Register) = Value;
00636         
return;
00637     } 
else if (Register <= 31) {
00638         Register -= 16;
00639         *(&ExceptionFrame->FltS4 + Register) = Value;
00640         
return;
00641     } 
else {
00642         PKHIGHER_FP_VOLATILE HigherVolatile;
00643 
00644         HigherVolatile = GET_HIGH_FLOATING_POINT_REGISTER_SAVEAREA();
00645         Register -= 32;
00646         *(&HigherVolatile->FltF32 + Register) = Value;
00647         
return;
00648     }
00649 }
00650 
00651 
VOID
00652 __cdecl
00653 KeSaveStateForHibernate(
00654     IN PKPROCESSOR_STATE ProcessorState
00655     )
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 
00665 
00666 
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674 {
00675     
00676     
00677     
00678     
00679     
00680 }
00681 
00682 
00683 FLOAT128
00684 get_fp_register (
00685     IN ULONG Register,
00686     IN PVOID FpState
00687     )
00688 {
00689     
return(
KiGetFloatRegisterValue (
00690                Register, 
00691                ((
PFLOATING_POINT_STATE)FpState)->ExceptionFrame,
00692                ((
PFLOATING_POINT_STATE)FpState)->TrapFrame
00693                ));
00694 }
00695 
00696 
VOID
00697 set_fp_register (
00698     IN ULONG Register,
00699     IN FLOAT128 Value,
00700     IN PVOID FpState
00701     )
00702 {
00703     
KiSetFloatRegisterValue (
00704         Register, 
00705         Value,
00706         ((
PFLOATING_POINT_STATE)FpState)->ExceptionFrame,
00707         ((
PFLOATING_POINT_STATE)FpState)->TrapFrame
00708         );
00709 }