Refactor system resources to be able to distinguish if requested resource does not exist or if it is locked and cannot be reused
Some checks failed
Builds / ExectOS (amd64) (push) Failing after 28s
Builds / ExectOS (i686) (push) Failing after 28s

This commit is contained in:
Rafal Kupiec 2024-06-22 18:54:34 +02:00
parent c2db94125d
commit 156cb7bcac
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
3 changed files with 31 additions and 22 deletions

View File

@ -521,10 +521,10 @@ typedef struct _SYSTEM_RESOURCE_HEADER
{
LIST_ENTRY ListEntry;
SYSTEM_RESOURCE_TYPE ResourceType;
BOOLEAN ResourceLocked;
ULONG ResourceSize;
PVOID PhysicalAddress;
PVOID VirtualAddress;
BOOLEAN Acquired;
} SYSTEM_RESOURCE_HEADER, *PSYSTEM_RESOURCE_HEADER;
/* ACPI system resource structure definition */

View File

@ -49,6 +49,7 @@
/* XT status code definitions */
#define STATUS_SUCCESS ((XTSTATUS) 0x00000000L)
#define STATUS_END_OF_MEDIA ((XTSTATUS) 0x8000001EL)
#define STATUS_RESOURCE_LOCKED ((XTSTATUS) 0xC0000000L)
#define STATUS_UNSUCCESSFUL ((XTSTATUS) 0xC0000001L)
#define STATUS_NOT_IMPLEMENTED ((XTSTATUS) 0xC0000002L)
#define STATUS_ACCESS_VIOLATION ((XTSTATUS) 0xC0000005L)

View File

@ -28,11 +28,8 @@ XTSTATUS
KeAcquireSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
OUT PSYSTEM_RESOURCE_HEADER *ResourceHeader)
{
/* Acquire system resource */
KepGetSystemResource(ResourceType, TRUE, ResourceHeader);
/* Return status code */
return (*ResourceHeader == NULL) ? STATUS_NOT_FOUND : STATUS_SUCCESS;
/* Get system resource and acquire an ownership */
return KepGetSystemResource(ResourceType, TRUE, ResourceHeader);
}
/**
@ -53,11 +50,8 @@ XTSTATUS
KeGetSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
OUT PSYSTEM_RESOURCE_HEADER *ResourceHeader)
{
/* Get system resource */
KepGetSystemResource(ResourceType, FALSE, ResourceHeader);
/* Return status code */
return (*ResourceHeader == NULL) ? STATUS_NOT_FOUND : STATUS_SUCCESS;
/* Get system resource without acquiring an ownership */
return KepGetSystemResource(ResourceType, FALSE, ResourceHeader);
}
/**
@ -78,8 +72,8 @@ KeReleaseSystemResource(IN PSYSTEM_RESOURCE_HEADER ResourceHeader)
ArClearInterruptFlag();
KeAcquireSpinLock(&KepSystemResourcesLock);
/* Release system resource */
ResourceHeader->Acquired = FALSE;
/* Release resource lock */
ResourceHeader->ResourceLocked = FALSE;
/* Release spinlock and enable interrupts */
KeReleaseSpinLock(&KepSystemResourcesLock);
@ -103,14 +97,18 @@ KeReleaseSystemResource(IN PSYSTEM_RESOURCE_HEADER ResourceHeader)
* @since XT 1.0
*/
XTAPI
VOID
XTSTATUS
KepGetSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
IN BOOLEAN Acquire,
IN BOOLEAN ResourceLock,
OUT PSYSTEM_RESOURCE_HEADER *ResourceHeader)
{
PSYSTEM_RESOURCE_HEADER Resource;
PLIST_ENTRY ListEntry;
BOOLEAN Interrupts;
XTSTATUS Status;
/* Assume resource found successfully */
Status = STATUS_SUCCESS;
/* Check if interrupts are enabled */
Interrupts = ArInterruptsEnabled();
@ -126,14 +124,22 @@ KepGetSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
/* Get resource header */
Resource = CONTAIN_RECORD(ListEntry, SYSTEM_RESOURCE_HEADER, ListEntry);
/* Check if resource type matches and it's not already acquired */
if(Resource->ResourceType == ResourceType && Resource->Acquired == FALSE)
/* Check if resource type matches */
if(Resource->ResourceType == ResourceType)
{
/* Check if resource should be acquired */
if(Acquire)
/* Check if resource is locked */
if(Resource->ResourceLocked)
{
/* Mark resource as acquired */
Resource->Acquired = TRUE;
/* Resource locked, set status code and stop browsing a list */
Status = STATUS_RESOURCE_LOCKED;
break;
}
/* Check if resource lock should be acquired */
if(ResourceLock)
{
/* Acquire resource lock */
Resource->ResourceLocked = TRUE;
}
/* Stop browsing a list */
@ -149,6 +155,7 @@ KepGetSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
{
/* Resource not found, return NULL */
Resource = NULL;
Status = STATUS_NOT_FOUND;
}
/* Release spinlock and re-enable interrupts if necessary */
@ -159,8 +166,9 @@ KepGetSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
ArSetInterruptFlag();
}
/* Return resource header */
/* Return resource header and status code */
*ResourceHeader = Resource;
return Status;
}
/**