static void update_pmu_cap(struct x86_hybrid_pmu *pmu)
 {
-       unsigned int sub_bitmaps, eax, ebx, ecx, edx;
+       unsigned int cntr, fixed_cntr, ecx, edx;
+       union cpuid35_eax eax;
+       union cpuid35_ebx ebx;
 
-       cpuid(ARCH_PERFMON_EXT_LEAF, &sub_bitmaps, &ebx, &ecx, &edx);
+       cpuid(ARCH_PERFMON_EXT_LEAF, &eax.full, &ebx.full, &ecx, &edx);
 
-       if (ebx & ARCH_PERFMON_EXT_UMASK2)
+       if (ebx.split.umask2)
                pmu->config_mask |= ARCH_PERFMON_EVENTSEL_UMASK2;
-       if (ebx & ARCH_PERFMON_EXT_EQ)
+       if (ebx.split.eq)
                pmu->config_mask |= ARCH_PERFMON_EVENTSEL_EQ;
 
-       if (sub_bitmaps & ARCH_PERFMON_NUM_COUNTER_LEAF_BIT) {
+       if (eax.split.cntr_subleaf) {
                cpuid_count(ARCH_PERFMON_EXT_LEAF, ARCH_PERFMON_NUM_COUNTER_LEAF,
-                           &eax, &ebx, &ecx, &edx);
-               pmu->cntr_mask64 = eax;
-               pmu->fixed_cntr_mask64 = ebx;
+                           &cntr, &fixed_cntr, &ecx, &edx);
+               pmu->cntr_mask64 = cntr;
+               pmu->fixed_cntr_mask64 = fixed_cntr;
        }
 
        if (!intel_pmu_broken_perf_cap()) {
 
  * detection/enumeration details:
  */
 #define ARCH_PERFMON_EXT_LEAF                  0x00000023
-#define ARCH_PERFMON_EXT_UMASK2                        0x1
-#define ARCH_PERFMON_EXT_EQ                    0x2
-#define ARCH_PERFMON_NUM_COUNTER_LEAF_BIT      0x1
 #define ARCH_PERFMON_NUM_COUNTER_LEAF          0x1
 
+union cpuid35_eax {
+       struct {
+               unsigned int    leaf0:1;
+               /* Counters Sub-Leaf */
+               unsigned int    cntr_subleaf:1;
+               /* Auto Counter Reload Sub-Leaf */
+               unsigned int    acr_subleaf:1;
+               /* Events Sub-Leaf */
+               unsigned int    events_subleaf:1;
+               unsigned int    reserved:28;
+       } split;
+       unsigned int            full;
+};
+
+union cpuid35_ebx {
+       struct {
+               /* UnitMask2 Supported */
+               unsigned int    umask2:1;
+               /* EQ-bit Supported */
+               unsigned int    eq:1;
+               unsigned int    reserved:30;
+       } split;
+       unsigned int            full;
+};
+
 /*
  * Intel Architectural LBR CPUID detection/enumeration details:
  */