|
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