#include <Library/BaseMemoryLib.h>\r
#include <Library/DebugLib.h>\r
\r
+#define OR_SEED 0x01010101\r
+#define CLEAR_SEED 0xFFFFFFFF\r
+\r
//\r
// Context to save and restore when MTRRs are programmed\r
//\r
{\r
UINT32 MsrNum;\r
UINT32 ByteShift;\r
- UINT64 OrMask;\r
- UINT64 ClearMask;\r
+ UINT32 OrMask[2];\r
+ UINT32 ClearMask[2];\r
+ UINT64 SubLength;\r
\r
- OrMask = 0;\r
- ClearMask = 0;\r
+ *(UINT64 *)OrMask = 0;\r
+ *(UINT64 *)ClearMask = 0;\r
\r
for (MsrNum = *LastMsrNum + 1; MsrNum < MTRR_NUMBER_OF_FIXED_MTRR; MsrNum++) {\r
if ((*Base >= mMtrrLibFixedMtrrTable[MsrNum].BaseAddress) &&\r
return RETURN_UNSUPPORTED;\r
}\r
\r
- for (\r
- ;\r
- ((ByteShift < 8) && (*Length >= mMtrrLibFixedMtrrTable[MsrNum].Length));\r
- ByteShift++\r
- ) {\r
- OrMask |= LShiftU64 ((UINT64) MemoryCacheType, (UINT32) (ByteShift * 8));\r
- ClearMask |= LShiftU64 ((UINT64) 0xFF, (UINT32) (ByteShift * 8));\r
- *Length -= mMtrrLibFixedMtrrTable[MsrNum].Length;\r
- *Base += mMtrrLibFixedMtrrTable[MsrNum].Length;\r
+ if (ByteShift < 4) {\r
+ OrMask[0] = OR_SEED * (UINT32)MemoryCacheType;\r
+ ClearMask[0] = CLEAR_SEED;\r
+ OrMask[1] = (OR_SEED * (UINT32)MemoryCacheType) >> ((4 - ByteShift) * 8);\r
+ ClearMask[1] = CLEAR_SEED >> ((4 - ByteShift) * 8);\r
+ } else {\r
+ OrMask[0] = (OR_SEED * (UINT32)MemoryCacheType) >> ((8 - ByteShift) * 8);\r
+ ClearMask[0] = CLEAR_SEED >> ((8 - ByteShift) * 8);\r
}\r
\r
- if (ByteShift < 8 && (*Length != 0)) {\r
+ SubLength = mMtrrLibFixedMtrrTable[MsrNum].Length * (8 - ByteShift);\r
+ if (*Length < SubLength) {\r
return RETURN_UNSUPPORTED;\r
}\r
\r
+ *Length -= SubLength;\r
+ *Base += SubLength;\r
+\r
*LastMsrNum = MsrNum;\r
- *ReturnClearMask = ClearMask;\r
- *ReturnOrMask = OrMask;\r
+ *ReturnClearMask = *(UINT64 *)ClearMask;\r
+ *ReturnOrMask = *(UINT64 *)OrMask;\r
\r
return RETURN_SUCCESS;\r
}\r