On 17 February 2016 at 18:07, Graeme Gregory <[email protected]> wrote: > > > On 17/02/2016 16:04, Laszlo Ersek wrote: >> >> On 02/17/16 16:34, Ard Biesheuvel wrote: >>> >>> On 17 February 2016 at 16:11, Laszlo Ersek <[email protected]> wrote: >>>> >>>> On 02/17/16 15:48, Ard Biesheuvel wrote: >>>>> >>>>> AARCH64 systems never require compatibility with legacy ACPI OSes, and >>>>> may not have any 32-bit addressable system RAM. To support ACPI on >>>>> these >>>>> systems, we need to be able to relax the 4 GB allocation restriction. >>>>> >>>>> So add a PCD PcdAcpiAllocateTablesBelow4GB defaulting to TRUE, and wire >>>>> it up to the memory allocation calls in >>>>> AcpiTableDxe/AcpiTableProtocol.c >>>>> >>>>> Note that this will inhibit the publishing of any tables that carry >>>>> only >>>>> 32-bit addresses, i.e., RSDPv1, RSDTv1 and RSDTv3. >>>>> >>>>> Contributed-under: TianoCore Contribution Agreement 1.0 >>>>> Signed-off-by: Ard Biesheuvel <[email protected]> >>>>> --- >>>>> MdeModulePkg/MdeModulePkg.dec | 7 + >>>>> MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf | 2 + >>>>> MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 447 >>>>> ++++++++++++-------- >>>>> 3 files changed, 270 insertions(+), 186 deletions(-) >>>> >>>> Somewhat independently of your patch, I agree 100% that the interface >>>> exposed by EFI_ACPI_TABLE_PROTOCOL is seriously lacking. It doesn't >>>> allow the caller to control the allocation limit (--> see your patch), >>>> nor the UEFI memory type that the copy of the table being installed will >>>> be placed into (it would be valid for the caller to choose between >>>> AcpiReclaim vs. AcpiNVS), nor the question whether the table being >>>> installed should be linked into the RSDT, XSDT, or both. >>>> >>>> I don't find this an implementation problem; this is a problem with the >>>> specification. In particular, in October last year I cross-posted an >>>> email to the USWG and ASWG lists, entitled >>>> >>>> LoadTable vs. EFI_ACPI_TABLE_PROTOCOL >>>> >>>> In that email, I pointed out that the current edk2 implementation of >>>> EFI_ACPI_TABLE_PROTOCOL makes it impossible to support the LoadTable >>>> ACPI operator. Namely, the LoadTable operator requires the definition >>>> block (= AML code) being loaded dynamically to come *from* AcpiNVS type >>>> memory, but edk2's implementation doesn't allow the caller to install >>>> tables into AcpiNVS type memory, *except* those with the signature >>>> "UEFI" -- those however are *data* tables, not definition blocks (= AML >>>> code, like SSDT or DSDT). >>>> >>>> For this reason, I proposed EFI_ACPI_TABLE2_PROTOCOL: >>>> >>>>> - same set of member functions >>>>> - UninstallAcpiTable() works the same >>>>> - InstallAcpiTable() gets a new parameter called MemoryType: >>>>> >>>>> typedef >>>>> EFI_STATUS >>>>> (EFIAPI *EFI_ACPI_TABLE2_INSTALL_ACPI_TABLE) ( >>>>> IN EFI_ACPI_TABLE2_PROTOCOL *This, >>>>> IN VOID *AcpiTableBuffer, >>>>> IN UINTN AcpiTableBufferSize, >>>>> IN EFI_MEMORY_TYPE *MemoryType OPTIONAL, >>>>> OUT UINTN *TableKey >>>>> ); >>>>> >>>>> - If MemoryType is NULL, then the new interface works identically to >>>>> the preexistent one. >>>>> - Otherwise, if EFI_ACPI_TABLE2_PROTOCOL can prove that *MemoryType is >>>>> invalid for the signature detected in AcpiTableBuffer, then >>>>> EFI_INVALID_PARAMETER is returned. >>>>> - Otherwise, the copy of AcpiTableBuffer is allocated from *MemoryType >>>>> memory. >>>>> >>>>> This would allow tables with any (non-standard) signatures to be >>>>> placed in reserved or AcpiNVS memory, regardless of contents. >>>> >>>> My query to the USWG & ASWG garnered exactly *zero* replies. I guess >>>> nobody cared about (or understood) my problem. >>>> >>>> Now I absolutely view your use case as a further parameter that >>>> "EFI_ACPI_TABLE2_PROTOCOL" should expose. From that POV, I support your >>>> use case. >>>> >>>> Regarding the implementation, I guess you are not enthusiastic about >>>> turning this question into a standardization effort. (I tried and >>>> failed.) So, whatever works for you -- I won't review the code, but as >>>> long as it can remain compatible with current clients, given the right >>>> PCD settings, I absolutely support the idea. >>>> >>> You may be right about the lacking EFI_ACPI_PROTOCOL interface, but >>> the hardcoded 4 GB limit is simply an implementation detail, and >>> should be treated as such imo. >> >> Hm, maybe, maybe not. >> >> Namely, RSDT cannot reference tables that are located above 4GB, and the >> UEFI spec says, quote, >> >> EFI_ACPI_TABLE_PROTOCOL.InstallAcpiTable() >> >> [...] >> >> The InstallAcpiTable() function allows a caller to install an ACPI >> table. The ACPI table may either by a System Description Table or >> the FACS. For all tables except for the DSDT and FACS, a copy of >> the table will be linked by the RSDT/XSDT. For the FACS and DSDT, >> the pointer to a copy of the table will be updated in the FADT, if >> present. > > Surely this is a simple case of the spec not being clear that RSDT/XDST > means RSDT or XSDT as appropriate? > > RSDT is optional for systems in ACPI 5.1+ specs. >
Indeed. >> [...] >> >> On successful output, the EFI_ACPI_TABLE_PROTOCOL will ensure that >> the checksum field is correct for both the RSDT/XSDT table and the >> copy of the table being installed that is linked by the RSDT/XSDT. >> >> [...] >> >> That is, following the *letter* of the spec, linkage into the RSDT is >> *not* optional. And that requirement can only be satisfied if the tables >> are located under 4GB. >> No, it is 'linkage into the RSDT/XSDT' that is not optional. In the quote above, '..both the RSDT/XDST and ...' does not refer to both RSDT and XSDT but to the RSDT/XSDT on the one hand and the copy of the table being installed on the other. >> This may actually make the spec unsatisfiable on some aarch64 platforms! >> (And the question could be more than an implementation detail.) Perhaps >> some changes to the UEFI spec cannot be avoided here. >> >>>> (QEMU currently depends on tables being allocated under 4GB, even for >>>> aarch64 guests, as far as I recall.) >>>> >>> Yes, I wondered about that. After the tables are installed, a 16 KB >>> reserved region remains in the UEFI memory map, Does that contain any >>> live payload? >> >> I can't say without looking at specifics, but I don't think it is >> directly related to the ACPI linker/loader client under OvmfPkg. That >> code never allocates reserved memory, only AcpiNVS (and frees most of >> even that, in the end). >> >> I also grepped "MdeModulePkg/Universal/Acpi/AcpiTableDxe" for >> "EfiReservedMemoryType" -- no hits either. >> >> Thanks! >> Laszlo >> >>>> Digressing a bit, I'll also mention that I found out (and reported) the >>>> hard way that Microsoft's ACPI.SYS does not implement the >>>> DataTableRegion operator. (ACPI CA does.) That operator is supposed to >>>> be extremely powerful, it is not optional, and it dates back to the ACPI >>>> 2.0 specification -- which Microsoft co-authored. >>>> >>> I remember that thread :-) >>> >>> Thanks, >>> Ard. >>> > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

