diff --git a/vmm/src/acpi.rs b/vmm/src/acpi.rs index 9d7106b8f..2185ee8b3 100644 --- a/vmm/src/acpi.rs +++ b/vmm/src/acpi.rs @@ -626,6 +626,13 @@ fn create_viot_table(iommu_bdf: &PciBdf, devices_bdf: &[PciBdf]) -> Sdt { viot } +// Generate ACPI tables based on the given DSDT address +// +// # Returns +// +// * `Rsdp` is the generated RSDP. +// * `Vec` contains the generated bytes for ACPI tables. +// * `Vec` contains a list of table pointers stored in XSDT. fn create_acpi_tables_internal( dsdt_addr: GuestAddress, device_manager: &Arc>, @@ -636,7 +643,8 @@ fn create_acpi_tables_internal( ) -> (Rsdp, Vec, Vec) { // Generated bytes for ACPI tables let mut tables_bytes: Vec = Vec::new(); - let mut tables: Vec = Vec::new(); + // List of table pointers stored in XSDT + let mut xsdt_table_pointers: Vec = Vec::new(); // DSDT let dsdt = create_dsdt_table(device_manager, cpu_manager, memory_manager); @@ -646,13 +654,13 @@ fn create_acpi_tables_internal( let facp = create_facp_table(dsdt_addr, device_manager); let facp_addr = dsdt_addr.checked_add(dsdt.len() as u64).unwrap(); tables_bytes.extend_from_slice(facp.as_slice()); - tables.push(facp_addr.0); + xsdt_table_pointers.push(facp_addr.0); // MADT let madt = cpu_manager.lock().unwrap().create_madt(); let madt_addr = facp_addr.checked_add(facp.len() as u64).unwrap(); tables_bytes.extend_from_slice(madt.as_slice()); - tables.push(madt_addr.0); + xsdt_table_pointers.push(madt_addr.0); let mut prev_tbl_len = madt.len() as u64; let mut prev_tbl_addr = madt_addr; @@ -662,7 +670,7 @@ fn create_acpi_tables_internal( let pptt = cpu_manager.lock().unwrap().create_pptt(); let pptt_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(pptt.as_slice()); - tables.push(pptt_addr.0); + xsdt_table_pointers.push(pptt_addr.0); prev_tbl_len = pptt.len() as u64; prev_tbl_addr = pptt_addr; } @@ -673,7 +681,7 @@ fn create_acpi_tables_internal( let gtdt = create_gtdt_table(); let gtdt_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(gtdt.as_slice()); - tables.push(gtdt_addr.0); + xsdt_table_pointers.push(gtdt_addr.0); prev_tbl_len = gtdt.len() as u64; prev_tbl_addr = gtdt_addr; } @@ -682,7 +690,7 @@ fn create_acpi_tables_internal( let mcfg = create_mcfg_table(device_manager.lock().unwrap().pci_segments()); let mcfg_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(mcfg.as_slice()); - tables.push(mcfg_addr.0); + xsdt_table_pointers.push(mcfg_addr.0); prev_tbl_len = mcfg.len() as u64; prev_tbl_addr = mcfg_addr; @@ -714,7 +722,7 @@ fn create_acpi_tables_internal( let spcr = create_spcr_table(serial_device_addr, serial_device_irq); let spcr_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(spcr.as_slice()); - tables.push(spcr_addr.0); + xsdt_table_pointers.push(spcr_addr.0); prev_tbl_len = spcr.len() as u64; prev_tbl_addr = spcr_addr; @@ -722,7 +730,7 @@ fn create_acpi_tables_internal( let dbg2 = create_dbg2_table(serial_device_addr); let dbg2_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(dbg2.as_slice()); - tables.push(dbg2_addr.0); + xsdt_table_pointers.push(dbg2_addr.0); prev_tbl_len = dbg2.len() as u64; prev_tbl_addr = dbg2_addr; } @@ -732,7 +740,7 @@ fn create_acpi_tables_internal( let tpm2 = create_tpm2_table(); let tpm2_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(tpm2.as_slice()); - tables.push(tpm2_addr.0); + xsdt_table_pointers.push(tpm2_addr.0); prev_tbl_len = tpm2.len() as u64; prev_tbl_addr = tpm2_addr; @@ -750,13 +758,13 @@ fn create_acpi_tables_internal( ); let srat_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(srat.as_slice()); - tables.push(srat_addr.0); + xsdt_table_pointers.push(srat_addr.0); // SLIT let slit = create_slit_table(numa_nodes); let slit_addr = srat_addr.checked_add(srat.len() as u64).unwrap(); tables_bytes.extend_from_slice(slit.as_slice()); - tables.push(slit_addr.0); + xsdt_table_pointers.push(slit_addr.0); prev_tbl_len = slit.len() as u64; prev_tbl_addr = slit_addr; @@ -767,7 +775,7 @@ fn create_acpi_tables_internal( let iort = create_iort_table(device_manager.lock().unwrap().pci_segments()); let iort_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(iort.as_slice()); - tables.push(iort_addr.0); + xsdt_table_pointers.push(iort_addr.0); prev_tbl_len = iort.len() as u64; prev_tbl_addr = iort_addr; } @@ -779,15 +787,15 @@ fn create_acpi_tables_internal( let viot_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); tables_bytes.extend_from_slice(viot.as_slice()); - tables.push(viot_addr.0); + xsdt_table_pointers.push(viot_addr.0); prev_tbl_len = viot.len() as u64; prev_tbl_addr = viot_addr; } // XSDT let mut xsdt = Sdt::new(*b"XSDT", 36, 1, *b"CLOUDH", *b"CHXSDT ", 1); - for table in &tables { - xsdt.append(*table); + for table_pointer in &xsdt_table_pointers { + xsdt.append(*table_pointer); } xsdt.update_checksum(); let xsdt_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap(); @@ -796,7 +804,7 @@ fn create_acpi_tables_internal( // RSDP let rsdp = Rsdp::new(*b"CLOUDH", xsdt_addr.0); - (rsdp, tables_bytes, tables) + (rsdp, tables_bytes, xsdt_table_pointers) } pub fn create_acpi_tables( @@ -813,7 +821,7 @@ pub fn create_acpi_tables( let rsdp_addr = arch::layout::RSDP_POINTER; let dsdt_addr = rsdp_addr.checked_add(Rsdp::len() as u64).unwrap(); - let (rsdp, tables_bytes, _tables_addr) = create_acpi_tables_internal( + let (rsdp, tables_bytes, _xsdt_table_pointers) = create_acpi_tables_internal( dsdt_addr, device_manager, cpu_manager,