//\r
// These get set via calls by the debug agent\r
//\r
-static EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL;\r
-static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback = NULL;\r
+static EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL;\r
+static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL};\r
static EFI_GUID mEfiEbcVmTestProtocolGuid = EFI_EBC_VM_TEST_PROTOCOL_GUID;\r
\r
EFI_STATUS\r
\r
--*/\r
{\r
+ if ((mDebugPeriodicCallback == NULL) && (PeriodicCallback == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if ((mDebugPeriodicCallback != NULL) && (PeriodicCallback != NULL)) {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ \r
mDebugPeriodicCallback = PeriodicCallback;\r
return EFI_SUCCESS;\r
}\r
\r
--*/\r
{\r
- mDebugExceptionCallback = ExceptionCallback;\r
+ if ((ExceptionType < 0) || (ExceptionType > MAX_EBC_EXCEPTION)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if ((mDebugExceptionCallback[ExceptionType] == NULL) && (ExceptionCallback == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if ((mDebugExceptionCallback[ExceptionType] != NULL) && (ExceptionCallback != NULL)) {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ mDebugExceptionCallback[ExceptionType] = ExceptionCallback;\r
return EFI_SUCCESS;\r
}\r
\r
EbcContext.R7 = VmPtr->R[7];\r
EbcContext.Ip = (UINT64) (UINTN) VmPtr->Ip;\r
EbcContext.Flags = VmPtr->Flags;\r
+ EbcContext.ControlFlags = 0;\r
SystemContext.SystemContextEbc = &EbcContext;\r
//\r
// If someone's registered for exception callbacks, then call them.\r
// Otherwise report the status code via the status code API\r
//\r
- if (mDebugExceptionCallback != NULL) {\r
- mDebugExceptionCallback (ExceptionType, SystemContext);\r
+ if ((ExceptionType >= 0) && (ExceptionType <= MAX_EBC_EXCEPTION) &&\r
+ (mDebugExceptionCallback[ExceptionType] != NULL)) {\r
+ mDebugExceptionCallback[ExceptionType] (ExceptionType, SystemContext);\r
}\r
//\r
// Determine if we should report the exception. We report all of them by default,\r
Report = TRUE;\r
switch (ExceptionType) {\r
case EXCEPT_EBC_UNDEFINED:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_UNDEFINED;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_UNDEFINED;\r
break;\r
\r
case EXCEPT_EBC_DIVIDE_ERROR:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DIVIDE_ERROR;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DIVIDE_ERROR;\r
break;\r
\r
case EXCEPT_EBC_DEBUG:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DEBUG;\r
- Report = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DEBUG;\r
+ Report = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
break;\r
\r
case EXCEPT_EBC_BREAKPOINT:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BREAKPOINT;\r
- Report = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BREAKPOINT;\r
+ Report = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
break;\r
\r
case EXCEPT_EBC_INVALID_OPCODE:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INVALID_OPCODE;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INVALID_OPCODE;\r
break;\r
\r
case EXCEPT_EBC_STACK_FAULT:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STACK_FAULT;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STACK_FAULT;\r
break;\r
\r
case EXCEPT_EBC_ALIGNMENT_CHECK:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_ALIGNMENT_CHECK;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_ALIGNMENT_CHECK;\r
break;\r
\r
case EXCEPT_EBC_INSTRUCTION_ENCODING:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INSTRUCTION_ENCODING;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INSTRUCTION_ENCODING;\r
break;\r
\r
case EXCEPT_EBC_BAD_BREAK:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BAD_BREAK;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BAD_BREAK;\r
break;\r
\r
case EXCEPT_EBC_STEP:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STEP;\r
- Report = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STEP;\r
+ Report = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
break;\r
\r
default:\r
- StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_NON_SPECIFIC;\r
+ StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_NON_SPECIFIC;\r
break;\r
}\r
//\r