diff --git a/MdeModulePkg/Core/Dxe/DxeMain.h b/MdeModulePkg/Core/Dxe/DxeMain.h index 688c508a82..dc0a89e9fd 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.h +++ b/MdeModulePkg/Core/Dxe/DxeMain.h @@ -238,6 +238,7 @@ typedef struct { VOID *UserSpaceDriver; UINTN UserPageTable; UINTN UserStackTop; + UINT8 NumberOfCalls; LIST_ENTRY Link; } USER_SPACE_DRIVER; diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 410afacef8..26d00b8efb 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -1743,6 +1743,7 @@ CoreStartImage ( UserDriver->UserSpaceDriver = (VOID *)Image->EntryPoint; UserDriver->UserPageTable = Image->UserPageTable; UserDriver->UserStackTop = Image->UserStackTop; + UserDriver->NumberOfCalls = 0; InsertTailList (&gUserSpaceDriversHead, &UserDriver->Link); diff --git a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c index e6dbe42a4d..988fb7c9c9 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c +++ b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c @@ -548,6 +548,7 @@ CallBootService ( NewDriver->UserSpaceDriver = UserArgList[Index + 1]; NewDriver->UserPageTable = UserDriver->UserPageTable; NewDriver->UserStackTop = UserDriver->UserStackTop; + NewDriver->NumberOfCalls = 0; InsertTailList (&gUserSpaceDriversHead, &NewDriver->Link); } diff --git a/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c b/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c index ced0053ae3..91820e3713 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c +++ b/MdeModulePkg/Core/Dxe/SysCall/SupportedProtocols.c @@ -8,6 +8,8 @@ #include "DxeMain.h" #include "SupportedProtocols.h" +#define MAX_CALL 1 + LIST_ENTRY gUserSpaceDriversHead = INITIALIZE_LIST_HEAD_VARIABLE (gUserSpaceDriversHead); EFI_STATUS @@ -33,6 +35,10 @@ GoToRing3 ( EFI_PHYSICAL_ADDRESS Ring3Pages; UINT32 PagesNumber; + if (UserDriver->NumberOfCalls > MAX_CALL) { + return EFI_OUT_OF_RESOURCES; + } + PagesNumber = (UINT32)EFI_SIZE_TO_PAGES (sizeof (RING3_CALL_DATA) + Number * sizeof (UINTN)); Status = CoreAllocatePages ( @@ -61,11 +67,15 @@ GoToRing3 ( // TODO: Allocate new stacks (only for EFI_FILE_PROTOCOL instances?), // because UserDriver can be interrupted and interrupt handler may call the same UserDriver again. // + ++UserDriver->NumberOfCalls; + Status = CallRing3 ( Input, UserDriver->UserStackTop ); + --UserDriver->NumberOfCalls; + CoreFreePages (Ring3Pages, PagesNumber); return Status; @@ -754,6 +764,7 @@ CoreFileOpen ( NewDriver->CoreWrapper = NewFile; NewDriver->UserPageTable = UserDriver->UserPageTable; NewDriver->UserStackTop = UserDriver->UserStackTop; + NewDriver->NumberOfCalls = 0; AllowSupervisorAccessToUserMemory (); NewDriver->UserSpaceDriver = *Ring3NewHandle; @@ -855,6 +866,7 @@ CoreSimpleFileSystemOpenVolume ( NewDriver->CoreWrapper = File; NewDriver->UserPageTable = UserDriver->UserPageTable; NewDriver->UserStackTop = UserDriver->UserStackTop; + NewDriver->NumberOfCalls = 0; AllowSupervisorAccessToUserMemory (); NewDriver->UserSpaceDriver = *Ring3Root;