SysCall: Added NumberOfCalls to USER_SPACE_DRIVER.

This commit is contained in:
Mikhail Krichanov 2025-01-24 11:50:46 +03:00
parent 72c747b365
commit 734748e862
4 changed files with 15 additions and 0 deletions

View File

@ -238,6 +238,7 @@ typedef struct {
VOID *UserSpaceDriver;
UINTN UserPageTable;
UINTN UserStackTop;
UINT8 NumberOfCalls;
LIST_ENTRY Link;
} USER_SPACE_DRIVER;

View File

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

View File

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

View File

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