unsigned int ht_mask_width, core_plus_mask_width, die_plus_mask_width;
        unsigned int core_select_mask, core_level_siblings;
        unsigned int die_select_mask, die_level_siblings;
+       unsigned int pkg_mask_width;
        bool die_level_present = false;
        int leaf;
 
        core_level_siblings = smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
        core_plus_mask_width = ht_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
        die_level_siblings = LEVEL_MAX_SIBLINGS(ebx);
-       die_plus_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
+       pkg_mask_width = die_plus_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
 
        sub_index = 1;
-       do {
+       while (true) {
                cpuid_count(leaf, sub_index, &eax, &ebx, &ecx, &edx);
 
                /*
                        die_plus_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
                }
 
+               if (LEAFB_SUBTYPE(ecx) != INVALID_TYPE)
+                       pkg_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
+               else
+                       break;
+
                sub_index++;
-       } while (LEAFB_SUBTYPE(ecx) != INVALID_TYPE);
+       }
 
        core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width;
        die_select_mask = (~(-1 << die_plus_mask_width)) >>
        }
 
        c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid,
-                               die_plus_mask_width);
+                               pkg_mask_width);
        /*
         * Reinit the apicid, now that we have extended initial_apicid.
         */