From a21e3cd8425b71aa0f0c2c00b9a9a7cd6c73270a Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 29 Sep 2014 13:05:38 +0000
Subject: [PATCH] CPUID:   - Fix main() model and family calculation   - Add
 model string fetch from processor   - AMD model string tweaks

---
 .../support/CPUInformation/AMDInfoImpl.java   | 29 ++++++++--
 .../freenet/support/CPUInformation/CPUID.java | 56 +++++++++++++++++--
 .../support/CPUInformation/IntelInfoImpl.java |  6 +-
 3 files changed, 79 insertions(+), 12 deletions(-)

diff --git a/core/java/src/freenet/support/CPUInformation/AMDInfoImpl.java b/core/java/src/freenet/support/CPUInformation/AMDInfoImpl.java
index 12e418b2d4..0bbafb146b 100644
--- a/core/java/src/freenet/support/CPUInformation/AMDInfoImpl.java
+++ b/core/java/src/freenet/support/CPUInformation/AMDInfoImpl.java
@@ -364,6 +364,9 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
 
         // APUs
         // http://en.wikipedia.org/wiki/List_of_AMD_Accelerated_Processing_Unit_microprocessors
+        // 1st gen Llano high perf / Brazos low power
+        // 2nd gen Trinity high perf / Brazos 2 low power
+        // 3rd gen Kaveri high perf / Kabini/Temash low power
           case 18: {
             isK6Compatible = true;
             isK6_2_Compatible = true;
@@ -371,7 +374,7 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
             isAthlonCompatible = true;
             isAthlon64Compatible = true;
             isX64 = true;
-            modelString = "AMD Llano/Trinity/Brazos model " + model;
+            modelString = "AMD APU model " + model;
           }
           break;
 
@@ -388,10 +391,10 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
                 case 1:                    
                 // Case 3 is uncertain but most likely a Bobcat APU
                 case 3:
-                    modelString = "Bobcat APU";
+                    modelString = "AMD Bobcat APU";
                     break;
                 default:
-                    modelString = "AMD Bobcat model " + model;
+                    modelString = "AMD Bobcat APU model " + model;
                     break;
             }
           }
@@ -408,8 +411,17 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
             isBulldozerCompatible = true;
             isX64 = true;
             switch (model) {
+                // 32 nm
                 case 1:                    
-                    modelString = "Bulldozer FX-6000/8000";
+                    modelString = "Bulldozer FX-6100/8100";
+                    break;
+                // 32 nm
+                case 2:                    
+                    modelString = "Bulldozer FX-6300/8300";
+                    break;
+                // 28 nm ?
+                case 3:                    
+                    modelString = "Bulldozer FX-6500/8500";
                     break;
                 default:
                     modelString = "AMD Bulldozer model " + model;
@@ -427,7 +439,14 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
             isAthlon64Compatible = true;
             isBobcatCompatible = true;
             isX64 = true;
-            modelString = "AMD Jaguar model " + model;
+            switch (model) {
+                case 0:                    
+                    modelString = "Athlon 5350 APU";
+                    break;
+                default:
+                    modelString = "AMD Jaguar APU model " + model;
+                    break;
+            }
           }
           break;
         }
diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java
index 0aab211c7e..37338e9d1c 100644
--- a/core/java/src/freenet/support/CPUInformation/CPUID.java
+++ b/core/java/src/freenet/support/CPUInformation/CPUID.java
@@ -79,8 +79,11 @@ public class CPUID {
     {
         loadNative();
     }
-    //A class that can (amongst other things I assume) represent the state of the
-    //different CPU registers after a call to the CPUID assembly method
+
+    /**
+     *  A class that can (amongst other things I assume) represent the state of the
+     *  different CPU registers after a call to the CPUID assembly method
+     */
     protected static class CPUIDResult {
         final int EAX;
         final int EBX;
@@ -206,6 +209,40 @@ public class CPUID {
         return c.EDX;
     }
 
+    /**
+     *  The model name string, up to 48 characters, as reported by
+     *  the processor itself.
+     *
+     *  @return trimmed string, null if unsupported
+     *  @since 0.9.16
+     */
+    static String getCPUModelName() {
+        CPUIDResult c = doCPUID(0x80000000);
+        long maxSupported = c.EAX & 0xFFFFFFFFL;
+        if (maxSupported < 0x80000004L)
+            return null;
+        StringBuilder buf = new StringBuilder(48);
+        int[] regs = new int[4];
+        for (int fn = 0x80000002; fn <= 0x80000004; fn++) {
+            c = doCPUID(fn);
+            regs[0] = c.EAX;
+            regs[1] = c.EBX;
+            regs[2] = c.ECX;
+            regs[3] = c.EDX;
+            for (int i = 0; i < 4; i++) {
+                int reg = regs[i];
+                for (int j = 0; j < 4; j++) {
+                    char ch = (char) (reg & 0xff);
+                    if (ch == 0)
+                        return buf.toString().trim();
+                    buf.append(ch);
+                    reg >>= 8;
+                }
+            }
+        }
+        return buf.toString().trim();
+    }
+
     /**
      * Returns a CPUInfo item for the current type of CPU
      * If I could I would declare this method in a interface named
@@ -237,9 +274,19 @@ public class CPUID {
             System.out.println("**Failed to retrieve CPUInfo. Please verify the existence of jcpuid dll/so**");
         }
         System.out.println(" **CPUInfo**");
+        String mname = getCPUModelName();
+        if (mname != null)
+            System.out.println("CPU Model Name: " + mname);
         System.out.println("CPU Vendor: " + getCPUVendorID());
-        System.out.println("CPU Family: " + getCPUFamily());
-        System.out.println("CPU Model: " + getCPUModel());
+        // http://en.wikipedia.org/wiki/Cpuid
+        int family = getCPUFamily();
+        int model = getCPUModel();
+        if (family == 15) {
+            family += getCPUExtendedFamily();
+            model += getCPUExtendedModel() << 4;
+        }
+        System.out.println("CPU Family: " + family);
+        System.out.println("CPU Model: " + model);
         System.out.println("CPU Stepping: " + getCPUStepping());
         System.out.println("CPU Flags: 0x" + Integer.toHexString(getEDXCPUFlags()));
 
@@ -253,6 +300,7 @@ public class CPUID {
         System.out.println("CPU has SSE4.1: " + c.hasSSE41());
         System.out.println("CPU has SSE4.2: " + c.hasSSE42());
         System.out.println("CPU has SSE4A: " + c.hasSSE4A());
+        System.out.println("CPU has AES-NI: " + c.hasAES());
         if(c instanceof IntelCPUInfo){
             System.out.println("\n **Intel-info**");
             System.out.println("Is PII-compatible: "+((IntelCPUInfo)c).IsPentium2Compatible());
diff --git a/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java b/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java
index c87119b0d9..50472bd69b 100644
--- a/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java
+++ b/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java
@@ -227,7 +227,7 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
                     case 0x17:
                         modelString = "Core 2 (45nm)";
                         break;
-                    // Nahalem 45 nm
+                    // Nehalem 45 nm
                     case 0x1a:
                         isCoreiCompatible = true;
                         modelString = "Core i7 (45nm)";
@@ -246,7 +246,7 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
                         isCoreiCompatible = true;
                         modelString = "Xeon MP (45nm)";
                         break;
-                    // Nahalem 45 nm
+                    // Nehalem 45 nm
                     case 0x1e:
                         isCoreiCompatible = true;
                         modelString = "Core i5/i7 (45nm)";
@@ -282,7 +282,7 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
                     case 0x2d:
                         modelString = "Sandy Bridge EP";
                         break;
-                    // Nahalem 45 nm
+                    // Nehalem 45 nm
                     case 0x2e:
                         modelString = "Xeon MP (45nm)";
                         break;
-- 
GitLab