mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-23 21:54:27 +02:00
CpuExceptionHandlerLib: Refactored IO Bit Map initialization.
This commit is contained in:
parent
1e5fbf7b87
commit
1f1ce7241c
@ -136,6 +136,8 @@ ArchSetupExceptionStack (
|
|||||||
UINTN NeedBufferSize;
|
UINTN NeedBufferSize;
|
||||||
EXCEPTION_HANDLER_TEMPLATE_MAP TemplateMap;
|
EXCEPTION_HANDLER_TEMPLATE_MAP TemplateMap;
|
||||||
UINT8 *IOBitMap;
|
UINT8 *IOBitMap;
|
||||||
|
UINT8 *IOBitMapPointer;
|
||||||
|
UINT8 Offset;
|
||||||
|
|
||||||
if (BufferSize == NULL) {
|
if (BufferSize == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -234,17 +236,17 @@ ArchSetupExceptionStack (
|
|||||||
// and DebugIoPort = 0x402.
|
// and DebugIoPort = 0x402.
|
||||||
//
|
//
|
||||||
IOBitMap = (UINT8 *)((UINTN)Tss + Tss->IOMapBaseAddress);
|
IOBitMap = (UINT8 *)((UINTN)Tss + Tss->IOMapBaseAddress);
|
||||||
for (Index = 0; Index < IO_BIT_MAP_SIZE; ++Index) {
|
SetMem (IOBitMap, IO_BIT_MAP_SIZE, 0xFF);
|
||||||
if ((Index * 8) == FixedPcdGet16 (PcdUartBase)) {
|
|
||||||
*IOBitMap = 0x84;
|
|
||||||
} else if ((Index * 8) == (FixedPcdGet16 (PcdDebugIoPort) - 2)) {
|
|
||||||
*IOBitMap = 0xFB;
|
|
||||||
} else {
|
|
||||||
*IOBitMap = 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
++IOBitMap;
|
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdUartBase) / 8);
|
||||||
}
|
Offset = (UINT8)(FixedPcdGet16 (PcdUartBase) & 0x7U);
|
||||||
|
*(UINT16 *)IOBitMapPointer &= ~((1U << Offset) | (1U << (Offset + 1))
|
||||||
|
| (1U << (Offset + 3)) | (1U << (Offset + 4))
|
||||||
|
| (1U << (Offset + 5)) | (1U << (Offset + 6)));
|
||||||
|
|
||||||
|
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdDebugIoPort) / 8);
|
||||||
|
Offset = (UINT8)(FixedPcdGet16 (PcdDebugIoPort) & 0x7U);
|
||||||
|
*IOBitMapPointer &= ~(1U << Offset);
|
||||||
|
|
||||||
Tss = (IA32_TASK_STATE_SEGMENT *)((UINTN)Tss + sizeof (IA32_TASK_STATE_SEGMENT) + IO_BIT_MAP_SIZE);
|
Tss = (IA32_TASK_STATE_SEGMENT *)((UINTN)Tss + sizeof (IA32_TASK_STATE_SEGMENT) + IO_BIT_MAP_SIZE);
|
||||||
++TssDesc;
|
++TssDesc;
|
||||||
|
@ -39,7 +39,7 @@ typedef struct {
|
|||||||
(sizeof (IA32_TSS_DESCRIPTOR) * \
|
(sizeof (IA32_TSS_DESCRIPTOR) * \
|
||||||
(FixedPcdGetSize (PcdCpuStackSwitchExceptionList) + 1))
|
(FixedPcdGetSize (PcdCpuStackSwitchExceptionList) + 1))
|
||||||
|
|
||||||
#define IO_BIT_MAP_SIZE (ALIGN_VALUE (FixedPcdGet16 (PcdDebugIoPort) / 8 + 1, 16))
|
#define IO_BIT_MAP_SIZE (ALIGN_VALUE (MAX (FixedPcdGet16 (PcdUartBase) ,FixedPcdGet16 (PcdDebugIoPort)) / 8 + 1, 16))
|
||||||
#define CPU_TSS_SIZE \
|
#define CPU_TSS_SIZE \
|
||||||
(sizeof (IA32_TASK_STATE_SEGMENT) * \
|
(sizeof (IA32_TASK_STATE_SEGMENT) * \
|
||||||
(FixedPcdGetSize (PcdCpuStackSwitchExceptionList) + 1) + IO_BIT_MAP_SIZE)
|
(FixedPcdGetSize (PcdCpuStackSwitchExceptionList) + 1) + IO_BIT_MAP_SIZE)
|
||||||
|
@ -140,6 +140,8 @@ ArchSetupExceptionStack (
|
|||||||
UINT8 *StackSwitchExceptions;
|
UINT8 *StackSwitchExceptions;
|
||||||
UINTN NeedBufferSize;
|
UINTN NeedBufferSize;
|
||||||
UINT8 *IOBitMap;
|
UINT8 *IOBitMap;
|
||||||
|
UINT8 *IOBitMapPointer;
|
||||||
|
UINT8 Offset;
|
||||||
|
|
||||||
if (BufferSize == NULL) {
|
if (BufferSize == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -241,17 +243,17 @@ ArchSetupExceptionStack (
|
|||||||
// and DebugIoPort = 0x402.
|
// and DebugIoPort = 0x402.
|
||||||
//
|
//
|
||||||
IOBitMap = (UINT8 *)((UINTN)Tss + Tss->IOMapBaseAddress);
|
IOBitMap = (UINT8 *)((UINTN)Tss + Tss->IOMapBaseAddress);
|
||||||
for (Index = 0; Index < IO_BIT_MAP_SIZE; ++Index) {
|
SetMem (IOBitMap, IO_BIT_MAP_SIZE, 0xFF);
|
||||||
if ((Index * 8) == FixedPcdGet16 (PcdUartBase)) {
|
|
||||||
*IOBitMap = 0x84;
|
|
||||||
} else if ((Index * 8) == (FixedPcdGet16 (PcdDebugIoPort) - 2)) {
|
|
||||||
*IOBitMap = 0xFB;
|
|
||||||
} else {
|
|
||||||
*IOBitMap = 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
++IOBitMap;
|
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdUartBase) / 8);
|
||||||
}
|
Offset = (UINT8)(FixedPcdGet16 (PcdUartBase) & 0x7U);
|
||||||
|
*(UINT16 *)IOBitMapPointer &= ~((1U << Offset) | (1U << (Offset + 1))
|
||||||
|
| (1U << (Offset + 3)) | (1U << (Offset + 4))
|
||||||
|
| (1U << (Offset + 5)) | (1U << (Offset + 6)));
|
||||||
|
|
||||||
|
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdDebugIoPort) / 8);
|
||||||
|
Offset = (UINT8)(FixedPcdGet16 (PcdDebugIoPort) & 0x7U);
|
||||||
|
*IOBitMapPointer &= ~(1U << Offset);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fixup IST and task-state segment
|
// Fixup IST and task-state segment
|
||||||
|
@ -38,7 +38,7 @@ typedef struct {
|
|||||||
} RESERVED_VECTORS_DATA;
|
} RESERVED_VECTORS_DATA;
|
||||||
|
|
||||||
#define CPU_TSS_DESC_SIZE sizeof (IA32_TSS_DESCRIPTOR)
|
#define CPU_TSS_DESC_SIZE sizeof (IA32_TSS_DESCRIPTOR)
|
||||||
#define IO_BIT_MAP_SIZE (ALIGN_VALUE (FixedPcdGet16 (PcdDebugIoPort) / 8 + 1, 16))
|
#define IO_BIT_MAP_SIZE (ALIGN_VALUE (MAX (FixedPcdGet16 (PcdUartBase) ,FixedPcdGet16 (PcdDebugIoPort)) / 8 + 1, 16))
|
||||||
#define CPU_TSS_SIZE (sizeof (IA32_TASK_STATE_SEGMENT) + IO_BIT_MAP_SIZE)
|
#define CPU_TSS_SIZE (sizeof (IA32_TASK_STATE_SEGMENT) + IO_BIT_MAP_SIZE)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user