return (value & value_mask) >> value_shift;
 }
 
+
+/* Rapl domain enumeration helpers */
+static inline int get_rapl_num_domains(void)
+{
+       int num_packages = topo.max_package_id + 1;
+       int num_cores_per_package;
+       int num_cores;
+
+       if (!platform->has_per_core_rapl)
+               return num_packages;
+
+       num_cores_per_package = topo.max_core_id + 1;
+       num_cores = num_cores_per_package * num_packages;
+
+       return num_cores;
+}
+
+static inline int get_rapl_domain_id(int cpu)
+{
+       int nr_cores_per_package = topo.max_core_id + 1;
+       int rapl_core_id;
+
+       if (!platform->has_per_core_rapl)
+               return cpus[cpu].physical_package_id;
+
+       /* Compute the system-wide unique core-id for @cpu */
+       rapl_core_id = cpus[cpu].physical_core_id;
+       rapl_core_id += cpus[cpu].physical_package_id * nr_cores_per_package;
+
+       return rapl_core_id;
+}
+
 /*
  * get_counters(...)
  * migrate to cpu
                goto done;
 
        if (platform->has_per_core_rapl) {
-               status = get_rapl_counters(cpu, c->core_id, c, p);
+               status = get_rapl_counters(cpu, get_rapl_domain_id(cpu), c, p);
                if (status != 0)
                        return status;
        }
                p->sys_lpi = cpuidle_cur_sys_lpi_us;
 
        if (!platform->has_per_core_rapl) {
-               status = get_rapl_counters(cpu, p->package_id, c, p);
+               status = get_rapl_counters(cpu, get_rapl_domain_id(cpu), c, p);
                if (status != 0)
                        return status;
        }
 
 void rapl_perf_init(void)
 {
-       const unsigned int num_domains = (platform->has_per_core_rapl ? topo.max_core_id : topo.max_package_id) + 1;
+       const unsigned int num_domains = get_rapl_num_domains();
        bool *domain_visited = calloc(num_domains, sizeof(bool));
 
        rapl_counter_info_perdomain = calloc(num_domains, sizeof(*rapl_counter_info_perdomain));
                                continue;
 
                        /* Skip already seen and handled RAPL domains */
-                       next_domain =
-                           platform->has_per_core_rapl ? cpus[cpu].physical_core_id : cpus[cpu].physical_package_id;
+                       next_domain = get_rapl_domain_id(cpu);
 
                        assert(next_domain < num_domains);