forked from xt-sys/exectos
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:
parent
c2db94125d
commit
156cb7bcac
@ -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 */
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user