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

xxflshtb.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1992-1994 Microsoft Corporation 00004 00005 Module Name: 00006 00007 xxflshtb.c 00008 00009 Abstract: 00010 00011 This module implements machine dependent functions to flush the 00012 translation buffer. 00013 00014 Author: 00015 00016 David N. Cutler (davec) 13-May-1989 00017 00018 Environment: 00019 00020 Kernel mode only. 00021 00022 Revision History: 00023 00024 00025 --*/ 00026 00027 #include "ki.h" 00028 00029 // 00030 // Define forward referenced prototypes. 00031 // 00032 00033 VOID 00034 KiFlushEntireTbTarget ( 00035 IN PULONG SignalDone, 00036 IN PVOID Parameter1, 00037 IN PVOID Parameter2, 00038 IN PVOID Parameter3 00039 ); 00040 00041 VOID 00042 KiFlushMultipleTbTarget ( 00043 IN PULONG SignalDone, 00044 IN PVOID Number, 00045 IN PVOID Virtual, 00046 IN PVOID Pid 00047 ); 00048 00049 VOID 00050 KiFlushSingleTbTarget ( 00051 IN PULONG SignalDone, 00052 IN PVOID Virtual, 00053 IN PVOID Pid, 00054 IN PVOID Parameter3 00055 ); 00056 00057 VOID 00058 KiFlushMultipleTbTarget64 ( 00059 IN PULONG SignalDone, 00060 IN PVOID Number, 00061 IN PVOID Virtual, 00062 IN PVOID Pid 00063 ); 00064 00065 VOID 00066 KiFlushSingleTbTarget64 ( 00067 IN PULONG SignalDone, 00068 IN PVOID Virtual, 00069 IN PVOID Pid, 00070 IN PVOID Parameter3 00071 ); 00072 00073 VOID 00074 KeFlushEntireTb ( 00075 IN BOOLEAN Invalid, 00076 IN BOOLEAN AllProcessors 00077 ) 00078 00079 /*++ 00080 00081 Routine Description: 00082 00083 This function flushes the entire translation buffer (TB) on all 00084 processors that are currently running threads which are children 00085 of the current process or flushes the entire translation buffer 00086 on all processors in the host configuration. 00087 00088 Arguments: 00089 00090 Invalid - Supplies a boolean value that specifies the reason for 00091 flushing the translation buffer. 00092 00093 AllProcessors - Supplies a boolean value that determines which 00094 translation buffers are to be flushed. 00095 00096 Return Value: 00097 00098 None. 00099 00100 --*/ 00101 00102 { 00103 00104 KIRQL OldIrql; 00105 PKPROCESS Process; 00106 KAFFINITY TargetProcessors; 00107 PKTHREAD Thread; 00108 00109 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); 00110 00111 // 00112 // Compute the target set of processors, disable context switching, 00113 // and send the flush entire parameters to the target processors, 00114 // if any, for execution. 00115 // 00116 00117 #if defined(NT_UP) 00118 00119 OldIrql = KeRaiseIrqlToSynchLevel(); 00120 00121 #else 00122 00123 if (AllProcessors != FALSE) { 00124 OldIrql = KeRaiseIrqlToSynchLevel(); 00125 TargetProcessors = KeActiveProcessors; 00126 00127 } else { 00128 Thread = KeGetCurrentThread(); 00129 Process = Thread->ApcState.Process; 00130 KiLockContextSwap(&OldIrql); 00131 TargetProcessors = Process->ActiveProcessors; 00132 } 00133 00134 TargetProcessors &= PCR->NotMember; 00135 if (TargetProcessors != 0) { 00136 KiIpiSendPacket(TargetProcessors, 00137 KiFlushEntireTbTarget, 00138 NULL, 00139 NULL, 00140 NULL); 00141 } 00142 00143 #endif 00144 00145 // 00146 // Flush TB on current processor. 00147 // 00148 00149 KeFlushCurrentTb(); 00150 00151 // 00152 // Wait until all target processors have finished. 00153 // 00154 00155 #if defined(NT_UP) 00156 00157 KeLowerIrql(OldIrql); 00158 00159 #else 00160 00161 if (TargetProcessors != 0) { 00162 KiIpiStallOnPacketTargets(); 00163 } 00164 00165 if (AllProcessors != FALSE) { 00166 KeLowerIrql(OldIrql); 00167 00168 } else { 00169 KiUnlockContextSwap(OldIrql); 00170 } 00171 00172 #endif 00173 00174 return; 00175 } 00176 00177 #if !defined(NT_UP) 00178 00179 00180 VOID 00181 KiFlushEntireTbTarget ( 00182 IN PULONG SignalDone, 00183 IN PVOID Parameter1, 00184 IN PVOID Parameter2, 00185 IN PVOID Parameter3 00186 ) 00187 00188 /*++ 00189 00190 Routine Description: 00191 00192 This is the target function for flushing the entire TB. 00193 00194 Arguments: 00195 00196 SignalDone Supplies a pointer to a variable that is cleared when the 00197 requested operation has been performed. 00198 00199 Parameter1 - Parameter3 - Not used. 00200 00201 Return Value: 00202 00203 None. 00204 00205 --*/ 00206 00207 { 00208 00209 // 00210 // Flush the entire TB on the current processor. 00211 // 00212 00213 KiIpiSignalPacketDone(SignalDone); 00214 KeFlushCurrentTb(); 00215 return; 00216 } 00217 00218 #endif 00219 00220 00221 VOID 00222 KeFlushMultipleTb ( 00223 IN ULONG Number, 00224 IN PVOID *Virtual, 00225 IN BOOLEAN Invalid, 00226 IN BOOLEAN AllProcessors, 00227 IN PHARDWARE_PTE *PtePointer OPTIONAL, 00228 IN HARDWARE_PTE PteValue 00229 ) 00230 00231 /*++ 00232 00233 Routine Description: 00234 00235 This function flushes multiple entries from the translation buffer 00236 on all processors that are currently running threads which are 00237 children of the current process or flushes a multiple entries from 00238 the translation buffer on all processors in the host configuration. 00239 00240 Arguments: 00241 00242 Number - Supplies the number of TB entries to flush. 00243 00244 Virtual - Supplies a pointer to an array of virtual addresses that 00245 are within the pages whose translation buffer entries are to be 00246 flushed. 00247 00248 Invalid - Supplies a boolean value that specifies the reason for 00249 flushing the translation buffer. 00250 00251 AllProcessors - Supplies a boolean value that determines which 00252 translation buffers are to be flushed. 00253 00254 PtePointer - Supplies an optional pointer to an array of pointers to 00255 page table entries that receive the specified page table entry 00256 value. 00257 00258 PteValue - Supplies the the new page table entry value. 00259 00260 Return Value: 00261 00262 The previous contents of the specified page table entry is returned 00263 as the function value. 00264 00265 --*/ 00266 00267 { 00268 00269 ULONG Index; 00270 KIRQL OldIrql; 00271 PKPROCESS Process; 00272 KAFFINITY TargetProcessors; 00273 PKTHREAD Thread; 00274 00275 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); 00276 ASSERT(Number <= FLUSH_MULTIPLE_MAXIMUM); 00277 00278 // 00279 // Compute the target set of processors. 00280 // 00281 00282 #if !defined(NT_UP) 00283 00284 if (AllProcessors != FALSE) { 00285 OldIrql = KeRaiseIrqlToSynchLevel(); 00286 TargetProcessors = KeActiveProcessors; 00287 00288 } else { 00289 Thread = KeGetCurrentThread(); 00290 Process = Thread->ApcState.Process; 00291 KiLockContextSwap(&OldIrql); 00292 TargetProcessors = Process->ActiveProcessors; 00293 } 00294 00295 TargetProcessors &= PCR->NotMember; 00296 00297 #endif 00298 00299 // 00300 // If a page table entry address array is specified, then set the 00301 // specified page table entries to the specific value. 00302 // 00303 00304 if (ARGUMENT_PRESENT(PtePointer)) { 00305 for (Index = 0; Index < Number; Index += 1) { 00306 *PtePointer[Index] = PteValue; 00307 } 00308 } 00309 00310 // 00311 // If any target processors are specified, then send a flush multiple 00312 // packet to the target set of processor. 00313 // 00314 00315 #if !defined(NT_UP) 00316 00317 if (TargetProcessors != 0) { 00318 KiIpiSendPacket(TargetProcessors, 00319 KiFlushMultipleTbTarget, 00320 (PVOID)Number, 00321 (PVOID)Virtual, 00322 NULL); 00323 } 00324 00325 #endif 00326 00327 // 00328 // Flush the specified entries from the TB on the current processor. 00329 // 00330 00331 KiFlushMultipleTb(Invalid, &Virtual[0], Number); 00332 00333 // 00334 // Wait until all target processors have finished. 00335 // 00336 00337 #if !defined(NT_UP) 00338 00339 if (TargetProcessors != 0) { 00340 KiIpiStallOnPacketTargets(); 00341 } 00342 00343 if (AllProcessors != FALSE) { 00344 KeLowerIrql(OldIrql); 00345 00346 } else { 00347 KiUnlockContextSwap(OldIrql); 00348 } 00349 00350 #endif 00351 00352 return; 00353 } 00354 00355 #if !defined(NT_UP) 00356 00357 00358 VOID 00359 KiFlushMultipleTbTarget ( 00360 IN PULONG SignalDone, 00361 IN PVOID Number, 00362 IN PVOID Virtual, 00363 IN PVOID Pid 00364 ) 00365 00366 /*++ 00367 00368 Routine Description: 00369 00370 This is the target function for flushing multiple TB entries. 00371 00372 Arguments: 00373 00374 SignalDone Supplies a pointer to a variable that is cleared when the 00375 requested operation has been performed. 00376 00377 Number - Supplies the number of TB entries to flush. 00378 00379 Virtual - Supplies a pointer to an array of virtual addresses that 00380 are within the pages whose translation buffer entries are to be 00381 flushed. 00382 00383 Pid - Supplies the PID of the TB entries to flush. 00384 00385 Return Value: 00386 00387 None. 00388 00389 --*/ 00390 00391 { 00392 00393 ULONG Index; 00394 PVOID Array[FLUSH_MULTIPLE_MAXIMUM]; 00395 00396 ASSERT((ULONG)Number <= FLUSH_MULTIPLE_MAXIMUM); 00397 00398 // 00399 // Capture the virtual addresses that are to be flushed from the TB 00400 // on the current processor and clear the packet address. 00401 // 00402 00403 for (Index = 0; Index < (ULONG)Number; Index += 1) { 00404 Array[Index] = ((PVOID *)(Virtual))[Index]; 00405 } 00406 00407 KiIpiSignalPacketDone(SignalDone); 00408 00409 // 00410 // Flush the specified virtual addresses from the TB on the current 00411 // processor. 00412 // 00413 00414 KiFlushMultipleTb(TRUE, &Array[0], (ULONG)Number); 00415 return; 00416 } 00417 00418 #endif 00419 00420 00421 VOID 00422 KeFlushMultipleTb64 ( 00423 IN ULONG Number, 00424 IN PULONG *Virtual, 00425 IN BOOLEAN Invalid, 00426 IN BOOLEAN AllProcessors, 00427 IN PHARDWARE_PTE *PtePointer OPTIONAL, 00428 IN HARDWARE_PTE PteValue 00429 ) 00430 00431 /*++ 00432 00433 Routine Description: 00434 00435 This function flushes multiple entries from the translation buffer 00436 on all processors that are currently running threads which are 00437 children of the current process or flushes a multiple entries from 00438 the translation buffer on all processors in the host configuration. 00439 00440 Arguments: 00441 00442 Number - Supplies the number of TB entries to flush. 00443 00444 Virtual - Supplies a pointer to an array of virtual page numbers that 00445 are flushed from the TB. 00446 00447 Invalid - Supplies a boolean value that specifies the reason for 00448 flushing the translation buffer. 00449 00450 AllProcessors - Supplies a boolean value that determines which 00451 translation buffers are to be flushed. 00452 00453 PtePointer - Supplies an optional pointer to an array of pointers to 00454 page table entries that receive the specified page table entry 00455 value. 00456 00457 PteValue - Supplies the the new page table entry value. 00458 00459 Return Value: 00460 00461 The previous contents of the specified page table entry is returned 00462 as the function value. 00463 00464 --*/ 00465 00466 { 00467 00468 ULONG Index; 00469 KIRQL OldIrql; 00470 PKPROCESS Process; 00471 KAFFINITY TargetProcessors; 00472 PKTHREAD Thread; 00473 00474 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); 00475 ASSERT(Number <= FLUSH_MULTIPLE_MAXIMUM); 00476 00477 // 00478 // Compute the target set of processors. 00479 // 00480 00481 #if !defined(NT_UP) 00482 00483 if (AllProcessors != FALSE) { 00484 OldIrql = KeRaiseIrqlToSynchLevel(); 00485 TargetProcessors = KeActiveProcessors; 00486 00487 } else { 00488 Thread = KeGetCurrentThread(); 00489 Process = Thread->ApcState.Process; 00490 KiLockContextSwap(&OldIrql); 00491 TargetProcessors = Process->ActiveProcessors; 00492 } 00493 00494 TargetProcessors &= PCR->NotMember; 00495 00496 #endif 00497 00498 // 00499 // If a page table entry address array is specified, then set the 00500 // specified page table entries to the specific value. 00501 // 00502 00503 if (ARGUMENT_PRESENT(PtePointer)) { 00504 for (Index = 0; Index < Number; Index += 1) { 00505 *PtePointer[Index] = PteValue; 00506 } 00507 } 00508 00509 // 00510 // If any target processors are specified, then send a flush multiple 00511 // packet to the target set of processor. 00512 // 00513 00514 #if !defined(NT_UP) 00515 00516 if (TargetProcessors != 0) { 00517 KiIpiSendPacket(TargetProcessors, 00518 KiFlushMultipleTbTarget64, 00519 (PVOID)Number, 00520 (PVOID)Virtual, 00521 NULL); 00522 } 00523 00524 #endif 00525 00526 // 00527 // Flush the specified entries from the TB on the current processor. 00528 // 00529 00530 KiFlushMultipleTb64(Invalid, &Virtual[0], Number); 00531 00532 // 00533 // Wait until all target processors have finished. 00534 // 00535 00536 #if !defined(NT_UP) 00537 00538 if (TargetProcessors != 0) { 00539 KiIpiStallOnPacketTargets(); 00540 } 00541 00542 if (AllProcessors != FALSE) { 00543 KeLowerIrql(OldIrql); 00544 00545 } else { 00546 KiUnlockContextSwap(OldIrql); 00547 } 00548 00549 #endif 00550 00551 return; 00552 } 00553 00554 #if !defined(NT_UP) 00555 00556 00557 VOID 00558 KiFlushMultipleTbTarget64 ( 00559 IN PULONG SignalDone, 00560 IN PVOID Number, 00561 IN PVOID Virtual, 00562 IN PVOID Pid 00563 ) 00564 00565 /*++ 00566 00567 Routine Description: 00568 00569 This is the target function for flushing multiple TB entries. 00570 00571 Arguments: 00572 00573 SignalDone Supplies a pointer to a variable that is cleared when the 00574 requested operation has been performed. 00575 00576 Number - Supplies the number of TB entries to flush. 00577 00578 Virtual - Supplies a pointer to an array of virtual page numbers that 00579 are flushed from the TB. 00580 00581 Pid - Supplies the PID of the TB entries to flush. 00582 00583 Return Value: 00584 00585 None. 00586 00587 --*/ 00588 00589 { 00590 00591 ULONG Index; 00592 PULONG Array[FLUSH_MULTIPLE_MAXIMUM]; 00593 00594 ASSERT((ULONG)Number <= FLUSH_MULTIPLE_MAXIMUM); 00595 00596 // 00597 // Capture the virtual addresses that are to be flushed from the TB 00598 // on the current processor and clear the packet address. 00599 // 00600 00601 for (Index = 0; Index < (ULONG)Number; Index += 1) { 00602 Array[Index] = ((PULONG *)(Virtual))[Index]; 00603 } 00604 00605 KiIpiSignalPacketDone(SignalDone); 00606 00607 // 00608 // Flush the specified virtual addresses from the TB on the current 00609 // processor. 00610 // 00611 00612 KiFlushMultipleTb64(TRUE, &Array[0], (ULONG)Number); 00613 return; 00614 } 00615 00616 #endif 00617 00618 00619 HARDWARE_PTE 00620 KeFlushSingleTb ( 00621 IN PVOID Virtual, 00622 IN BOOLEAN Invalid, 00623 IN BOOLEAN AllProcessors, 00624 IN PHARDWARE_PTE PtePointer, 00625 IN HARDWARE_PTE PteValue 00626 ) 00627 00628 /*++ 00629 00630 Routine Description: 00631 00632 This function flushes a single entry from the translation buffer 00633 on all processors that are currently running threads which are 00634 children of the current process or flushes a single entry from 00635 the translation buffer on all processors in the host configuration. 00636 00637 Arguments: 00638 00639 Virtual - Supplies a virtual address that is within the page whose 00640 translation buffer entry is to be flushed. 00641 00642 Invalid - Supplies a boolean value that specifies the reason for 00643 flushing the translation buffer. 00644 00645 AllProcessors - Supplies a boolean value that determines which 00646 translation buffers are to be flushed. 00647 00648 PtePointer - Supplies a pointer to the page table entry which 00649 receives the specified value. 00650 00651 PteValue - Supplies the the new page table entry value. 00652 00653 Return Value: 00654 00655 The previous contents of the specified page table entry is returned 00656 as the function value. 00657 00658 --*/ 00659 00660 { 00661 00662 KIRQL OldIrql; 00663 HARDWARE_PTE OldPte; 00664 PKPROCESS Process; 00665 KAFFINITY TargetProcessors; 00666 PKTHREAD Thread; 00667 00668 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); 00669 00670 // 00671 // Compute the target set of processors. 00672 // 00673 00674 #if !defined(NT_UP) 00675 00676 if (AllProcessors != FALSE) { 00677 OldIrql = KeRaiseIrqlToSynchLevel(); 00678 TargetProcessors = KeActiveProcessors; 00679 00680 } else { 00681 Thread = KeGetCurrentThread(); 00682 Process = Thread->ApcState.Process; 00683 KiLockContextSwap(&OldIrql); 00684 TargetProcessors = Process->ActiveProcessors; 00685 } 00686 00687 TargetProcessors &= PCR->NotMember; 00688 00689 #endif 00690 00691 // 00692 // Capture the previous contents of the page table entry and set the 00693 // page table entry to the new value. 00694 // 00695 00696 OldPte = *PtePointer; 00697 *PtePointer = PteValue; 00698 00699 // 00700 // If any target processors are specified, then send a flush single 00701 // packet to the target set of processors. 00702 00703 #if !defined(NT_UP) 00704 00705 if (TargetProcessors != 0) { 00706 KiIpiSendPacket(TargetProcessors, 00707 KiFlushSingleTbTarget, 00708 (PVOID)Virtual, 00709 NULL, 00710 NULL); 00711 } 00712 00713 #endif 00714 00715 // 00716 // Flush the specified entry from the TB on the current processor. 00717 // 00718 00719 KiFlushSingleTb(Invalid, Virtual); 00720 00721 // 00722 // Wait until all target processors have finished. 00723 // 00724 00725 #if !defined(NT_UP) 00726 00727 if (TargetProcessors != 0) { 00728 KiIpiStallOnPacketTargets(); 00729 } 00730 00731 if (AllProcessors != FALSE) { 00732 KeLowerIrql(OldIrql); 00733 00734 } else { 00735 KiUnlockContextSwap(OldIrql); 00736 } 00737 00738 #endif 00739 00740 return OldPte; 00741 } 00742 00743 #if !defined(NT_UP) 00744 00745 00746 VOID 00747 KiFlushSingleTbTarget ( 00748 IN PULONG SignalDone, 00749 IN PVOID Virtual, 00750 IN PVOID Pid, 00751 IN PVOID Parameter3 00752 ) 00753 00754 /*++ 00755 00756 Routine Description: 00757 00758 This is the target function for flushing a single TB entry. 00759 00760 Arguments: 00761 00762 SignalDone Supplies a pointer to a variable that is cleared when the 00763 requested operation has been performed. 00764 00765 Virtual - Supplies a virtual address that is within the page whose 00766 translation buffer entry is to be flushed. 00767 00768 RequestPacket - Supplies a pointer to a flush single TB packet address. 00769 00770 Pid - Not used. 00771 00772 Parameter3 - Not used. 00773 00774 Return Value: 00775 00776 None. 00777 00778 --*/ 00779 00780 { 00781 00782 // 00783 // Flush a single entry form the TB on the current processor. 00784 // 00785 00786 KiIpiSignalPacketDone(SignalDone); 00787 KiFlushSingleTb(TRUE, Virtual); 00788 return; 00789 } 00790 00791 #endif 00792 00793 00794 HARDWARE_PTE 00795 KeFlushSingleTb64 ( 00796 IN ULONG Virtual, 00797 IN BOOLEAN Invalid, 00798 IN BOOLEAN AllProcessors, 00799 IN PHARDWARE_PTE PtePointer, 00800 IN HARDWARE_PTE PteValue 00801 ) 00802 00803 /*++ 00804 00805 Routine Description: 00806 00807 This function flushes a single entry from the translation buffer 00808 on all processors that are currently running threads which are 00809 children of the current process or flushes a single entry from 00810 the translation buffer on all processors in the host configuration. 00811 00812 Arguments: 00813 00814 Virtual - Supplies a virtual page number that is flushed from the TB. 00815 00816 Invalid - Supplies a boolean value that specifies the reason for 00817 flushing the translation buffer. 00818 00819 AllProcessors - Supplies a boolean value that determines which 00820 translation buffers are to be flushed. 00821 00822 PtePointer - Supplies a pointer to the page table entry which 00823 receives the specified value. 00824 00825 PteValue - Supplies the the new page table entry value. 00826 00827 Return Value: 00828 00829 The previous contents of the specified page table entry is returned 00830 as the function value. 00831 00832 --*/ 00833 00834 { 00835 00836 KIRQL OldIrql; 00837 HARDWARE_PTE OldPte; 00838 PKPROCESS Process; 00839 KAFFINITY TargetProcessors; 00840 PKTHREAD Thread; 00841 00842 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); 00843 00844 // 00845 // Compute the target set of processors. 00846 // 00847 00848 #if !defined(NT_UP) 00849 00850 if (AllProcessors != FALSE) { 00851 OldIrql = KeRaiseIrqlToSynchLevel(); 00852 TargetProcessors = KeActiveProcessors; 00853 00854 } else { 00855 Thread = KeGetCurrentThread(); 00856 Process = Thread->ApcState.Process; 00857 KiLockContextSwap(&OldIrql); 00858 TargetProcessors = Process->ActiveProcessors; 00859 } 00860 00861 TargetProcessors &= PCR->NotMember; 00862 00863 #endif 00864 00865 // 00866 // Capture the previous contents of the page table entry and set the 00867 // page table entry to the new value. 00868 // 00869 00870 OldPte = *PtePointer; 00871 *PtePointer = PteValue; 00872 00873 // 00874 // If any target processors are specified, then send a flush single 00875 // packet to the target set of processors. 00876 00877 #if !defined(NT_UP) 00878 00879 if (TargetProcessors != 0) { 00880 KiIpiSendPacket(TargetProcessors, 00881 KiFlushSingleTbTarget64, 00882 (PVOID)Virtual, 00883 NULL, 00884 NULL); 00885 } 00886 00887 #endif 00888 00889 // 00890 // Flush the specified entry from the TB on the current processor. 00891 // 00892 00893 KiFlushSingleTb64(Invalid, Virtual); 00894 00895 // 00896 // Wait until all target processors have finished. 00897 // 00898 00899 #if !defined(NT_UP) 00900 00901 if (TargetProcessors != 0) { 00902 KiIpiStallOnPacketTargets(); 00903 } 00904 00905 if (AllProcessors != FALSE) { 00906 KeLowerIrql(OldIrql); 00907 00908 } else { 00909 KiUnlockContextSwap(OldIrql); 00910 } 00911 00912 #endif 00913 00914 return OldPte; 00915 } 00916 00917 #if !defined(NT_UP) 00918 00919 00920 VOID 00921 KiFlushSingleTbTarget64 ( 00922 IN PULONG SignalDone, 00923 IN PVOID Virtual, 00924 IN PVOID Pid, 00925 IN PVOID Parameter3 00926 ) 00927 00928 /*++ 00929 00930 Routine Description: 00931 00932 This is the target function for flushing a single TB entry. 00933 00934 Arguments: 00935 00936 SignalDone Supplies a pointer to a variable that is cleared when the 00937 requested operation has been performed. 00938 00939 Virtual - Supplies a virtual page number that is flushed from the TB. 00940 00941 RequestPacket - Supplies a pointer to a flush single TB packet address. 00942 00943 Pid - Not used. 00944 00945 Parameter3 - Not used. 00946 00947 Return Value: 00948 00949 None. 00950 00951 --*/ 00952 00953 { 00954 00955 // 00956 // Flush a single entry form the TB on the current processor. 00957 // 00958 00959 KiIpiSignalPacketDone(SignalDone); 00960 KiFlushSingleTb64(TRUE, (ULONG)Virtual); 00961 return; 00962 } 00963 00964 #endif

Generated on Sat May 15 19:42:30 2004 for test by doxygen 1.3.7