Core/Dxe: Refactored DisableSMAP(), EnableSMAP() names.

This commit is contained in:
Mikhail Krichanov 2024-09-02 12:42:14 +03:00
parent d8aa9c3ea7
commit d74b97ed94
8 changed files with 132 additions and 135 deletions

View File

@ -2749,13 +2749,13 @@ CallRing3 (
VOID VOID
EFIAPI EFIAPI
DisableSMAP ( AllowSupervisorAccessToUserMemory (
VOID VOID
); );
VOID VOID
EFIAPI EFIAPI
EnableSMAP ( ForbidSupervisorAccessToUserMemory (
VOID VOID
); );

View File

@ -767,14 +767,14 @@ CoreExitBootServices (
// Free resources allocated for Ring3. // Free resources allocated for Ring3.
// //
if (gRing3Data != NULL) { if (gRing3Data != NULL) {
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if (gRing3Data->SystemTable.ConfigurationTable != NULL) { if (gRing3Data->SystemTable.ConfigurationTable != NULL) {
CoreFreePages ( CoreFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data->SystemTable.ConfigurationTable, (EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data->SystemTable.ConfigurationTable,
EFI_SIZE_TO_PAGES (gRing3Data->SystemTable.NumberOfTableEntries * sizeof (EFI_CONFIGURATION_TABLE)) EFI_SIZE_TO_PAGES (gRing3Data->SystemTable.NumberOfTableEntries * sizeof (EFI_CONFIGURATION_TABLE))
); );
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
CoreFreePages ( CoreFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data, (EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data,

View File

@ -70,7 +70,7 @@ SysCallBootService (
return Status; return Status;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
CopyMem ((VOID *)((UINTN)Physical + sizeof (UINTN)), (VOID *)UserRsp, 8 * sizeof (UINTN)); CopyMem ((VOID *)((UINTN)Physical + sizeof (UINTN)), (VOID *)UserRsp, 8 * sizeof (UINTN));
SetUefiImageMemoryAttributes ( SetUefiImageMemoryAttributes (
@ -78,7 +78,7 @@ SysCallBootService (
EFI_PAGE_SIZE, EFI_PAGE_SIZE,
EFI_MEMORY_XP EFI_MEMORY_XP
); );
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = CallBootService ( Status = CallBootService (
Type, Type,
@ -180,7 +180,7 @@ InitializeMsr (
VOID VOID
EFIAPI EFIAPI
DisableSMAP ( AllowSupervisorAccessToUserMemory (
VOID VOID
) )
{ {
@ -191,7 +191,7 @@ DisableSMAP (
VOID VOID
EFIAPI EFIAPI
EnableSMAP ( ForbidSupervisorAccessToUserMemory (
VOID VOID
) )
{ {

View File

@ -67,7 +67,7 @@ SysCallBootService (
return Status; return Status;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
// //
// First 3 arguments are passed through R1-R3 and copied to SysCall Stack. // First 3 arguments are passed through R1-R3 and copied to SysCall Stack.
// //
@ -76,7 +76,7 @@ SysCallBootService (
// All remaining arguments are on User Stack. // All remaining arguments are on User Stack.
// //
CopyMem ((VOID *)((UINTN)Physical + 5 * sizeof (UINTN)), (VOID *)UserRsp, 4 * sizeof (UINTN)); CopyMem ((VOID *)((UINTN)Physical + 5 * sizeof (UINTN)), (VOID *)UserRsp, 4 * sizeof (UINTN));
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = CallBootService ( Status = CallBootService (
Type, Type,
@ -110,12 +110,9 @@ InitializeMsr (
InitializeSysCallHandler (SysCallBootService); InitializeSysCallHandler (SysCallBootService);
} }
//
// TODO: Refactoring.
//
VOID VOID
EFIAPI EFIAPI
DisableSMAP ( AllowSupervisorAccessToUserMemory (
VOID VOID
) )
{ {
@ -126,7 +123,7 @@ DisableSMAP (
VOID VOID
EFIAPI EFIAPI
EnableSMAP ( ForbidSupervisorAccessToUserMemory (
VOID VOID
) )
{ {

View File

@ -333,9 +333,9 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + sizeof (VOID *) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + sizeof (VOID *) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = FindGuid ((EFI_GUID *)CoreRbp->Argument1, &CoreProtocol, &MemoryCoreSize); Status = FindGuid ((EFI_GUID *)CoreRbp->Argument1, &CoreProtocol, &MemoryCoreSize);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -346,14 +346,14 @@ CallBootService (
&Interface &Interface
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if (Interface != NULL) { if (Interface != NULL) {
Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize); Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize);
ASSERT (Interface != NULL); ASSERT (Interface != NULL);
*(VOID **)CoreRbp->Argument3 = Interface; *(VOID **)CoreRbp->Argument3 = Interface;
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return Status; return Status;
@ -379,17 +379,17 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 8 * sizeof (UINTN) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 8 * sizeof (UINTN) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize); Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return Status; return Status;
} }
Argument4 = UserRsp->Arguments[4]; Argument4 = UserRsp->Arguments[4];
Argument5 = UserRsp->Arguments[5]; Argument5 = UserRsp->Arguments[5];
Argument6 = UserRsp->Arguments[6]; Argument6 = UserRsp->Arguments[6];
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
(EFI_HANDLE)CoreRbp->Argument1, (EFI_HANDLE)CoreRbp->Argument1,
@ -401,13 +401,13 @@ CallBootService (
); );
if ((VOID **)CoreRbp->Argument3 != NULL) { if ((VOID **)CoreRbp->Argument3 != NULL) {
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if (Interface != NULL) { if (Interface != NULL) {
Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize); Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize);
} }
*(VOID **)CoreRbp->Argument3 = Interface; *(VOID **)CoreRbp->Argument3 = Interface;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
} }
return Status; return Status;
@ -426,7 +426,7 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + sizeof (VOID **) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + sizeof (VOID **) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
CoreHandle = *(EFI_HANDLE *)CoreRbp->Argument1; CoreHandle = *(EFI_HANDLE *)CoreRbp->Argument1;
UserArgList = (VOID **)CoreRbp->Argument2; UserArgList = (VOID **)CoreRbp->Argument2;
@ -440,7 +440,7 @@ CallBootService (
Status = FindGuid ((EFI_GUID *)UserArgList[Index], (EFI_GUID **)&CoreArgList[Index], &MemoryCoreSize); Status = FindGuid ((EFI_GUID *)UserArgList[Index], (EFI_GUID **)&CoreArgList[Index], &MemoryCoreSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
while (Index > 0) { while (Index > 0) {
FreePool (CoreArgList[Index - 1]); FreePool (CoreArgList[Index - 1]);
@ -460,7 +460,7 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)&UserArgList[Index + 2] + sizeof (VOID *) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)&UserArgList[Index + 2] + sizeof (VOID *) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
ASSERT (Index < MAX_LIST); ASSERT (Index < MAX_LIST);
CoreArgList[Index] = NULL; CoreArgList[Index] = NULL;
@ -483,9 +483,9 @@ CallBootService (
CoreSimpleFileSystem->OpenVolume = CoreOpenVolume; CoreSimpleFileSystem->OpenVolume = CoreOpenVolume;
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
mRing3SimpleFileSystemPointer = (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *)UserArgList[Index + 1]; mRing3SimpleFileSystemPointer = (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *)UserArgList[Index + 1];
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
} }
} }
@ -512,15 +512,15 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 6 * sizeof (UINTN) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 6 * sizeof (UINTN) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize); Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return Status; return Status;
} }
Argument4 = UserRsp->Arguments[4]; Argument4 = UserRsp->Arguments[4];
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = gBS->CloseProtocol ( Status = gBS->CloseProtocol (
(EFI_HANDLE)CoreRbp->Argument1, (EFI_HANDLE)CoreRbp->Argument1,
@ -546,9 +546,9 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + sizeof (VOID *) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + sizeof (VOID *) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize); Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -559,14 +559,14 @@ CallBootService (
&Interface &Interface
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if (Interface != NULL) { if (Interface != NULL) {
Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize); Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize);
ASSERT (Interface != NULL); ASSERT (Interface != NULL);
*(VOID **)CoreRbp->Argument3 = Interface; *(VOID **)CoreRbp->Argument3 = Interface;
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return Status; return Status;
@ -587,14 +587,14 @@ CallBootService (
(EFI_PHYSICAL_ADDRESS *)&Argument4 (EFI_PHYSICAL_ADDRESS *)&Argument4
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + sizeof (EFI_PHYSICAL_ADDRESS) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + sizeof (EFI_PHYSICAL_ADDRESS) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
*(EFI_PHYSICAL_ADDRESS *)UserRsp->Arguments[4] = (EFI_PHYSICAL_ADDRESS)Argument4; *(EFI_PHYSICAL_ADDRESS *)UserRsp->Arguments[4] = (EFI_PHYSICAL_ADDRESS)Argument4;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return Status; return Status;
@ -643,9 +643,9 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + sizeof (EFI_GUID) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + sizeof (EFI_GUID) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize); Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -662,7 +662,7 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 7 * sizeof (UINTN) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 7 * sizeof (UINTN) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if ((UINTN *)UserRsp->Arguments[4] != NULL) { if ((UINTN *)UserRsp->Arguments[4] != NULL) {
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
@ -696,7 +696,7 @@ CallBootService (
*(EFI_HANDLE **)UserRsp->Arguments[5] = (EFI_HANDLE *)(UINTN)Ring3Pages; *(EFI_HANDLE **)UserRsp->Arguments[5] = (EFI_HANDLE *)(UINTN)Ring3Pages;
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return StatusBS; return StatusBS;
@ -720,9 +720,9 @@ CallBootService (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
CopyMem ((VOID *)Argument4, (VOID *)CoreRbp->Argument1, CoreRbp->Argument2); CopyMem ((VOID *)Argument4, (VOID *)CoreRbp->Argument1, CoreRbp->Argument2);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = gBS->CalculateCrc32 ( Status = gBS->CalculateCrc32 (
(VOID *)Argument4, (VOID *)Argument4,
@ -730,9 +730,9 @@ CallBootService (
(UINT32 *)&Argument5 (UINT32 *)&Argument5
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
*(UINT32 *)CoreRbp->Argument3 = (UINT32)Argument5; *(UINT32 *)CoreRbp->Argument3 = (UINT32)Argument5;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return Status; return Status;
@ -759,19 +759,19 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 7 * sizeof (UINTN) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 7 * sizeof (UINTN) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument1 + StrSize ((CHAR16 *)CoreRbp->Argument1) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument1 + StrSize ((CHAR16 *)CoreRbp->Argument1) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument6 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument1), (CHAR16 *)CoreRbp->Argument1); Argument6 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument1), (CHAR16 *)CoreRbp->Argument1);
if ((VOID *)Argument6 == NULL) { if ((VOID *)Argument6 == NULL) {
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize); Status = FindGuid ((EFI_GUID *)CoreRbp->Argument2, &CoreProtocol, &MemoryCoreSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument6); FreePool ((VOID *)Argument6);
return Status; return Status;
} }
@ -791,12 +791,12 @@ CallBootService (
Argument5 = (UINTN)AllocatePool (Argument4); Argument5 = (UINTN)AllocatePool (Argument4);
if ((VOID *)Argument5 == NULL) { if ((VOID *)Argument5 == NULL) {
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument6); FreePool ((VOID *)Argument6);
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = gRT->GetVariable ( Status = gRT->GetVariable (
(CHAR16 *)Argument6, (CHAR16 *)Argument6,
@ -806,7 +806,7 @@ CallBootService (
(VOID *)Argument5 (VOID *)Argument5
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if ((VOID *)UserRsp->Arguments[5] != NULL) { if ((VOID *)UserRsp->Arguments[5] != NULL) {
CopyMem ((VOID *)UserRsp->Arguments[5], (VOID *)Argument5, Argument4); CopyMem ((VOID *)UserRsp->Arguments[5], (VOID *)Argument5, Argument4);
} }
@ -816,7 +816,7 @@ CallBootService (
if ((UINT32 *)CoreRbp->Argument3 != NULL) { if ((UINT32 *)CoreRbp->Argument3 != NULL) {
*(UINT32 *)CoreRbp->Argument3 = (UINT32)Attributes; *(UINT32 *)CoreRbp->Argument3 = (UINT32)Attributes;
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument6); FreePool ((VOID *)Argument6);
@ -863,7 +863,7 @@ CallBootService (
#endif #endif
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
#if defined (MDE_CPU_ARM) #if defined (MDE_CPU_ARM)
// //
// EFI_LBA Lba is aligned on 8 bytes. // EFI_LBA Lba is aligned on 8 bytes.
@ -872,7 +872,7 @@ CallBootService (
#else #else
Attributes = *(UINT64 *)&UserRsp->Arguments[5]; Attributes = *(UINT64 *)&UserRsp->Arguments[5];
#endif #endif
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Argument5 = (UINTN)AllocatePool (CoreRbp->Argument3); Argument5 = (UINTN)AllocatePool (CoreRbp->Argument3);
if ((VOID *)Argument5 == NULL) { if ((VOID *)Argument5 == NULL) {
@ -886,14 +886,14 @@ CallBootService (
CoreRbp->Argument3, CoreRbp->Argument3,
(VOID *)Argument5 (VOID *)Argument5
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, CoreRbp->Argument3); CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, CoreRbp->Argument3);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument5); FreePool ((VOID *)Argument5);
@ -925,7 +925,7 @@ CallBootService (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes);
@ -941,7 +941,7 @@ CallBootService (
#else #else
Attributes = *(UINT64 *)&UserRsp->Arguments[5]; Attributes = *(UINT64 *)&UserRsp->Arguments[5];
#endif #endif
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = BlockIo->WriteBlocks ( Status = BlockIo->WriteBlocks (
BlockIo, BlockIo,
@ -988,7 +988,7 @@ CallBootService (
#endif #endif
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
#if defined (MDE_CPU_ARM) #if defined (MDE_CPU_ARM)
// //
// UINT64 Offset is aligned on 8 bytes. // UINT64 Offset is aligned on 8 bytes.
@ -997,7 +997,7 @@ CallBootService (
#else #else
Attributes = *(UINT64 *)&UserRsp->Arguments[5]; Attributes = *(UINT64 *)&UserRsp->Arguments[5];
#endif #endif
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Argument5 = (UINTN)AllocatePool (CoreRbp->Argument3); Argument5 = (UINTN)AllocatePool (CoreRbp->Argument3);
if ((VOID *)Argument5 == NULL) { if ((VOID *)Argument5 == NULL) {
@ -1011,14 +1011,14 @@ CallBootService (
CoreRbp->Argument3, CoreRbp->Argument3,
(VOID *)Argument5 (VOID *)Argument5
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, CoreRbp->Argument3); CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, CoreRbp->Argument3);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument5); FreePool ((VOID *)Argument5);
@ -1050,7 +1050,7 @@ CallBootService (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp->Arguments[4] + CoreRbp->Argument3 - 1), &Attributes);
@ -1066,7 +1066,7 @@ CallBootService (
#else #else
Attributes = *(UINT64 *)&UserRsp->Arguments[5]; Attributes = *(UINT64 *)&UserRsp->Arguments[5];
#endif #endif
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = DiskIo->WriteDisk ( Status = DiskIo->WriteDisk (
DiskIo, DiskIo,
@ -1096,12 +1096,12 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2); Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument4 == NULL) { if ((VOID *)Argument4 == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -1111,12 +1111,12 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument3, &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument3, &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + StrSize ((CHAR16 *)CoreRbp->Argument3) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + StrSize ((CHAR16 *)CoreRbp->Argument3) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument5 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument3), (CHAR16 *)CoreRbp->Argument3); Argument5 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument3), (CHAR16 *)CoreRbp->Argument3);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument5 == NULL) { if ((VOID *)Argument5 == NULL) {
if ((VOID *)Argument4 != NULL) { if ((VOID *)Argument4 != NULL) {
FreePool ((VOID *)Argument4); FreePool ((VOID *)Argument4);
@ -1158,12 +1158,12 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2); Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument4 == NULL) { if ((VOID *)Argument4 == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -1173,12 +1173,12 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument3, &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument3, &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + StrSize ((CHAR16 *)CoreRbp->Argument3) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + StrSize ((CHAR16 *)CoreRbp->Argument3) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument5 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument3), (CHAR16 *)CoreRbp->Argument3); Argument5 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument3), (CHAR16 *)CoreRbp->Argument3);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument5 == NULL) { if ((VOID *)Argument5 == NULL) {
if ((VOID *)Argument4 != NULL) { if ((VOID *)Argument4 != NULL) {
FreePool ((VOID *)Argument4); FreePool ((VOID *)Argument4);
@ -1219,12 +1219,12 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2); Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument4 == NULL) { if ((VOID *)Argument4 == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -1236,9 +1236,9 @@ CallBootService (
); );
if ((VOID *)Argument4 != NULL) { if ((VOID *)Argument4 != NULL) {
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = StrCpyS ((CHAR16 *)CoreRbp->Argument2, StrLen ((CHAR16 *)CoreRbp->Argument2) + 1, (CHAR16 *)Argument4); Status = StrCpyS ((CHAR16 *)CoreRbp->Argument2, StrLen ((CHAR16 *)CoreRbp->Argument2) + 1, (CHAR16 *)Argument4);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument4); FreePool ((VOID *)Argument4);
} }
@ -1260,12 +1260,12 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2); Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument4 == NULL) { if ((VOID *)Argument4 == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -1277,9 +1277,9 @@ CallBootService (
); );
if ((VOID *)Argument4 != NULL) { if ((VOID *)Argument4 != NULL) {
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = StrCpyS ((CHAR16 *)CoreRbp->Argument2, StrLen ((CHAR16 *)CoreRbp->Argument2) + 1, (CHAR16 *)Argument4); Status = StrCpyS ((CHAR16 *)CoreRbp->Argument2, StrLen ((CHAR16 *)CoreRbp->Argument2) + 1, (CHAR16 *)Argument4);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument4); FreePool ((VOID *)Argument4);
} }
@ -1305,9 +1305,9 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + CoreRbp->Argument2 - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument3 + CoreRbp->Argument2 - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Argument4 = (UINTN)AllocateCopyPool (CoreRbp->Argument2, (CHAR8 *)CoreRbp->Argument3); Argument4 = (UINTN)AllocateCopyPool (CoreRbp->Argument2, (CHAR8 *)CoreRbp->Argument3);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument4 == NULL) { if ((VOID *)Argument4 == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -1316,7 +1316,7 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 6 * sizeof (UINTN) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 6 * sizeof (UINTN) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if ((CHAR16 *)UserRsp->Arguments[4] != NULL) { if ((CHAR16 *)UserRsp->Arguments[4] != NULL) {
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
@ -1332,7 +1332,7 @@ CallBootService (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Unicode->FatToStr ( Unicode->FatToStr (
Unicode, Unicode,
@ -1346,9 +1346,9 @@ CallBootService (
} }
if ((VOID *)Argument5 != NULL) { if ((VOID *)Argument5 != NULL) {
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, 2 * (CoreRbp->Argument2 + 1)); CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, 2 * (CoreRbp->Argument2 + 1));
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument5); FreePool ((VOID *)Argument5);
} }
@ -1372,12 +1372,12 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)CoreRbp->Argument2, &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(CoreRbp->Argument2 + StrSize ((CHAR16 *)CoreRbp->Argument2) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2); Argument4 = (UINTN)AllocateCopyPool (StrSize ((CHAR16 *)CoreRbp->Argument2), (CHAR16 *)CoreRbp->Argument2);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if ((VOID *)Argument4 == NULL) { if ((VOID *)Argument4 == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -1386,7 +1386,7 @@ CallBootService (
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 6 * sizeof (UINTN) - 1), &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)((UINTN)UserRsp + 6 * sizeof (UINTN) - 1), &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if ((CHAR8 *)UserRsp->Arguments[4] != NULL) { if ((CHAR8 *)UserRsp->Arguments[4] != NULL) {
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes); gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)UserRsp->Arguments[4], &Attributes);
ASSERT ((Attributes & EFI_MEMORY_USER) != 0); ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
@ -1402,7 +1402,7 @@ CallBootService (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
} }
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = (EFI_STATUS)Unicode->StrToFat ( Status = (EFI_STATUS)Unicode->StrToFat (
Unicode, Unicode,
@ -1416,9 +1416,9 @@ CallBootService (
} }
if ((VOID *)Argument5 != NULL) { if ((VOID *)Argument5 != NULL) {
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, CoreRbp->Argument3); CopyMem ((VOID *)UserRsp->Arguments[4], (VOID *)Argument5, CoreRbp->Argument3);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
FreePool ((VOID *)Argument5); FreePool ((VOID *)Argument5);
} }

View File

@ -20,12 +20,12 @@ SECTION .text
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; VOID ; VOID
; EFIAPI ; EFIAPI
; DisableSMAP ( ; AllowSupervisorAccessToUserMemory (
; VOID ; VOID
; ); ; );
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
global ASM_PFX(DisableSMAP) global ASM_PFX(AllowSupervisorAccessToUserMemory)
ASM_PFX(DisableSMAP): ASM_PFX(AllowSupervisorAccessToUserMemory):
pushfd pushfd
pop eax pop eax
or eax, 0x40000 ; Set AC (bit 18) or eax, 0x40000 ; Set AC (bit 18)
@ -36,12 +36,12 @@ ASM_PFX(DisableSMAP):
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; VOID ; VOID
; EFIAPI ; EFIAPI
; EnableSMAP ( ; ForbidSupervisorAccessToUserMemory (
; VOID ; VOID
; ); ; );
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
global ASM_PFX(EnableSMAP) global ASM_PFX(ForbidSupervisorAccessToUserMemory)
ASM_PFX(EnableSMAP): ASM_PFX(ForbidSupervisorAccessToUserMemory):
pushfd pushfd
pop eax pop eax
and eax, ~0x40000 ; Clear AC (bit 18) and eax, ~0x40000 ; Clear AC (bit 18)
@ -131,14 +131,14 @@ ASM_PFX(CoreBootServices):
je coreReturnAddress je coreReturnAddress
; Prepare CallBootService arguments. ; Prepare CallBootService arguments.
call ASM_PFX(DisableSMAP) call ASM_PFX(AllowSupervisorAccessToUserMemory)
mov eax, [edx + 4 * 4] ; User Argument 3 mov eax, [edx + 4 * 4] ; User Argument 3
push eax push eax
mov eax, [edx + 3 * 4] ; User Argument 2 mov eax, [edx + 3 * 4] ; User Argument 2
push eax push eax
mov eax, [edx + 2 * 4] ; User Argument 1 mov eax, [edx + 2 * 4] ; User Argument 1
push eax push eax
call ASM_PFX(EnableSMAP) call ASM_PFX(ForbidSupervisorAccessToUserMemory)
mov ebp, esp mov ebp, esp
push edx push edx
push ebp push ebp
@ -209,10 +209,10 @@ coreReturnAddress:
pop ebp pop ebp
pop ebx pop ebx
call ASM_PFX(DisableSMAP) call ASM_PFX(AllowSupervisorAccessToUserMemory)
mov eax, [edx + 2 * 4] ; User Argument 1 mov eax, [edx + 2 * 4] ; User Argument 1
push eax push eax
call ASM_PFX(EnableSMAP) call ASM_PFX(ForbidSupervisorAccessToUserMemory)
pop eax pop eax
sti sti

View File

@ -51,7 +51,7 @@ GoToRing3 (
Input = (RING3_CALL_DATA *)(UINTN)Ring3Pages; Input = (RING3_CALL_DATA *)(UINTN)Ring3Pages;
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Input->NumberOfArguments = Number; Input->NumberOfArguments = Number;
Input->EntryPoint = EntryPoint; Input->EntryPoint = EntryPoint;
@ -60,7 +60,7 @@ GoToRing3 (
Input->Arguments[Index] = VA_ARG (Marker, UINTN); Input->Arguments[Index] = VA_ARG (Marker, UINTN);
} }
VA_END (Marker); VA_END (Marker);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
#if defined (MDE_CPU_X64) || defined (MDE_CPU_IA32) #if defined (MDE_CPU_X64) || defined (MDE_CPU_IA32)
if (Number == 2) { if (Number == 2) {
@ -98,7 +98,7 @@ GoToRing3 (
// Problem 2: Uart memory maped page is not allocated at the very beginnig // Problem 2: Uart memory maped page is not allocated at the very beginnig
// and can be used for translation table later. // and can be used for translation table later.
// //
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
// //
// Problem 3: QEMU ramdomly breaks GP registers' context. // Problem 3: QEMU ramdomly breaks GP registers' context.
// //
@ -107,7 +107,7 @@ GoToRing3 (
EFI_PAGE_SIZE, EFI_PAGE_SIZE,
EFI_MEMORY_XP EFI_MEMORY_XP
); );
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
#endif #endif
CoreFreePages (Ring3Pages, PagesNumber); CoreFreePages (Ring3Pages, PagesNumber);
@ -136,9 +136,9 @@ Ring3Copy (
return NULL; return NULL;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
CopyMem ((VOID *)(UINTN)Ring3, Core, Size); CopyMem ((VOID *)(UINTN)Ring3, Core, Size);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
return (VOID *)(UINTN)Ring3; return (VOID *)(UINTN)Ring3;
} }
@ -300,9 +300,9 @@ CoreFileRead (
Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages; Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages;
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
*Ring3BufferSize = *BufferSize; *Ring3BufferSize = *BufferSize;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if (Buffer != NULL) { if (Buffer != NULL) {
Ring3Buffer = (VOID *)((UINTN *)(UINTN)Ring3Pages + 1); Ring3Buffer = (VOID *)((UINTN *)(UINTN)Ring3Pages + 1);
@ -316,13 +316,13 @@ CoreFileRead (
Ring3Buffer Ring3Buffer
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if ((Ring3Buffer != NULL) && (Buffer != NULL) && (*BufferSize >= *Ring3BufferSize)) { if ((Ring3Buffer != NULL) && (Buffer != NULL) && (*BufferSize >= *Ring3BufferSize)) {
CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize); CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize);
} }
*BufferSize = *Ring3BufferSize; *BufferSize = *Ring3BufferSize;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
CoreFreePages (Ring3Pages, PagesNumber); CoreFreePages (Ring3Pages, PagesNumber);
@ -414,9 +414,9 @@ CoreFileGetPosition (
return Status; return Status;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
*(UINT64 *)(UINTN)Ring3Position = *Position; *(UINT64 *)(UINTN)Ring3Position = *Position;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 ( Status = GoToRing3 (
2, 2,
@ -425,9 +425,9 @@ CoreFileGetPosition (
Ring3Position Ring3Position
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
*Position = *(UINT64 *)(UINTN)Ring3Position; *Position = *(UINT64 *)(UINTN)Ring3Position;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
CoreFreePages (Ring3Position, 1); CoreFreePages (Ring3Position, 1);
@ -475,9 +475,9 @@ CoreFileGetInfo (
Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages; Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages;
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
*Ring3BufferSize = *BufferSize; *Ring3BufferSize = *BufferSize;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if (Buffer != NULL) { if (Buffer != NULL) {
Ring3Buffer = (VOID *)((UINTN *)(UINTN)Ring3Pages + 1); Ring3Buffer = (VOID *)((UINTN *)(UINTN)Ring3Pages + 1);
@ -486,9 +486,9 @@ CoreFileGetInfo (
if (InformationType != NULL) { if (InformationType != NULL) {
Ring3InformationType = (EFI_GUID *)((UINTN)Ring3Pages + sizeof (UINTN *) + *BufferSize); Ring3InformationType = (EFI_GUID *)((UINTN)Ring3Pages + sizeof (UINTN *) + *BufferSize);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
CopyGuid (Ring3InformationType, InformationType); CopyGuid (Ring3InformationType, InformationType);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
} }
Status = GoToRing3 ( Status = GoToRing3 (
@ -500,13 +500,13 @@ CoreFileGetInfo (
Ring3Buffer Ring3Buffer
); );
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
if ((Ring3Buffer != NULL) && (Buffer != NULL) && (*BufferSize >= *Ring3BufferSize)) { if ((Ring3Buffer != NULL) && (Buffer != NULL) && (*BufferSize >= *Ring3BufferSize)) {
CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize); CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize);
} }
*BufferSize = *Ring3BufferSize; *BufferSize = *Ring3BufferSize;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
CoreFreePages (Ring3Pages, PagesNumber); CoreFreePages (Ring3Pages, PagesNumber);
@ -628,9 +628,9 @@ CoreFileOpen (
Ring3NewHandle = (EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages; Ring3NewHandle = (EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages;
Ring3FileName = (CHAR16 *)((EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages + 1); Ring3FileName = (CHAR16 *)((EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages + 1);
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
Status = StrCpyS (Ring3FileName, StrLen (FileName) + 1, FileName); Status = StrCpyS (Ring3FileName, StrLen (FileName) + 1, FileName);
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
*NewHandle = NULL; *NewHandle = NULL;
CoreFreePages (Ring3Pages, PagesNumber); CoreFreePages (Ring3Pages, PagesNumber);
@ -706,9 +706,9 @@ CoreFileOpen (
NewFile->Protocol.WriteEx = CoreFileWriteEx; NewFile->Protocol.WriteEx = CoreFileWriteEx;
NewFile->Protocol.FlushEx = CoreFileFlushEx; NewFile->Protocol.FlushEx = CoreFileFlushEx;
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
NewFile->Ring3File = *Ring3NewHandle; NewFile->Ring3File = *Ring3NewHandle;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
*NewHandle = (EFI_FILE_PROTOCOL *)NewFile; *NewHandle = (EFI_FILE_PROTOCOL *)NewFile;
@ -765,7 +765,7 @@ CoreOpenVolume (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DisableSMAP (); AllowSupervisorAccessToUserMemory ();
mRing3FileProtocol.Revision = (*Ring3Root)->Revision; mRing3FileProtocol.Revision = (*Ring3Root)->Revision;
mRing3FileProtocol.Open = (*Ring3Root)->Open; mRing3FileProtocol.Open = (*Ring3Root)->Open;
mRing3FileProtocol.Close = (*Ring3Root)->Close; mRing3FileProtocol.Close = (*Ring3Root)->Close;
@ -783,7 +783,7 @@ CoreOpenVolume (
mRing3FileProtocol.FlushEx = (*Ring3Root)->FlushEx; mRing3FileProtocol.FlushEx = (*Ring3Root)->FlushEx;
File->Ring3File = *Ring3Root; File->Ring3File = *Ring3Root;
EnableSMAP (); ForbidSupervisorAccessToUserMemory ();
File->Protocol.Revision = mRing3FileProtocol.Revision; File->Protocol.Revision = mRing3FileProtocol.Revision;
File->Protocol.Open = CoreFileOpen; File->Protocol.Open = CoreFileOpen;

View File

@ -18,12 +18,12 @@ SECTION .text
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; VOID ; VOID
; EFIAPI ; EFIAPI
; DisableSMAP ( ; AllowSupervisorAccessToUserMemory (
; VOID ; VOID
; ); ; );
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
global ASM_PFX(DisableSMAP) global ASM_PFX(AllowSupervisorAccessToUserMemory)
ASM_PFX(DisableSMAP): ASM_PFX(AllowSupervisorAccessToUserMemory):
pushfq pushfq
pop r10 pop r10
or r10, 0x40000 ; Set AC (bit 18) or r10, 0x40000 ; Set AC (bit 18)
@ -34,12 +34,12 @@ ASM_PFX(DisableSMAP):
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; VOID ; VOID
; EFIAPI ; EFIAPI
; EnableSMAP ( ; ForbidSupervisorAccessToUserMemory (
; VOID ; VOID
; ); ; );
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
global ASM_PFX(EnableSMAP) global ASM_PFX(ForbidSupervisorAccessToUserMemory)
ASM_PFX(EnableSMAP): ASM_PFX(ForbidSupervisorAccessToUserMemory):
pushfq pushfq
pop r10 pop r10
and r10, ~0x40000 ; Clear AC (bit 18) and r10, ~0x40000 ; Clear AC (bit 18)