From cd2cf69823fa4b871464a4118d42741e6e257303 Mon Sep 17 00:00:00 2001 From: Mikhail Krichanov Date: Thu, 9 Jan 2025 19:49:16 +0300 Subject: [PATCH] SysCall: Added support for UnicodeCollationProtocol in User space. --- ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 4 +- MdeModulePkg/Core/Dxe/DxeMain.inf | 1 + MdeModulePkg/Core/Dxe/SysCall/BootServices.c | 22 ++ .../Core/Dxe/SysCall/SupportedProtocols.c | 313 ++++++++++++++++++ .../Core/Dxe/SysCall/SupportedProtocols.h | 48 +++ OvmfPkg/OvmfPkgIa32.fdf | 4 +- OvmfPkg/OvmfPkgIa32X64.fdf | 4 +- OvmfPkg/OvmfPkgX64.fdf | 4 +- 8 files changed, 392 insertions(+), 8 deletions(-) diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc index 0fe9186916..3a2e3af481 100644 --- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc @@ -88,9 +88,9 @@ APRIORI DXE { # INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf - INF USER FatPkg/EnhancedFatDxe/Fat.inf + INF FatPkg/EnhancedFatDxe/Fat.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf - INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf + INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf diff --git a/MdeModulePkg/Core/Dxe/DxeMain.inf b/MdeModulePkg/Core/Dxe/DxeMain.inf index a6b4741e30..2f9e558fb5 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.inf +++ b/MdeModulePkg/Core/Dxe/DxeMain.inf @@ -189,6 +189,7 @@ gEfiDiskIoProtocolGuid ## SOMETIMES_CONSUMES gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES gEfiUnicodeCollationProtocolGuid ## SOMETIMES_CONSUMES + gEfiUnicodeCollation2ProtocolGuid ## SOMETIMES_CONSUMES # Arch Protocols gEfiBdsArchProtocolGuid ## CONSUMES diff --git a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c index 92ec9ba360..deb8ef83c0 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c +++ b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c @@ -154,6 +154,11 @@ FindGuid ( *Core = &gEfiGlobalVariableGuid; + } else if (CompareGuid (Ring3, &gEfiUnicodeCollation2ProtocolGuid)) { + + *Core = &gEfiUnicodeCollation2ProtocolGuid; + *CoreSize = sizeof (EFI_UNICODE_COLLATION_PROTOCOL); + } else { DEBUG ((DEBUG_ERROR, "Ring0: Unknown protocol - %g.\n", Ring3)); return EFI_NOT_FOUND; @@ -306,6 +311,7 @@ CallBootService ( EFI_DRIVER_BINDING_PROTOCOL *CoreDriverBinding; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *CoreSimpleFileSystem; + EFI_UNICODE_COLLATION_PROTOCOL *CoreUnicodeCollation; EFI_BLOCK_IO_PROTOCOL *BlockIo; EFI_DISK_IO_PROTOCOL *DiskIo; @@ -495,6 +501,22 @@ CallBootService ( CoreSimpleFileSystem = (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *)CoreArgList[Index + 1]; CoreSimpleFileSystem->OpenVolume = CoreOpenVolume; + } else if ((CompareGuid ((EFI_GUID *)CoreArgList[Index], &gEfiUnicodeCollationProtocolGuid)) + || (CompareGuid ((EFI_GUID *)CoreArgList[Index], &gEfiUnicodeCollation2ProtocolGuid))) { + CoreUnicodeCollation = (EFI_UNICODE_COLLATION_PROTOCOL *)CoreArgList[Index + 1]; + + CoreUnicodeCollation->StriColl = CoreUnicodeCollationStriColl; + CoreUnicodeCollation->MetaiMatch = CoreUnicodeCollationMetaiMatch; + CoreUnicodeCollation->StrLwr = CoreUnicodeCollationStrLwr; + CoreUnicodeCollation->StrUpr = CoreUnicodeCollationStrUpr; + CoreUnicodeCollation->FatToStr = CoreUnicodeCollationFatToStr; + CoreUnicodeCollation->StrToFat = CoreUnicodeCollationStrToFat; + AllowSupervisorAccessToUserMemory (); + CoreUnicodeCollation->SupportedLanguages = AllocateCopyPool ( + AsciiStrSize (CoreUnicodeCollation->SupportedLanguages), + (VOID *)CoreUnicodeCollation->SupportedLanguages + ); + ForbidSupervisorAccessToUserMemory (); } } diff --git a/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c b/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c index f7ccad525b..de06170e07 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c +++ b/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c @@ -808,3 +808,316 @@ CoreOpenVolume ( return Status; } + +INTN +EFIAPI +CoreUnicodeCollationStriColl ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *Str1, + IN CHAR16 *Str2 + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS UserMem; + USER_SPACE_DRIVER *UserDriver; + VOID *EntryPoint; + UINTN Size1; + UINTN Size2; + + UserDriver = FindUserSpaceDriver (This); + ASSERT (UserDriver != NULL); + + This = UserDriver->UserSpaceDriver; + gUserPageTable = UserDriver->UserPageTable; + + Size1 = StrSize (Str1); + Size2 = StrSize (Str2); + + Status = CoreAllocatePages ( + AllocateAnyPages, + EfiRing3MemoryType, + EFI_SIZE_TO_PAGES (Size1 + Size2), + &UserMem + ); + if (EFI_ERROR (Status)) { + return 0; + } + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)(UINTN)UserMem, (VOID *)Str1, Size1); + CopyMem ((VOID *)((UINTN)UserMem + Size1), (VOID *)Str2, Size2); + EntryPoint = (VOID *)This->StriColl; + ForbidSupervisorAccessToUserMemory (); + + Status = GoToRing3 ( + 3, + EntryPoint, + This, + (UINTN)UserMem, + (UINTN)UserMem + Size1 + ); + + CoreFreePages (UserMem, EFI_SIZE_TO_PAGES (Size1 + Size2)); + + return (INTN)Status; +} + +BOOLEAN +EFIAPI +CoreUnicodeCollationMetaiMatch ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN CHAR16 *Pattern + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS UserMem; + USER_SPACE_DRIVER *UserDriver; + VOID *EntryPoint; + UINTN Size1; + UINTN Size2; + + UserDriver = FindUserSpaceDriver (This); + ASSERT (UserDriver != NULL); + + This = UserDriver->UserSpaceDriver; + gUserPageTable = UserDriver->UserPageTable; + + Size1 = StrSize (String); + Size2 = StrSize (Pattern); + + Status = CoreAllocatePages ( + AllocateAnyPages, + EfiRing3MemoryType, + EFI_SIZE_TO_PAGES (Size1 + Size2), + &UserMem + ); + if (EFI_ERROR (Status)) { + return FALSE; + } + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)(UINTN)UserMem, (VOID *)String, Size1); + CopyMem ((VOID *)((UINTN)UserMem + Size1), (VOID *)Pattern, Size2); + EntryPoint = (VOID *)This->MetaiMatch; + ForbidSupervisorAccessToUserMemory (); + + Status = GoToRing3 ( + 3, + EntryPoint, + This, + (UINTN)UserMem, + (UINTN)UserMem + Size1 + ); + + CoreFreePages (UserMem, EFI_SIZE_TO_PAGES (Size1 + Size2)); + + return (BOOLEAN)Status; +} + +VOID +EFIAPI +CoreUnicodeCollationStrLwr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS UserMem; + USER_SPACE_DRIVER *UserDriver; + VOID *EntryPoint; + UINTN Size1; + + UserDriver = FindUserSpaceDriver (This); + ASSERT (UserDriver != NULL); + + This = UserDriver->UserSpaceDriver; + gUserPageTable = UserDriver->UserPageTable; + + Size1 = StrSize (Str); + + Status = CoreAllocatePages ( + AllocateAnyPages, + EfiRing3MemoryType, + EFI_SIZE_TO_PAGES (Size1), + &UserMem + ); + if (EFI_ERROR (Status)) { + return; + } + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)(UINTN)UserMem, (VOID *)Str, Size1); + EntryPoint = (VOID *)This->StrLwr; + ForbidSupervisorAccessToUserMemory (); + + Status = GoToRing3 ( + 2, + EntryPoint, + This, + (UINTN)UserMem + ); + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)Str, (VOID *)(UINTN)UserMem, Size1); + ForbidSupervisorAccessToUserMemory (); + + CoreFreePages (UserMem, EFI_SIZE_TO_PAGES (Size1)); +} + +VOID +EFIAPI +CoreUnicodeCollationStrUpr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS UserMem; + USER_SPACE_DRIVER *UserDriver; + VOID *EntryPoint; + UINTN Size1; + + UserDriver = FindUserSpaceDriver (This); + ASSERT (UserDriver != NULL); + + This = UserDriver->UserSpaceDriver; + gUserPageTable = UserDriver->UserPageTable; + + Size1 = StrSize (Str); + + Status = CoreAllocatePages ( + AllocateAnyPages, + EfiRing3MemoryType, + EFI_SIZE_TO_PAGES (Size1), + &UserMem + ); + if (EFI_ERROR (Status)) { + return; + } + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)(UINTN)UserMem, (VOID *)Str, Size1); + EntryPoint = (VOID *)This->StrUpr; + ForbidSupervisorAccessToUserMemory (); + + Status = GoToRing3 ( + 2, + EntryPoint, + This, + (UINTN)UserMem + ); + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)Str, (VOID *)(UINTN)UserMem, Size1); + ForbidSupervisorAccessToUserMemory (); + + CoreFreePages (UserMem, EFI_SIZE_TO_PAGES (Size1)); +} + +VOID +EFIAPI +CoreUnicodeCollationFatToStr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN UINTN FatSize, + IN CHAR8 *Fat, + OUT CHAR16 *String + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS UserMem; + USER_SPACE_DRIVER *UserDriver; + VOID *EntryPoint; + + UserDriver = FindUserSpaceDriver (This); + ASSERT (UserDriver != NULL); + + This = UserDriver->UserSpaceDriver; + gUserPageTable = UserDriver->UserPageTable; + + Status = CoreAllocatePages ( + AllocateAnyPages, + EfiRing3MemoryType, + EFI_SIZE_TO_PAGES (FatSize * 3), + &UserMem + ); + if (EFI_ERROR (Status)) { + return; + } + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)(UINTN)UserMem, (VOID *)Fat, FatSize); + EntryPoint = (VOID *)This->FatToStr; + ForbidSupervisorAccessToUserMemory (); + + Status = GoToRing3 ( + 4, + EntryPoint, + This, + FatSize, + (UINTN)UserMem, + (UINTN)UserMem + FatSize + ); + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)String, (VOID *)((UINTN)UserMem + FatSize), FatSize * 2); + ForbidSupervisorAccessToUserMemory (); + + CoreFreePages (UserMem, EFI_SIZE_TO_PAGES (FatSize * 3)); +} + +BOOLEAN +EFIAPI +CoreUnicodeCollationStrToFat ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN UINTN FatSize, + OUT CHAR8 *Fat + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS UserMem; + USER_SPACE_DRIVER *UserDriver; + VOID *EntryPoint; + UINTN Size1; + + UserDriver = FindUserSpaceDriver (This); + ASSERT (UserDriver != NULL); + + This = UserDriver->UserSpaceDriver; + gUserPageTable = UserDriver->UserPageTable; + + Size1 = StrSize (String); + + Status = CoreAllocatePages ( + AllocateAnyPages, + EfiRing3MemoryType, + EFI_SIZE_TO_PAGES (FatSize + Size1), + &UserMem + ); + if (EFI_ERROR (Status)) { + return FALSE; + } + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)(UINTN)UserMem, (VOID *)String, Size1); + EntryPoint = (VOID *)This->StrToFat; + ForbidSupervisorAccessToUserMemory (); + + Status = GoToRing3 ( + 4, + EntryPoint, + This, + (UINTN)UserMem, + FatSize, + (UINTN)UserMem + Size1 + ); + + AllowSupervisorAccessToUserMemory (); + CopyMem ((VOID *)Fat, (VOID *)((UINTN)UserMem + Size1), FatSize); + ForbidSupervisorAccessToUserMemory (); + + CoreFreePages (UserMem, EFI_SIZE_TO_PAGES (FatSize + Size1)); + + return (BOOLEAN)Status; +} diff --git a/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.h b/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.h index 0108bfb16f..4507db4a89 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.h +++ b/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.h @@ -51,3 +51,51 @@ CoreOpenVolume ( IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **Root ); + +INTN +EFIAPI +CoreUnicodeCollationStriColl ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *Str1, + IN CHAR16 *Str2 + ); + +BOOLEAN +EFIAPI +CoreUnicodeCollationMetaiMatch ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN CHAR16 *Pattern + ); + +VOID +EFIAPI +CoreUnicodeCollationStrLwr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ); + +VOID +EFIAPI +CoreUnicodeCollationStrUpr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ); + +VOID +EFIAPI +CoreUnicodeCollationFatToStr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN UINTN FatSize, + IN CHAR8 *Fat, + OUT CHAR16 *String + ); + +BOOLEAN +EFIAPI +CoreUnicodeCollationStrToFat ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN UINTN FatSize, + OUT CHAR8 *Fat + ); diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf index 768a7dd1a8..b2a176f324 100644 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ b/OvmfPkg/OvmfPkgIa32.fdf @@ -265,7 +265,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf -INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf +INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf @@ -291,7 +291,7 @@ INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf -INF USER FatPkg/EnhancedFatDxe/Fat.inf +INF FatPkg/EnhancedFatDxe/Fat.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 42b7b1a45e..07c817a87c 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -266,7 +266,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf -INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf +INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf @@ -292,7 +292,7 @@ INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf -INF USER FatPkg/EnhancedFatDxe/Fat.inf +INF FatPkg/EnhancedFatDxe/Fat.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 1c243ee618..42a15d5596 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -295,7 +295,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf -INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf +INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf @@ -321,7 +321,7 @@ INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf -INF USER FatPkg/EnhancedFatDxe/Fat.inf +INF FatPkg/EnhancedFatDxe/Fat.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf