SysCall: Added support for UnicodeCollationProtocol in User space.

This commit is contained in:
Mikhail Krichanov 2025-01-09 19:49:16 +03:00
parent 4975e50cf4
commit cd2cf69823
8 changed files with 392 additions and 8 deletions

View File

@ -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

View File

@ -189,6 +189,7 @@
gEfiDiskIoProtocolGuid ## SOMETIMES_CONSUMES
gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES
gEfiUnicodeCollationProtocolGuid ## SOMETIMES_CONSUMES
gEfiUnicodeCollation2ProtocolGuid ## SOMETIMES_CONSUMES
# Arch Protocols
gEfiBdsArchProtocolGuid ## CONSUMES

View File

@ -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 ();
}
}

View File

@ -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;
}

View File

@ -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
);

View File

@ -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

View File

@ -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

View File

@ -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