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
#include "ki.h"
00026
00027
00028
VOID
00029 KeFlushIoBuffers (
00030 IN
PMDL Mdl,
00031 IN BOOLEAN ReadOperation,
00032 IN BOOLEAN DmaOperation
00033 )
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 {
00058 KIRQL OldIrql;
00059 ULONG Length, PartialLength,
Offset;
00060 PFN_NUMBER PageFrameIndex;
00061 PPFN_NUMBER Page;
00062 PVOID CurrentVAddress = 0;
00063
00064
ASSERT(KeGetCurrentIrql() <= KiSynchIrql);
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
if (DmaOperation !=
FALSE) {
00075
if (ReadOperation !=
FALSE ) {
00076
00077
00078
00079
00080
00081
return;
00082 }
else {
00083
00084
00085
00086 __mf();
00087
return;
00088 }
00089
00090 }
else if ((Mdl->MdlFlags &
MDL_IO_PAGE_READ) == 0) {
00091
00092
00093
00094
return;
00095 }
else if (ReadOperation !=
FALSE) {
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 OldIrql = KeRaiseIrqlToSynchLevel();
00108
00109
00110
00111
00112
00113
00114 Length = Mdl->ByteCount;
00115
00116
if ( !Length ) {
00117
return;
00118 }
00119
Offset = Mdl->ByteOffset;
00120 PartialLength =
PAGE_SIZE -
Offset;
00121
if (PartialLength > Length) {
00122 PartialLength = Length;
00123 }
00124
00125 Page = (PPFN_NUMBER)(Mdl + 1);
00126 PageFrameIndex = *Page;
00127 CurrentVAddress = ((PVOID)(KSEG3_BASE
00128 | ((ULONG_PTR)(PageFrameIndex) <<
PAGE_SHIFT)
00129 |
Offset));
00130
00131
00132
00133
00134
00135 HalSweepIcacheRange (
00136 CurrentVAddress,
00137 PartialLength
00138 );
00139
00140 Page++;
00141 Length -= PartialLength;
00142
00143
if (Length) {
00144 PartialLength =
PAGE_SIZE;
00145
do {
00146 PageFrameIndex = *Page;
00147 CurrentVAddress = ((PVOID)(KSEG3_BASE
00148 | ((ULONG_PTR)(PageFrameIndex) <<
PAGE_SHIFT)
00149 |
Offset));
00150
00151
if (PartialLength > Length) {
00152 PartialLength = Length;
00153 }
00154
00155 HalSweepIcacheRange (
00156 CurrentVAddress,
00157 PartialLength
00158 );
00159
00160 Page++;
00161
00162 Length -= PartialLength;
00163 }
while (Length != 0);
00164 }
00165
00166
00167
00168
00169
00170 __synci();
00171 __isrlz();
00172
00173
00174
00175
00176
00177
KeLowerIrql(OldIrql);
00178
return;
00179 }
00180 }