summaryrefslogtreecommitdiff
path: root/MdePkg/Library/BaseCacheMaintenanceLib
diff options
context:
space:
mode:
authorbxing <bxing@6f19259b-4bc3-4df7-8a09-765794883524>2006-09-09 02:44:57 +0000
committerbxing <bxing@6f19259b-4bc3-4df7-8a09-765794883524>2006-09-09 02:44:57 +0000
commited9610eb9cca079d5751034a16f3756d0de4902c (patch)
treec78650f7176168ee743868a1cc2b0e22a484f345 /MdePkg/Library/BaseCacheMaintenanceLib
parentb0e15cb26011b1e0bfe4eb993d07f29537f6fef4 (diff)
downloadedk2-platforms-ed9610eb9cca079d5751034a16f3756d0de4902c.tar.xz
Fixed a bug in WriteBackInvalidDataCache() that always flush cache lines even when the argument Length is zero.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1504 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg/Library/BaseCacheMaintenanceLib')
-rw-r--r--MdePkg/Library/BaseCacheMaintenanceLib/x86Cache.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/MdePkg/Library/BaseCacheMaintenanceLib/x86Cache.c b/MdePkg/Library/BaseCacheMaintenanceLib/x86Cache.c
index 3879cdfa2d..6e812c99c3 100644
--- a/MdePkg/Library/BaseCacheMaintenanceLib/x86Cache.c
+++ b/MdePkg/Library/BaseCacheMaintenanceLib/x86Cache.c
@@ -14,6 +14,12 @@
**/
+//
+// This size must be at or below the smallest cache size possible among all
+// supported processors
+//
+#define CACHE_LINE_SIZE 0x20
+
/**
Invalidates the entire instruction cache in cache coherency domain of the
calling CPU.
@@ -118,19 +124,21 @@ WriteBackInvalidateDataCacheRange (
IN UINTN Length
)
{
- UINT8 (*Uint8Ptr)[32];
+ UINTN Start, End;
ASSERT (Length <= MAX_ADDRESS - (UINTN)Address + 1);
- Uint8Ptr = Address;
- while (Length > sizeof (*Uint8Ptr)) {
- AsmFlushCacheLine (Uint8Ptr++);
- Length -= sizeof (*Uint8Ptr);
- }
- if (Length > 0) {
- AsmFlushCacheLine (Uint8Ptr);
- AsmFlushCacheLine (&(*Uint8Ptr)[Length - 1]);
+ if (Length == 0) {
+ return Address;
}
+
+ Start = (UINTN)Address;
+ End = (Start + Length + (CACHE_LINE_SIZE - 1)) & ~(CACHE_LINE_SIZE - 1);
+ Start &= ~(CACHE_LINE_SIZE - 1);
+
+ do {
+ Start = (UINTN)AsmFlushCacheLine ((VOID*)Start) + CACHE_LINE_SIZE;
+ } while (Start != End);
return Address;
}