continue;\r
}\r
\r
- if (Mbr->Partition[Index].OSIndicator == 0xEE) {\r
+ if (Mbr->Partition[Index].OSIndicator == PMBR_GPT_PARTITION) {\r
//\r
// This is the guard MBR for the GPT. If you ever see a GPT disk with zero partitions you can get here.\r
// We can not produce an MBR BlockIo for this device as the MBR spans the GPT headers. So formating \r
break;\r
}\r
\r
+ if ((Mbr->Partition[0].OSIndicator == EXTENDED_DOS_PARTITION) ||\r
+ (Mbr->Partition[0].OSIndicator == EXTENDED_WINDOWS_PARTITION)) {\r
+ ExtMbrStartingLba = UNPACK_UINT32 (Mbr->Partition[0].StartingLBA);\r
+ continue;\r
+ }\r
HdDev.PartitionNumber = PartitionNumber ++;\r
HdDev.PartitionStart = UNPACK_UINT32 (Mbr->Partition[0].StartingLBA) + ExtMbrStartingLba + ParentHdDev.PartitionStart;\r
HdDev.PartitionSize = UNPACK_UINT32 (Mbr->Partition[0].SizeInLBA);\r
Found = TRUE;\r
}\r
\r
- if (Mbr->Partition[1].OSIndicator != EXTENDED_DOS_PARTITION &&\r
- Mbr->Partition[1].OSIndicator != EXTENDED_WINDOWS_PARTITION\r
+ if ((Mbr->Partition[1].OSIndicator != EXTENDED_DOS_PARTITION) &&\r
+ (Mbr->Partition[1].OSIndicator != EXTENDED_WINDOWS_PARTITION)\r
) {\r
break;\r
}\r
//\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