]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/DebugSupportDxe/X64/PlDebugSupportX64.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / DebugSupportDxe / X64 / PlDebugSupportX64.c
CommitLineData
6e8a984e 1/** @file\r
509bc208 2 X64 specific functions to support Debug Support protocol.\r
6e8a984e 3\r
e5eed7d3 4Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
6e8a984e 6\r
7**/\r
8\r
cfcbb8bc 9#include "PlDebugSupport.h"\r
6e8a984e 10\r
1436aea4
MK
11IA32_IDT_GATE_DESCRIPTOR NullDesc = {\r
12 { 0, 0 }\r
13};\r
43a99f08 14\r
6e8a984e 15/**\r
c84507ab 16 Get Interrupt Handle from IDT Gate Descriptor.\r
6e8a984e 17\r
18 @param IdtGateDecriptor IDT Gate Descriptor.\r
19\r
c84507ab 20 @return Interrupt Handle stored in IDT Gate Descriptor.\r
6e8a984e 21\r
22**/\r
c84507ab 23UINTN\r
24GetInterruptHandleFromIdt (\r
6e8a984e 25 IN IA32_IDT_GATE_DESCRIPTOR *IdtGateDecriptor\r
26 )\r
27{\r
1436aea4 28 UINTN InterruptHandle;\r
cfcbb8bc 29\r
30 //\r
31 // InterruptHandle 0-15 : OffsetLow\r
32 // InterruptHandle 16-31 : OffsetHigh\r
33 // InterruptHandle 32-63 : OffsetUpper\r
34 //\r
1436aea4
MK
35 InterruptHandle = ((UINTN)IdtGateDecriptor->Bits.OffsetLow) |\r
36 (((UINTN)IdtGateDecriptor->Bits.OffsetHigh) << 16) |\r
37 (((UINTN)IdtGateDecriptor->Bits.OffsetUpper) << 32);\r
6e8a984e 38\r
c84507ab 39 return InterruptHandle;\r
6e8a984e 40}\r
41\r
42/**\r
43 Allocate pool for a new IDT entry stub.\r
44\r
45 Copy the generic stub into the new buffer and fixup the vector number\r
46 and jump target address.\r
47\r
48 @param ExceptionType This is the exception type that the new stub will be created\r
49 for.\r
50 @param Stub On successful exit, *Stub contains the newly allocated entry stub.\r
51\r
6e8a984e 52**/\r
c84507ab 53VOID\r
6e8a984e 54CreateEntryStub (\r
1436aea4
MK
55 IN EFI_EXCEPTION_TYPE ExceptionType,\r
56 OUT VOID **Stub\r
6e8a984e 57 )\r
58{\r
1436aea4 59 UINT8 *StubCopy;\r
6e8a984e 60\r
61 StubCopy = *Stub;\r
62\r
63 //\r
64 // Fixup the stub code for this vector\r
65 //\r
66\r
67 // The stub code looks like this:\r
68 //\r
69 // 00000000 6A 00 push 0 ; push vector number - will be modified before installed\r
70 // 00000002 E9 db 0e9h ; jump rel32\r
71 // 00000003 00000000 dd 0 ; fixed up to relative address of CommonIdtEntry\r
72 //\r
73\r
74 //\r
75 // poke in the exception type so the second push pushes the exception type\r
76 //\r
1436aea4 77 StubCopy[0x1] = (UINT8)ExceptionType;\r
6e8a984e 78\r
79 //\r
80 // fixup the jump target to point to the common entry\r
81 //\r
1436aea4 82 *(UINT32 *)&StubCopy[0x3] = (UINT32)((UINTN)CommonIdtEntry - (UINTN)&StubCopy[StubSize]);\r
6e8a984e 83\r
c84507ab 84 return;\r
6e8a984e 85}\r
86\r
87/**\r
88 This is the main worker function that manages the state of the interrupt\r
89 handlers. It both installs and uninstalls interrupt handlers based on the\r
90 value of NewCallback. If NewCallback is NULL, then uninstall is indicated.\r
91 If NewCallback is non-NULL, then install is indicated.\r
92\r
93 @param NewCallback If non-NULL, NewCallback specifies the new handler to register.\r
94 If NULL, specifies that the previously registered handler should\r
95 be uninstalled.\r
96 @param ExceptionType Indicates which entry to manage.\r
97\r
98 @retval EFI_SUCCESS Process is ok.\r
99 @retval EFI_INVALID_PARAMETER Requested uninstalling a handler from a vector that has\r
100 no handler registered for it\r
101 @retval EFI_ALREADY_STARTED Requested install to a vector that already has a handler registered.\r
102 @retval others Possible return values are passed through from UnHookEntry and HookEntry.\r
103\r
104**/\r
105EFI_STATUS\r
106ManageIdtEntryTable (\r
1436aea4
MK
107 CALLBACK_FUNC NewCallback,\r
108 EFI_EXCEPTION_TYPE ExceptionType\r
6e8a984e 109 )\r
110{\r
111 EFI_STATUS Status;\r
112\r
113 Status = EFI_SUCCESS;\r
114\r
115 if (CompareMem (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc, sizeof (IA32_IDT_GATE_DESCRIPTOR)) != 0) {\r
116 //\r
117 // we've already installed to this vector\r
118 //\r
119 if (NewCallback != NULL) {\r
120 //\r
121 // if the input handler is non-null, error\r
122 //\r
123 Status = EFI_ALREADY_STARTED;\r
124 } else {\r
c84507ab 125 UnhookEntry (ExceptionType);\r
6e8a984e 126 }\r
127 } else {\r
128 //\r
129 // no user handler installed on this vector\r
130 //\r
131 if (NewCallback == NULL) {\r
132 //\r
133 // if the input handler is null, error\r
134 //\r
135 Status = EFI_INVALID_PARAMETER;\r
136 } else {\r
c84507ab 137 HookEntry (ExceptionType, NewCallback);\r
6e8a984e 138 }\r
139 }\r
cfcbb8bc 140\r
6e8a984e 141 return Status;\r
142}\r