* sysdeps/x86_64/cacheinfo.c (handle_amd): Fix computation of
authorUlrich Drepper <drepper@redhat.com>
Sat, 25 Aug 2007 17:24:23 +0000 (17:24 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 25 Aug 2007 17:24:23 +0000 (17:24 +0000)
associativity for fully-associative caches.

ChangeLog
sysdeps/x86_64/cacheinfo.c

index 7de59d8..9374c90 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2007-08-25  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/x86_64/cacheinfo.c (handle_amd): Fix computation of
+       associativity for fully-associative caches.
+
        * sysdeps/x86_64/cacheinfo.c (handle_amd): Handle L3 cache
        requests.  Fill on more associativity values for L2.
        Patch mostly by Evandro Menezes.
index eef7fa8..793dc2d 100644 (file)
@@ -296,14 +296,13 @@ handle_amd (int name)
       return (ecx & 0xf000) == 0 ? 0 : (ecx >> 6) & 0x3fffc00;
 
     case _SC_LEVEL2_CACHE_ASSOC:
-      ecx >>= 12;
-      switch (ecx & 0xf)
+      switch ((ecx >> 12) & 0xf)
         {
         case 0:
         case 1:
         case 2:
         case 4:
-         return ecx & 0xf;
+         return (ecx >> 12) & 0xf;
        case 6:
          return 8;
        case 8:
@@ -319,7 +318,7 @@ handle_amd (int name)
        case 14:
          return 128;
        case 15:
-         return (ecx << 6) & 0x3fffc00;
+         return ((ecx >> 6) & 0x3fffc00) / (ecx & 0xff);
        default:
          return 0;
         }
@@ -332,14 +331,13 @@ handle_amd (int name)
       return (edx & 0xf000) == 0 ? 0 : (edx & 0x3ffc0000) << 1;
 
     case _SC_LEVEL3_CACHE_ASSOC:
-      edx >>= 12;
-      switch (edx & 0xf)
+      switch ((edx >> 12) & 0xf)
        {
        case 0:
        case 1:
        case 2:
        case 4:
-         return edx & 0xf;
+         return (edx >> 12) & 0xf;
        case 6:
          return 8;
        case 8:
@@ -355,7 +353,7 @@ handle_amd (int name)
        case 14:
          return 128;
        case 15:
-         return (edx & 0x3ffc0) << 13;
+         return ((edx & 0x3ffc0000) << 1) / (edx & 0xff);
        default:
          return 0;
        }