Refactor system resources to be able to distinguish if requested resource does not exist or if it is locked and cannot be reused

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; LIST_ENTRY ListEntry;
SYSTEM_RESOURCE_TYPE ResourceType; SYSTEM_RESOURCE_TYPE ResourceType;
BOOLEAN ResourceLocked;
ULONG ResourceSize; ULONG ResourceSize;
PVOID PhysicalAddress; PVOID PhysicalAddress;
PVOID VirtualAddress; PVOID VirtualAddress;
BOOLEAN Acquired;
} SYSTEM_RESOURCE_HEADER, *PSYSTEM_RESOURCE_HEADER; } SYSTEM_RESOURCE_HEADER, *PSYSTEM_RESOURCE_HEADER;
/* ACPI system resource structure definition */ /* ACPI system resource structure definition */

View File

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

View File

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