One of the countermeasures against using Direct Connect Interface
(DCI) to debug CPUs via USB3 mentioned in the "Tapping into the
core" talk at the 33c3 was to identify and disable the Silicon
Debug feature found in Haswell and newer CPUs.

Two machines we have here are Haswell and Skylake, but both of
them have debugging disabled.  Would be interesting to know if
this works (or doesn't).


diff --git sys/arch/amd64/amd64/identcpu.c sys/arch/amd64/amd64/identcpu.c
index d9b1337a5fd..ae7da43df37 100644
--- sys/arch/amd64/amd64/identcpu.c
+++ sys/arch/amd64/amd64/identcpu.c
@@ -630,10 +630,37 @@ identifycpu(struct cpu_info *ci)
 
        printf("\n");
 
        x86_print_cacheinfo(ci);
 
+       /*
+        * Attempt to disable Silicon Debug and lock the configuration
+        * if it's enabled and unlocked.
+        */
+       if (!strcmp(cpu_vendor, "GenuineIntel") &&
+           (cpu_ecxfeature & CPUIDECX_SDBG)) {
+               uint64_t msr;
+
+               msr = rdmsr(IA32_DEBUG_INTERFACE);
+               if ((msr & IA32_DEBUG_INTERFACE_ENABLE) &&
+                   (msr & IA32_DEBUG_INTERFACE_LOCK) == 0) {
+                       msr &= IA32_DEBUG_INTERFACE_MASK;
+                       msr |= IA32_DEBUG_INTERFACE_LOCK;
+                       wrmsr(IA32_DEBUG_INTERFACE, msr);
+
+                       msr = rdmsr(IA32_DEBUG_INTERFACE);
+                       if ((msr & IA32_DEBUG_INTERFACE_ENABLE) == 0)
+                               printf("%s: disabled silicon debug\n",
+                                   ci->ci_dev->dv_xname);
+                       else
+                               printf("%s: failed to disable silicon debug\n",
+                                   ci->ci_dev->dv_xname);
+               } else if (msr & IA32_DEBUG_INTERFACE_ENABLE)
+                       printf("%s: cannot disable silicon debug\n",
+                           ci->ci_dev->dv_xname);
+       }
+
 #ifndef SMALL_KERNEL
        if (ci->ci_flags & CPUF_PRIMARY) {
                if (!strcmp(cpu_vendor, "AuthenticAMD") &&
                    ci->ci_pnfeatset >= 0x80000007) {
                        CPUID(0x80000007, dummy, dummy, dummy, val);
diff --git sys/arch/amd64/include/specialreg.h 
sys/arch/amd64/include/specialreg.h
index 48c47e74145..965633a15bc 100644
--- sys/arch/amd64/include/specialreg.h
+++ sys/arch/amd64/include/specialreg.h
@@ -835,10 +835,16 @@
 #define        C3_CRYPT_CWLO_DECRYPT           0x00000200
 #define        C3_CRYPT_CWLO_KEY128            0x0000000a      /* 128bit, 10 
rds */
 #define        C3_CRYPT_CWLO_KEY192            0x0000040c      /* 192bit, 12 
rds */
 #define        C3_CRYPT_CWLO_KEY256            0x0000080e      /* 256bit, 15 
rds */
 
+/* Intel Silicon Debug */
+#define IA32_DEBUG_INTERFACE           0xc80
+#define IA32_DEBUG_INTERFACE_ENABLE    0x00000001
+#define IA32_DEBUG_INTERFACE_LOCK      0x40000000
+#define IA32_DEBUG_INTERFACE_MASK      0x80000000
+
 /*
  * VMX
  */
 #define IA32_FEATURE_CONTROL_LOCK      0x01
 #define IA32_FEATURE_CONTROL_SMX_EN    0x02
diff --git sys/arch/i386/i386/machdep.c sys/arch/i386/i386/machdep.c
index d06abc19fef..12ce59c5276 100644
--- sys/arch/i386/i386/machdep.c
+++ sys/arch/i386/i386/machdep.c
@@ -2024,10 +2024,37 @@ identifycpu(struct cpu_info *ci)
 
                        printf("\n");
                }
        }
 
+       /*
+        * Attempt to disable Silicon Debug and lock the configuration
+        * if it's enabled and unlocked.
+        */
+       if (!strcmp(cpu_vendor, "GenuineIntel") &&
+           (cpu_ecxfeature & CPUIDECX_SDBG)) {
+               uint64_t msr;
+
+               msr = rdmsr(IA32_DEBUG_INTERFACE);
+               if ((msr & IA32_DEBUG_INTERFACE_ENABLE) &&
+                   (msr & IA32_DEBUG_INTERFACE_LOCK) == 0) {
+                       msr &= IA32_DEBUG_INTERFACE_MASK;
+                       msr |= IA32_DEBUG_INTERFACE_LOCK;
+                       wrmsr(IA32_DEBUG_INTERFACE, msr);
+
+                       msr = rdmsr(IA32_DEBUG_INTERFACE);
+                       if ((msr & IA32_DEBUG_INTERFACE_ENABLE) == 0)
+                               printf("%s: disabled silicon debug\n",
+                                   cpu_device);
+                       else
+                               printf("%s: failed to disable silicon debug\n",
+                                   cpu_device);
+               } else if (msr & IA32_DEBUG_INTERFACE_ENABLE)
+                       printf("%s: cannot disable silicon debug\n",
+                           cpu_device);
+       }
+
        if (ci->ci_flags & CPUF_PRIMARY) {
                if (cpu_ecxfeature & CPUIDECX_RDRAND)
                        has_rdrand = 1;
                if (ci->ci_feature_sefflags_ebx & SEFF0EBX_RDSEED)
                        has_rdseed = 1;
diff --git sys/arch/i386/include/specialreg.h sys/arch/i386/include/specialreg.h
index aa02392022b..f70a3eacd90 100644
--- sys/arch/i386/include/specialreg.h
+++ sys/arch/i386/include/specialreg.h
@@ -701,10 +701,16 @@
 #define        C3_CRYPT_CWLO_DECRYPT           0x00000200
 #define        C3_CRYPT_CWLO_KEY128            0x0000000a      /* 128bit, 10 
rds */
 #define        C3_CRYPT_CWLO_KEY192            0x0000040c      /* 192bit, 12 
rds */
 #define        C3_CRYPT_CWLO_KEY256            0x0000080e      /* 256bit, 15 
rds */
 
+/* Intel Silicon Debug */
+#define IA32_DEBUG_INTERFACE           0xc80
+#define IA32_DEBUG_INTERFACE_ENABLE    0x00000001
+#define IA32_DEBUG_INTERFACE_LOCK      0x40000000
+#define IA32_DEBUG_INTERFACE_MASK      0x80000000
+
 /*
  * VMX
  */
 #define IA32_FEATURE_CONTROL_LOCK      0x01
 #define IA32_FEATURE_CONTROL_SMX_EN    0x02

Reply via email to