extern void switch_to_sld(unsigned long tifn);
  extern bool handle_user_split_lock(struct pt_regs *regs, long error_code);
  extern bool handle_guest_split_lock(unsigned long ip);
 +extern void handle_bus_lock(struct pt_regs *regs);
+ u8 get_this_hybrid_cpu_type(void);
  #else
 -static inline void __init cpu_set_core_cap_bits(struct cpuinfo_x86 *c) {}
 +static inline void __init sld_setup(struct cpuinfo_x86 *c) {}
  static inline void switch_to_sld(unsigned long tifn) {}
  static inline bool handle_user_split_lock(struct pt_regs *regs, long error_code)
  {
        return false;
  }
  
 +static inline void handle_bus_lock(struct pt_regs *regs) {}
++
+ static inline u8 get_this_hybrid_cpu_type(void)
+ {
+       return 0;
+ }
  #endif
  #ifdef CONFIG_IA32_FEAT_CTL
  void init_ia32_feat_ctl(struct cpuinfo_x86 *c);
 
        }
  
        cpu_model_supports_sld = true;
 -      split_lock_setup();
 +      __split_lock_setup();
 +}
 +
 +static void sld_state_show(void)
 +{
 +      if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) &&
 +          !boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT))
 +              return;
 +
 +      switch (sld_state) {
 +      case sld_off:
 +              pr_info("disabled\n");
 +              break;
 +      case sld_warn:
 +              if (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT))
 +                      pr_info("#AC: crashing the kernel on kernel split_locks and warning on user-space split_locks\n");
 +              else if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
 +                      pr_info("#DB: warning on user-space bus_locks\n");
 +              break;
 +      case sld_fatal:
 +              if (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) {
 +                      pr_info("#AC: crashing the kernel on kernel split_locks and sending SIGBUS on user-space split_locks\n");
 +              } else if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT)) {
 +                      pr_info("#DB: sending SIGBUS on user-space bus_locks%s\n",
 +                              boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) ?
 +                              " from non-WB" : "");
 +              }
 +              break;
 +      }
 +}
 +
 +void __init sld_setup(struct cpuinfo_x86 *c)
 +{
 +      split_lock_setup(c);
 +      sld_state_setup();
 +      sld_state_show();
  }
+ 
+ #define X86_HYBRID_CPU_TYPE_ID_SHIFT  24
+ 
+ /**
+  * get_this_hybrid_cpu_type() - Get the type of this hybrid CPU
+  *
+  * Returns the CPU type [31:24] (i.e., Atom or Core) of a CPU in
+  * a hybrid processor. If the processor is not hybrid, returns 0.
+  */
+ u8 get_this_hybrid_cpu_type(void)
+ {
+       if (!cpu_feature_enabled(X86_FEATURE_HYBRID_CPU))
+               return 0;
+ 
+       return cpuid_eax(0x0000001a) >> X86_HYBRID_CPU_TYPE_ID_SHIFT;
+ }