vmm: acpi: Clarify the return of 'create_acpi_tables_internal'
Signed-off-by: Bo Chen <bchen@crusoe.ai>
This commit is contained in:
parent
abcec231eb
commit
394fd230b0
1 changed files with 25 additions and 17 deletions
|
|
@ -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<u8>` contains the generated bytes for ACPI tables.
|
||||
// * `Vec<u64>` contains a list of table pointers stored in XSDT.
|
||||
fn create_acpi_tables_internal(
|
||||
dsdt_addr: GuestAddress,
|
||||
device_manager: &Arc<Mutex<DeviceManager>>,
|
||||
|
|
@ -636,7 +643,8 @@ fn create_acpi_tables_internal(
|
|||
) -> (Rsdp, Vec<u8>, Vec<u64>) {
|
||||
// Generated bytes for ACPI tables
|
||||
let mut tables_bytes: Vec<u8> = Vec::new();
|
||||
let mut tables: Vec<u64> = Vec::new();
|
||||
// List of table pointers stored in XSDT
|
||||
let mut xsdt_table_pointers: Vec<u64> = 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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue