mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-26 15:14:02 +02:00
SysCall: Added NumberOfCalls to USER_SPACE_DRIVER.
This commit is contained in:
parent
c5476bf51c
commit
fd4fbf2a26
@ -239,6 +239,7 @@ typedef struct {
|
|||||||
VOID *UserSpaceDriver;
|
VOID *UserSpaceDriver;
|
||||||
UINTN UserPageTable;
|
UINTN UserPageTable;
|
||||||
UINTN UserStackTop;
|
UINTN UserStackTop;
|
||||||
|
UINT8 NumberOfCalls;
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
} USER_SPACE_DRIVER;
|
} USER_SPACE_DRIVER;
|
||||||
|
|
||||||
|
@ -1743,6 +1743,7 @@ CoreStartImage (
|
|||||||
UserDriver->UserSpaceDriver = (VOID *)Image->EntryPoint;
|
UserDriver->UserSpaceDriver = (VOID *)Image->EntryPoint;
|
||||||
UserDriver->UserPageTable = Image->UserPageTable;
|
UserDriver->UserPageTable = Image->UserPageTable;
|
||||||
UserDriver->UserStackTop = Image->UserStackTop;
|
UserDriver->UserStackTop = Image->UserStackTop;
|
||||||
|
UserDriver->NumberOfCalls = 0;
|
||||||
|
|
||||||
InsertTailList (&gUserSpaceDriversHead, &UserDriver->Link);
|
InsertTailList (&gUserSpaceDriversHead, &UserDriver->Link);
|
||||||
|
|
||||||
|
@ -548,6 +548,7 @@ CallBootService (
|
|||||||
NewDriver->UserSpaceDriver = UserArgList[Index + 1];
|
NewDriver->UserSpaceDriver = UserArgList[Index + 1];
|
||||||
NewDriver->UserPageTable = UserDriver->UserPageTable;
|
NewDriver->UserPageTable = UserDriver->UserPageTable;
|
||||||
NewDriver->UserStackTop = UserDriver->UserStackTop;
|
NewDriver->UserStackTop = UserDriver->UserStackTop;
|
||||||
|
NewDriver->NumberOfCalls = 0;
|
||||||
|
|
||||||
InsertTailList (&gUserSpaceDriversHead, &NewDriver->Link);
|
InsertTailList (&gUserSpaceDriversHead, &NewDriver->Link);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include "DxeMain.h"
|
#include "DxeMain.h"
|
||||||
#include "SupportedProtocols.h"
|
#include "SupportedProtocols.h"
|
||||||
|
|
||||||
|
#define MAX_CALL 1
|
||||||
|
|
||||||
LIST_ENTRY gUserSpaceDriversHead = INITIALIZE_LIST_HEAD_VARIABLE (gUserSpaceDriversHead);
|
LIST_ENTRY gUserSpaceDriversHead = INITIALIZE_LIST_HEAD_VARIABLE (gUserSpaceDriversHead);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -33,6 +35,10 @@ GoToRing3 (
|
|||||||
EFI_PHYSICAL_ADDRESS Ring3Pages;
|
EFI_PHYSICAL_ADDRESS Ring3Pages;
|
||||||
UINT32 PagesNumber;
|
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));
|
PagesNumber = (UINT32)EFI_SIZE_TO_PAGES (sizeof (RING3_CALL_DATA) + Number * sizeof (UINTN));
|
||||||
|
|
||||||
Status = CoreAllocatePages (
|
Status = CoreAllocatePages (
|
||||||
@ -61,11 +67,15 @@ GoToRing3 (
|
|||||||
// TODO: Allocate new stacks (only for EFI_FILE_PROTOCOL instances?),
|
// TODO: Allocate new stacks (only for EFI_FILE_PROTOCOL instances?),
|
||||||
// because UserDriver can be interrupted and interrupt handler may call the same UserDriver again.
|
// because UserDriver can be interrupted and interrupt handler may call the same UserDriver again.
|
||||||
//
|
//
|
||||||
|
++UserDriver->NumberOfCalls;
|
||||||
|
|
||||||
Status = CallRing3 (
|
Status = CallRing3 (
|
||||||
Input,
|
Input,
|
||||||
UserDriver->UserStackTop
|
UserDriver->UserStackTop
|
||||||
);
|
);
|
||||||
|
|
||||||
|
--UserDriver->NumberOfCalls;
|
||||||
|
|
||||||
CoreFreePages (Ring3Pages, PagesNumber);
|
CoreFreePages (Ring3Pages, PagesNumber);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
@ -754,6 +764,7 @@ CoreFileOpen (
|
|||||||
NewDriver->CoreWrapper = NewFile;
|
NewDriver->CoreWrapper = NewFile;
|
||||||
NewDriver->UserPageTable = UserDriver->UserPageTable;
|
NewDriver->UserPageTable = UserDriver->UserPageTable;
|
||||||
NewDriver->UserStackTop = UserDriver->UserStackTop;
|
NewDriver->UserStackTop = UserDriver->UserStackTop;
|
||||||
|
NewDriver->NumberOfCalls = 0;
|
||||||
|
|
||||||
AllowSupervisorAccessToUserMemory ();
|
AllowSupervisorAccessToUserMemory ();
|
||||||
NewDriver->UserSpaceDriver = *Ring3NewHandle;
|
NewDriver->UserSpaceDriver = *Ring3NewHandle;
|
||||||
@ -855,6 +866,7 @@ CoreSimpleFileSystemOpenVolume (
|
|||||||
NewDriver->CoreWrapper = File;
|
NewDriver->CoreWrapper = File;
|
||||||
NewDriver->UserPageTable = UserDriver->UserPageTable;
|
NewDriver->UserPageTable = UserDriver->UserPageTable;
|
||||||
NewDriver->UserStackTop = UserDriver->UserStackTop;
|
NewDriver->UserStackTop = UserDriver->UserStackTop;
|
||||||
|
NewDriver->NumberOfCalls = 0;
|
||||||
|
|
||||||
AllowSupervisorAccessToUserMemory ();
|
AllowSupervisorAccessToUserMemory ();
|
||||||
NewDriver->UserSpaceDriver = *Ring3Root;
|
NewDriver->UserSpaceDriver = *Ring3Root;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user