X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FEbc%2FDxe%2FEbcInt.c;fp=EdkModulePkg%2FUniversal%2FEbc%2FDxe%2FEbcInt.c;h=2a5d48a431f5875ea364201184c074943245167a;hp=7b15a1a84b4679e347da795c874106dc551f82c4;hb=3114b33496b816233063ad193d194e9ac0531ad0;hpb=fc773f6aa7dccfb271e452d8b2e94d18be86dc94 diff --git a/EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c b/EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c index 7b15a1a84b..2a5d48a431 100644 --- a/EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c +++ b/EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c @@ -154,8 +154,8 @@ static EBC_ICACHE_FLUSH mEbcICacheFlush; // // These get set via calls by the debug agent // -static EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL; -static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback = NULL; +static EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL; +static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL}; static EFI_GUID mEfiEbcVmTestProtocolGuid = EFI_EBC_VM_TEST_PROTOCOL_GUID; EFI_STATUS @@ -405,6 +405,13 @@ Returns: --*/ { + if ((mDebugPeriodicCallback == NULL) && (PeriodicCallback == NULL)) { + return EFI_INVALID_PARAMETER; + } + if ((mDebugPeriodicCallback != NULL) && (PeriodicCallback != NULL)) { + return EFI_ALREADY_STARTED; + } + mDebugPeriodicCallback = PeriodicCallback; return EFI_SUCCESS; } @@ -437,7 +444,16 @@ Returns: --*/ { - mDebugExceptionCallback = ExceptionCallback; + if ((ExceptionType < 0) || (ExceptionType > MAX_EBC_EXCEPTION)) { + return EFI_INVALID_PARAMETER; + } + if ((mDebugExceptionCallback[ExceptionType] == NULL) && (ExceptionCallback == NULL)) { + return EFI_INVALID_PARAMETER; + } + if ((mDebugExceptionCallback[ExceptionType] != NULL) && (ExceptionCallback != NULL)) { + return EFI_ALREADY_STARTED; + } + mDebugExceptionCallback[ExceptionType] = ExceptionCallback; return EFI_SUCCESS; } @@ -519,13 +535,15 @@ Returns: EbcContext.R7 = VmPtr->R[7]; EbcContext.Ip = (UINT64) (UINTN) VmPtr->Ip; EbcContext.Flags = VmPtr->Flags; + EbcContext.ControlFlags = 0; SystemContext.SystemContextEbc = &EbcContext; // // If someone's registered for exception callbacks, then call them. // Otherwise report the status code via the status code API // - if (mDebugExceptionCallback != NULL) { - mDebugExceptionCallback (ExceptionType, SystemContext); + if ((ExceptionType >= 0) && (ExceptionType <= MAX_EBC_EXCEPTION) && + (mDebugExceptionCallback[ExceptionType] != NULL)) { + mDebugExceptionCallback[ExceptionType] (ExceptionType, SystemContext); } // // Determine if we should report the exception. We report all of them by default, @@ -536,50 +554,50 @@ Returns: Report = TRUE; switch (ExceptionType) { case EXCEPT_EBC_UNDEFINED: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_UNDEFINED; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_UNDEFINED; break; case EXCEPT_EBC_DIVIDE_ERROR: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DIVIDE_ERROR; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DIVIDE_ERROR; break; case EXCEPT_EBC_DEBUG: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DEBUG; - Report = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE); + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DEBUG; + Report = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE); break; case EXCEPT_EBC_BREAKPOINT: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BREAKPOINT; - Report = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE); + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BREAKPOINT; + Report = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE); break; case EXCEPT_EBC_INVALID_OPCODE: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INVALID_OPCODE; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INVALID_OPCODE; break; case EXCEPT_EBC_STACK_FAULT: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STACK_FAULT; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STACK_FAULT; break; case EXCEPT_EBC_ALIGNMENT_CHECK: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_ALIGNMENT_CHECK; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_ALIGNMENT_CHECK; break; case EXCEPT_EBC_INSTRUCTION_ENCODING: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INSTRUCTION_ENCODING; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INSTRUCTION_ENCODING; break; case EXCEPT_EBC_BAD_BREAK: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BAD_BREAK; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BAD_BREAK; break; case EXCEPT_EBC_STEP: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STEP; - Report = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE); + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STEP; + Report = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE); break; default: - StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_NON_SPECIFIC; + StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_NON_SPECIFIC; break; } //