|
2 | 2 | // SPDX-License-Identifier: Apache-2.0
|
3 | 3 |
|
4 | 4 | use acpi_tables::fadt::{FADT_F_HW_REDUCED_ACPI, FADT_F_PWR_BUTTON, FADT_F_SLP_BUTTON};
|
5 |
| -use acpi_tables::{Aml, Dsdt, Fadt, Madt, Rsdp, Sdt, Xsdt, aml}; |
| 5 | +use acpi_tables::{Aml, Dsdt, Fadt, Madt, Mcfg, Rsdp, Sdt, Xsdt, aml}; |
6 | 6 | use log::{debug, error};
|
7 | 7 | use vm_allocator::AllocPolicy;
|
8 | 8 |
|
9 | 9 | use crate::Vcpu;
|
10 | 10 | use crate::acpi::x86_64::{
|
11 | 11 | apic_addr, rsdp_addr, setup_arch_dsdt, setup_arch_fadt, setup_interrupt_controllers,
|
12 | 12 | };
|
| 13 | +use crate::arch::x86_64::layout; |
13 | 14 | use crate::device_manager::DeviceManager;
|
14 | 15 | use crate::device_manager::resources::ResourceAllocator;
|
15 | 16 | use crate::vstate::memory::{GuestAddress, GuestMemoryMmap};
|
@@ -145,16 +146,27 @@ impl AcpiTableWriter<'_> {
|
145 | 146 | resource_allocator: &ResourceAllocator,
|
146 | 147 | fadt_addr: u64,
|
147 | 148 | madt_addr: u64,
|
| 149 | + mcfg_addr: u64, |
148 | 150 | ) -> Result<u64, AcpiError> {
|
149 | 151 | let mut xsdt = Xsdt::new(
|
150 | 152 | OEM_ID,
|
151 | 153 | *b"FCMVXSDT",
|
152 | 154 | OEM_REVISION,
|
153 |
| - vec![fadt_addr, madt_addr], |
| 155 | + vec![fadt_addr, madt_addr, mcfg_addr], |
154 | 156 | );
|
155 | 157 | self.write_acpi_table(resource_allocator, &mut xsdt)
|
156 | 158 | }
|
157 | 159 |
|
| 160 | + /// Build the MCFG table for the guest. |
| 161 | + fn build_mcfg( |
| 162 | + &mut self, |
| 163 | + resource_allocator: &ResourceAllocator, |
| 164 | + pci_mmio_config_addr: u64, |
| 165 | + ) -> Result<u64, AcpiError> { |
| 166 | + let mut mcfg = Mcfg::new(OEM_ID, *b"FCMVMCFG", OEM_REVISION, pci_mmio_config_addr); |
| 167 | + self.write_acpi_table(resource_allocator, &mut mcfg) |
| 168 | + } |
| 169 | + |
158 | 170 | /// Build the RSDP pointer for the guest.
|
159 | 171 | ///
|
160 | 172 | /// This will build the RSDP pointer which points to the XSDT table and write it in guest
|
@@ -191,7 +203,16 @@ pub(crate) fn create_acpi_tables(
|
191 | 203 | &device_manager.resource_allocator,
|
192 | 204 | vcpus.len().try_into().unwrap(),
|
193 | 205 | )?;
|
194 |
| - let xsdt_addr = writer.build_xsdt(&device_manager.resource_allocator, fadt_addr, madt_addr)?; |
| 206 | + let mcfg_addr = writer.build_mcfg( |
| 207 | + &device_manager.resource_allocator, |
| 208 | + layout::PCI_MMCONFIG_START, |
| 209 | + )?; |
| 210 | + let xsdt_addr = writer.build_xsdt( |
| 211 | + &device_manager.resource_allocator, |
| 212 | + fadt_addr, |
| 213 | + madt_addr, |
| 214 | + mcfg_addr, |
| 215 | + )?; |
195 | 216 | writer.build_rsdp(xsdt_addr)
|
196 | 217 | }
|
197 | 218 |
|
|
0 commit comments