Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

getsetrg.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1991 Microsoft Corporation 00004 00005 Module Name: 00006 00007 getsetrg.c 00008 00009 Abstract: 00010 00011 This module implement the code necessary to get and set register values. 00012 These routines are used during the emulation of unaligned data references 00013 and floating point exceptions. 00014 00015 Author: 00016 00017 David N. Cutler (davec) 17-Jun-1991 00018 00019 Environment: 00020 00021 Kernel mode only. 00022 00023 Revision History: 00024 00025 --*/ 00026 00027 #include "ki.h" 00028 00029 ULONG 00030 KiGetRegisterValue ( 00031 IN ULONG Register, 00032 IN PKEXCEPTION_FRAME ExceptionFrame, 00033 IN PKTRAP_FRAME TrapFrame 00034 ) 00035 00036 /*++ 00037 00038 Routine Description: 00039 00040 This function is called to get the 32-bit value of a register from the 00041 specified exception or trap frame. 00042 00043 Arguments: 00044 00045 Register - Supplies the number of the register whose value is to be 00046 returned. Integer registers are specified as 0 - 31 and floating 00047 registers are specified as 32 - 63. 00048 00049 ExceptionFrame - Supplies a pointer to an exception frame. 00050 00051 TrapFrame - Supplies a pointer to a trap frame. 00052 00053 Return Value: 00054 00055 The value of the specified register is returned as the function value. 00056 00057 --*/ 00058 00059 { 00060 00061 // 00062 // Dispatch on the register number. 00063 // 00064 00065 if (Register == 0) { 00066 return 0; 00067 00068 } else if (Register < 32) { 00069 return (ULONG)(&TrapFrame->XIntZero)[Register]; 00070 00071 } else { 00072 switch (Register) { 00073 00074 // 00075 // Floating register F0. 00076 // 00077 00078 case 32: 00079 return TrapFrame->FltF0; 00080 00081 // 00082 // Floating register F1. 00083 // 00084 00085 case 33: 00086 return TrapFrame->FltF1; 00087 00088 // 00089 // Floating register F2. 00090 // 00091 00092 case 34: 00093 return TrapFrame->FltF2; 00094 00095 // 00096 // Floating register F3. 00097 // 00098 00099 case 35: 00100 return TrapFrame->FltF3; 00101 00102 // 00103 // Floating register F4. 00104 // 00105 00106 case 36: 00107 return TrapFrame->FltF4; 00108 00109 // 00110 // Floating register F5. 00111 // 00112 00113 case 37: 00114 return TrapFrame->FltF5; 00115 00116 // 00117 // Floating register F6. 00118 // 00119 00120 case 38: 00121 return TrapFrame->FltF6; 00122 00123 // 00124 // Floating register F7. 00125 // 00126 00127 case 39: 00128 return TrapFrame->FltF7; 00129 00130 // 00131 // Floating register F8. 00132 // 00133 00134 case 40: 00135 return TrapFrame->FltF8; 00136 00137 // 00138 // Floating register F9. 00139 // 00140 00141 case 41: 00142 return TrapFrame->FltF9; 00143 00144 // 00145 // Floating register F10. 00146 // 00147 00148 case 42: 00149 return TrapFrame->FltF10; 00150 00151 // 00152 // Floating register F11. 00153 // 00154 00155 case 43: 00156 return TrapFrame->FltF11; 00157 00158 // 00159 // Floating register F12. 00160 // 00161 00162 case 44: 00163 return TrapFrame->FltF12; 00164 00165 // 00166 // Floating register F13. 00167 // 00168 00169 case 45: 00170 return TrapFrame->FltF13; 00171 00172 // 00173 // Floating register F14. 00174 // 00175 00176 case 46: 00177 return TrapFrame->FltF14; 00178 00179 // 00180 // Floating register F15. 00181 // 00182 00183 case 47: 00184 return TrapFrame->FltF15; 00185 00186 // 00187 // Floating register F16. 00188 // 00189 00190 case 48: 00191 return TrapFrame->FltF16; 00192 00193 // 00194 // Floating register F17. 00195 // 00196 00197 case 49: 00198 return TrapFrame->FltF17; 00199 00200 // 00201 // Floating register F18. 00202 // 00203 00204 case 50: 00205 return TrapFrame->FltF18; 00206 00207 // 00208 // Floating register F19. 00209 // 00210 00211 case 51: 00212 return TrapFrame->FltF19; 00213 00214 // 00215 // Floating register F20. 00216 // 00217 00218 case 52: 00219 return ExceptionFrame->FltF20; 00220 00221 // 00222 // Floating register F21. 00223 // 00224 00225 case 53: 00226 return ExceptionFrame->FltF21; 00227 00228 // 00229 // Floating register F22. 00230 // 00231 00232 case 54: 00233 return ExceptionFrame->FltF22; 00234 00235 // 00236 // Floating register F23. 00237 // 00238 00239 case 55: 00240 return ExceptionFrame->FltF23; 00241 00242 // 00243 // Floating register F24. 00244 // 00245 00246 case 56: 00247 return ExceptionFrame->FltF24; 00248 00249 // 00250 // Floating register F25. 00251 // 00252 00253 case 57: 00254 return ExceptionFrame->FltF25; 00255 00256 // 00257 // Floating register F26. 00258 // 00259 00260 case 58: 00261 return ExceptionFrame->FltF26; 00262 00263 // 00264 // Floating register F27. 00265 // 00266 00267 case 59: 00268 return ExceptionFrame->FltF27; 00269 00270 // 00271 // Floating register F28. 00272 // 00273 00274 case 60: 00275 return ExceptionFrame->FltF28; 00276 00277 // 00278 // Floating register F29. 00279 // 00280 00281 case 61: 00282 return ExceptionFrame->FltF29; 00283 00284 // 00285 // Floating register F30. 00286 // 00287 00288 case 62: 00289 return ExceptionFrame->FltF30; 00290 00291 // 00292 // Floating register F31. 00293 // 00294 00295 case 63: 00296 return ExceptionFrame->FltF31; 00297 } 00298 } 00299 } 00300 00301 ULONGLONG 00302 KiGetRegisterValue64 ( 00303 IN ULONG Register, 00304 IN PKEXCEPTION_FRAME ExceptionFrame, 00305 IN PKTRAP_FRAME TrapFrame 00306 ) 00307 00308 /*++ 00309 00310 Routine Description: 00311 00312 This function is called to get the 64-bit value of a register from the 00313 specified exception or trap frame. 00314 00315 Arguments: 00316 00317 Register - Supplies the number of the register whose value is to be 00318 returned. Integer registers are specified as 0 - 31 and floating 00319 registers are specified as 32 - 63. 00320 00321 ExceptionFrame - Supplies a pointer to an exception frame. 00322 00323 TrapFrame - Supplies a pointer to a trap frame. 00324 00325 Return Value: 00326 00327 The value of the specified register is returned as the function value. 00328 00329 --*/ 00330 00331 { 00332 00333 // 00334 // Dispatch on the register number. 00335 // 00336 00337 if (Register == 0) { 00338 return 0; 00339 00340 } else if (Register < 32) { 00341 return (&TrapFrame->XIntZero)[Register]; 00342 00343 } else { 00344 switch (Register) { 00345 00346 // 00347 // Floating register F0. 00348 // 00349 00350 case 32: 00351 return TrapFrame->XFltF0; 00352 00353 // 00354 // Floating register F1. 00355 // 00356 00357 case 33: 00358 return TrapFrame->XFltF1; 00359 00360 // 00361 // Floating register F2. 00362 // 00363 00364 case 34: 00365 return TrapFrame->XFltF2; 00366 00367 // 00368 // Floating register F3. 00369 // 00370 00371 case 35: 00372 return TrapFrame->XFltF3; 00373 00374 // 00375 // Floating register F4. 00376 // 00377 00378 case 36: 00379 return TrapFrame->XFltF4; 00380 00381 // 00382 // Floating register F5. 00383 // 00384 00385 case 37: 00386 return TrapFrame->XFltF5; 00387 00388 // 00389 // Floating register F6. 00390 // 00391 00392 case 38: 00393 return TrapFrame->XFltF6; 00394 00395 // 00396 // Floating register F7. 00397 // 00398 00399 case 39: 00400 return TrapFrame->XFltF7; 00401 00402 // 00403 // Floating register F8. 00404 // 00405 00406 case 40: 00407 return TrapFrame->XFltF8; 00408 00409 // 00410 // Floating register F9. 00411 // 00412 00413 case 41: 00414 return TrapFrame->XFltF9; 00415 00416 // 00417 // Floating register F10. 00418 // 00419 00420 case 42: 00421 return TrapFrame->XFltF10; 00422 00423 // 00424 // Floating register F11. 00425 // 00426 00427 case 43: 00428 return TrapFrame->XFltF11; 00429 00430 // 00431 // Floating register F12. 00432 // 00433 00434 case 44: 00435 return TrapFrame->XFltF12; 00436 00437 // 00438 // Floating register F13. 00439 // 00440 00441 case 45: 00442 return TrapFrame->XFltF13; 00443 00444 // 00445 // Floating register F14. 00446 // 00447 00448 case 46: 00449 return TrapFrame->XFltF14; 00450 00451 // 00452 // Floating register F15. 00453 // 00454 00455 case 47: 00456 return TrapFrame->XFltF15; 00457 00458 // 00459 // Floating register F16. 00460 // 00461 00462 case 48: 00463 return TrapFrame->XFltF16; 00464 00465 // 00466 // Floating register F17. 00467 // 00468 00469 case 49: 00470 return TrapFrame->XFltF17; 00471 00472 // 00473 // Floating register F18. 00474 // 00475 00476 case 50: 00477 return TrapFrame->XFltF18; 00478 00479 // 00480 // Floating register F19. 00481 // 00482 00483 case 51: 00484 return TrapFrame->XFltF19; 00485 00486 // 00487 // Floating register F20. 00488 // 00489 00490 case 52: 00491 return ExceptionFrame->XFltF20; 00492 00493 // 00494 // Floating register F21. 00495 // 00496 00497 case 53: 00498 return TrapFrame->XFltF21; 00499 00500 // 00501 // Floating register F22. 00502 // 00503 00504 case 54: 00505 return ExceptionFrame->XFltF22; 00506 00507 // 00508 // Floating register F23. 00509 // 00510 00511 case 55: 00512 return TrapFrame->XFltF23; 00513 00514 // 00515 // Floating register F24. 00516 // 00517 00518 case 56: 00519 return ExceptionFrame->XFltF24; 00520 00521 // 00522 // Floating register F25. 00523 // 00524 00525 case 57: 00526 return TrapFrame->XFltF25; 00527 00528 // 00529 // Floating register F26. 00530 // 00531 00532 case 58: 00533 return ExceptionFrame->XFltF26; 00534 00535 // 00536 // Floating register F27. 00537 // 00538 00539 case 59: 00540 return TrapFrame->XFltF27; 00541 00542 // 00543 // Floating register F28. 00544 // 00545 00546 case 60: 00547 return ExceptionFrame->XFltF28; 00548 00549 // 00550 // Floating register F29. 00551 // 00552 00553 case 61: 00554 return TrapFrame->XFltF29; 00555 00556 // 00557 // Floating register F30. 00558 // 00559 00560 case 62: 00561 return ExceptionFrame->XFltF30; 00562 00563 // 00564 // Floating register F31. 00565 // 00566 00567 case 63: 00568 return TrapFrame->XFltF31; 00569 } 00570 } 00571 } 00572 00573 VOID 00574 KiSetRegisterValue ( 00575 IN ULONG Register, 00576 IN ULONG Value, 00577 OUT PKEXCEPTION_FRAME ExceptionFrame, 00578 OUT PKTRAP_FRAME TrapFrame 00579 ) 00580 00581 /*++ 00582 00583 Routine Description: 00584 00585 This function is called to set the 32-bit value of a register in the 00586 specified exception or trap frame. 00587 00588 Arguments: 00589 00590 Register - Supplies the number of the register whose value is to be 00591 stored. Integer registers are specified as 0 - 31 and floating 00592 registers are specified as 32 - 63. 00593 00594 Value - Supplies the value to be stored in the specified register. 00595 00596 ExceptionFrame - Supplies a pointer to an exception frame. 00597 00598 TrapFrame - Supplies a pointer to a trap frame. 00599 00600 Return Value: 00601 00602 None. 00603 00604 --*/ 00605 00606 { 00607 00608 // 00609 // Dispatch on the register number. 00610 // 00611 00612 if (Register < 32) { 00613 (&TrapFrame->XIntZero)[Register] = (LONG)Value; 00614 00615 } else { 00616 switch (Register) { 00617 00618 // 00619 // Floating register F0. 00620 // 00621 00622 case 32: 00623 TrapFrame->FltF0 = Value; 00624 return; 00625 00626 // 00627 // Floating register F1. 00628 // 00629 00630 case 33: 00631 TrapFrame->FltF1 = Value; 00632 return; 00633 00634 // 00635 // Floating register F2. 00636 // 00637 00638 case 34: 00639 TrapFrame->FltF2 = Value; 00640 return; 00641 00642 // 00643 // Floating register F3. 00644 // 00645 00646 case 35: 00647 TrapFrame->FltF3 = Value; 00648 return; 00649 00650 // 00651 // Floating register F4. 00652 // 00653 00654 case 36: 00655 TrapFrame->FltF4 = Value; 00656 return; 00657 00658 // 00659 // Floating register F5. 00660 // 00661 00662 case 37: 00663 TrapFrame->FltF5 = Value; 00664 return; 00665 00666 // 00667 // Floating register F6. 00668 // 00669 00670 case 38: 00671 TrapFrame->FltF6 = Value; 00672 return; 00673 00674 // 00675 // Floating register F7. 00676 // 00677 00678 case 39: 00679 TrapFrame->FltF7 = Value; 00680 return; 00681 00682 // 00683 // Floating register F8. 00684 // 00685 00686 case 40: 00687 TrapFrame->FltF8 = Value; 00688 return; 00689 00690 // 00691 // Floating register F9. 00692 // 00693 00694 case 41: 00695 TrapFrame->FltF9 = Value; 00696 return; 00697 00698 // 00699 // Floating register F10. 00700 // 00701 00702 case 42: 00703 TrapFrame->FltF10 = Value; 00704 return; 00705 00706 // 00707 // Floating register F11. 00708 // 00709 00710 case 43: 00711 TrapFrame->FltF11 = Value; 00712 return; 00713 00714 // 00715 // Floating register F12. 00716 // 00717 00718 case 44: 00719 TrapFrame->FltF12 = Value; 00720 return; 00721 00722 // 00723 // Floating register F13. 00724 // 00725 00726 case 45: 00727 TrapFrame->FltF13 = Value; 00728 return; 00729 00730 // 00731 // Floating register F14. 00732 // 00733 00734 case 46: 00735 TrapFrame->FltF14 = Value; 00736 return; 00737 00738 // 00739 // Floating register F15. 00740 // 00741 00742 case 47: 00743 TrapFrame->FltF15 = Value; 00744 return; 00745 00746 // 00747 // Floating register F16. 00748 // 00749 00750 case 48: 00751 TrapFrame->FltF16 = Value; 00752 return; 00753 00754 // 00755 // Floating register F17. 00756 // 00757 00758 case 49: 00759 TrapFrame->FltF17 = Value; 00760 return; 00761 00762 // 00763 // Floating register F18. 00764 // 00765 00766 case 50: 00767 TrapFrame->FltF18 = Value; 00768 return; 00769 00770 // 00771 // Floating register F19. 00772 // 00773 00774 case 51: 00775 TrapFrame->FltF19 = Value; 00776 return; 00777 00778 // 00779 // Floating register F20. 00780 // 00781 00782 case 52: 00783 ExceptionFrame->FltF20 = Value; 00784 return; 00785 00786 // 00787 // Floating register F21. 00788 // 00789 00790 case 53: 00791 ExceptionFrame->FltF21 = Value; 00792 return; 00793 00794 // 00795 // Floating register F22. 00796 // 00797 00798 case 54: 00799 ExceptionFrame->FltF22 = Value; 00800 return; 00801 00802 // 00803 // Floating register F23. 00804 // 00805 00806 case 55: 00807 ExceptionFrame->FltF23 = Value; 00808 return; 00809 00810 // 00811 // Floating register F24. 00812 // 00813 00814 case 56: 00815 ExceptionFrame->FltF24 = Value; 00816 return; 00817 00818 // 00819 // Floating register F25. 00820 // 00821 00822 case 57: 00823 ExceptionFrame->FltF25 = Value; 00824 return; 00825 00826 // 00827 // Floating register F26. 00828 // 00829 00830 case 58: 00831 ExceptionFrame->FltF26 = Value; 00832 return; 00833 00834 // 00835 // Floating register F27. 00836 // 00837 00838 case 59: 00839 ExceptionFrame->FltF27 = Value; 00840 return; 00841 00842 // 00843 // Floating register F28. 00844 // 00845 00846 case 60: 00847 ExceptionFrame->FltF28 = Value; 00848 return; 00849 00850 // 00851 // Floating register F29. 00852 // 00853 00854 case 61: 00855 ExceptionFrame->FltF29 = Value; 00856 return; 00857 00858 // 00859 // Floating register F30. 00860 // 00861 00862 case 62: 00863 ExceptionFrame->FltF30 = Value; 00864 return; 00865 00866 // 00867 // Floating register F31. 00868 // 00869 00870 case 63: 00871 ExceptionFrame->FltF31 = Value; 00872 return; 00873 } 00874 } 00875 } 00876 00877 VOID 00878 KiSetRegisterValue64 ( 00879 IN ULONG Register, 00880 IN ULONGLONG Value, 00881 OUT PKEXCEPTION_FRAME ExceptionFrame, 00882 OUT PKTRAP_FRAME TrapFrame 00883 ) 00884 00885 /*++ 00886 00887 Routine Description: 00888 00889 This function is called to set the 64-bit value of a register in the 00890 specified exception or trap frame. 00891 00892 Arguments: 00893 00894 Register - Supplies the number of the register whose value is to be 00895 stored. Integer registers are specified as 0 - 31 and floating 00896 registers are specified as 32 - 63. 00897 00898 Value - Supplies the value to be stored in the specified register. 00899 00900 ExceptionFrame - Supplies a pointer to an exception frame. 00901 00902 TrapFrame - Supplies a pointer to a trap frame. 00903 00904 Return Value: 00905 00906 None. 00907 00908 --*/ 00909 00910 { 00911 00912 // 00913 // Dispatch on the register number. 00914 // 00915 00916 if (Register < 32) { 00917 (&TrapFrame->XIntZero)[Register] = Value; 00918 00919 } else { 00920 switch (Register) { 00921 00922 // 00923 // Floating register F0. 00924 // 00925 00926 case 32: 00927 TrapFrame->XFltF0 = Value; 00928 return; 00929 00930 // 00931 // Floating register F1. 00932 // 00933 00934 case 33: 00935 TrapFrame->XFltF1 = Value; 00936 return; 00937 00938 // 00939 // Floating register F2. 00940 // 00941 00942 case 34: 00943 TrapFrame->XFltF2 = Value; 00944 return; 00945 00946 // 00947 // Floating register F3. 00948 // 00949 00950 case 35: 00951 TrapFrame->XFltF3 = Value; 00952 return; 00953 00954 // 00955 // Floating register F4. 00956 // 00957 00958 case 36: 00959 TrapFrame->XFltF4 = Value; 00960 return; 00961 00962 // 00963 // Floating register F5. 00964 // 00965 00966 case 37: 00967 TrapFrame->XFltF5 = Value; 00968 return; 00969 00970 // 00971 // Floating register F6. 00972 // 00973 00974 case 38: 00975 TrapFrame->XFltF6 = Value; 00976 return; 00977 00978 // 00979 // Floating register F7. 00980 // 00981 00982 case 39: 00983 TrapFrame->XFltF7 = Value; 00984 return; 00985 00986 // 00987 // Floating register F8. 00988 // 00989 00990 case 40: 00991 TrapFrame->XFltF8 = Value; 00992 return; 00993 00994 // 00995 // Floating register F9. 00996 // 00997 00998 case 41: 00999 TrapFrame->XFltF9 = Value; 01000 return; 01001 01002 // 01003 // Floating register F10. 01004 // 01005 01006 case 42: 01007 TrapFrame->XFltF10 = Value; 01008 return; 01009 01010 // 01011 // Floating register F11. 01012 // 01013 01014 case 43: 01015 TrapFrame->XFltF11 = Value; 01016 return; 01017 01018 // 01019 // Floating register F12. 01020 // 01021 01022 case 44: 01023 TrapFrame->XFltF12 = Value; 01024 return; 01025 01026 // 01027 // Floating register F13. 01028 // 01029 01030 case 45: 01031 TrapFrame->XFltF13 = Value; 01032 return; 01033 01034 // 01035 // Floating register F14. 01036 // 01037 01038 case 46: 01039 TrapFrame->XFltF14 = Value; 01040 return; 01041 01042 // 01043 // Floating register F15. 01044 // 01045 01046 case 47: 01047 TrapFrame->XFltF15 = Value; 01048 return; 01049 01050 // 01051 // Floating register F16. 01052 // 01053 01054 case 48: 01055 TrapFrame->XFltF16 = Value; 01056 return; 01057 01058 // 01059 // Floating register F17. 01060 // 01061 01062 case 49: 01063 TrapFrame->XFltF17 = Value; 01064 return; 01065 01066 // 01067 // Floating register F18. 01068 // 01069 01070 case 50: 01071 TrapFrame->XFltF18 = Value; 01072 return; 01073 01074 // 01075 // Floating register F19. 01076 // 01077 01078 case 51: 01079 TrapFrame->XFltF19 = Value; 01080 return; 01081 01082 // 01083 // Floating register F20. 01084 // 01085 01086 case 52: 01087 ExceptionFrame->XFltF20 = Value; 01088 return; 01089 01090 // 01091 // Floating register F21. 01092 // 01093 01094 case 53: 01095 TrapFrame->XFltF21 = Value; 01096 return; 01097 01098 // 01099 // Floating register F22. 01100 // 01101 01102 case 54: 01103 ExceptionFrame->XFltF22 = Value; 01104 return; 01105 01106 // 01107 // Floating register F23. 01108 // 01109 01110 case 55: 01111 TrapFrame->XFltF23 = Value; 01112 return; 01113 01114 // 01115 // Floating register F24. 01116 // 01117 01118 case 56: 01119 ExceptionFrame->XFltF24 = Value; 01120 return; 01121 01122 // 01123 // Floating register F25. 01124 // 01125 01126 case 57: 01127 TrapFrame->XFltF25 = Value; 01128 return; 01129 01130 // 01131 // Floating register F26. 01132 // 01133 01134 case 58: 01135 ExceptionFrame->XFltF26 = Value; 01136 return; 01137 01138 // 01139 // Floating register F27. 01140 // 01141 01142 case 59: 01143 TrapFrame->XFltF27 = Value; 01144 return; 01145 01146 // 01147 // Floating register F28. 01148 // 01149 01150 case 60: 01151 ExceptionFrame->XFltF28 = Value; 01152 return; 01153 01154 // 01155 // Floating register F29. 01156 // 01157 01158 case 61: 01159 TrapFrame->XFltF29 = Value; 01160 return; 01161 01162 // 01163 // Floating register F30. 01164 // 01165 01166 case 62: 01167 ExceptionFrame->XFltF30 = Value; 01168 return; 01169 01170 // 01171 // Floating register F31. 01172 // 01173 01174 case 63: 01175 TrapFrame->XFltF31 = Value; 01176 return; 01177 } 01178 } 01179 }

Generated on Sat May 15 19:40:13 2004 for test by doxygen 1.3.7