diff --git a/src/uu/lscpu/src/lscpu.rs b/src/uu/lscpu/src/lscpu.rs
index 1f32a1c..19cce4e 100644
--- a/src/uu/lscpu/src/lscpu.rs
+++ b/src/uu/lscpu/src/lscpu.rs
@@ -122,6 +122,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
                 model_name_info.add_child(CpuInfo::new("Model", &model, None));
             }
 
+            let socket_count = &cpu_topology.socket_count();
+            let core_count = &cpu_topology.core_count();
+            model_name_info.add_child(CpuInfo::new(
+                "Core(s) per socket",
+                &(core_count / socket_count).to_string(),
+                None,
+            ));
+            model_name_info.add_child(CpuInfo::new("Socket(s)", &socket_count.to_string(), None));
+
             if let Some(freq_boost_enabled) = sysfs::read_freq_boost_state() {
                 let s = if freq_boost_enabled {
                     "enabled"
@@ -131,12 +140,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
                 model_name_info.add_child(CpuInfo::new("Frequency boost", s, None));
             }
 
-            model_name_info.add_child(CpuInfo::new(
-                "Socket(s)",
-                &cpu_topology.socket_count().to_string(),
-                None,
-            ));
-
             vendor_info.add_child(model_name_info);
         }
 
diff --git a/src/uu/lscpu/src/sysfs.rs b/src/uu/lscpu/src/sysfs.rs
index f710a65..787e0b7 100644
--- a/src/uu/lscpu/src/sysfs.rs
+++ b/src/uu/lscpu/src/sysfs.rs
@@ -14,6 +14,7 @@ pub struct CpuTopology {
 pub struct Cpu {
     _index: usize,
     pub pkg_id: usize,
+    pub core_id: usize,
     pub caches: Vec<CpuCache>,
 }
 
@@ -41,7 +42,13 @@ impl CpuTopology {
         for cpu_index in online_cpus {
             let cpu_dir = PathBuf::from(format!("/sys/devices/system/cpu/cpu{}/", cpu_index));
 
-            let physical_pkg_id = fs::read_to_string(cpu_dir.join("topology/physical_package_id"))
+            let pkg_id = fs::read_to_string(cpu_dir.join("topology/physical_package_id"))
+                .unwrap()
+                .trim()
+                .parse::<usize>()
+                .unwrap();
+
+            let core_id = fs::read_to_string(cpu_dir.join("topology/core_id"))
                 .unwrap()
                 .trim()
                 .parse::<usize>()
@@ -51,7 +58,8 @@ impl CpuTopology {
 
             out.push(Cpu {
                 _index: cpu_index,
-                pkg_id: physical_pkg_id,
+                pkg_id,
+                core_id,
                 caches,
             })
         }
@@ -61,10 +69,15 @@ impl CpuTopology {
     pub fn socket_count(&self) -> usize {
         // Each physical socket is represented as its own package_id, so amount of unique pkg_ids = sockets
         // https://www.kernel.org/doc/html/latest/admin-guide/abi-stable.html#abi-sys-devices-system-cpu-cpux-topology-physical-package-id
-        let physical_sockets: HashSet<usize> = self.cpus.iter().map(|cpu| cpu.pkg_id).collect();
+        let physical_sockets: HashSet<_> = self.cpus.iter().map(|cpu| cpu.pkg_id).collect();
 
         physical_sockets.len()
     }
+
+    pub fn core_count(&self) -> usize {
+        let core_ids: HashSet<_> = self.cpus.iter().map(|cpu| cpu.core_id).collect();
+        core_ids.len()
+    }
 }
 
 // TODO: respect `--hex` option and output the bitmask instead of human-readable range