]> git.proxmox.com Git - mirror_edk2.git/commitdiff
I fixed following bugs in EDKII.
authormikewuping <mikewuping@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Nov 2006 03:34:43 +0000 (03:34 +0000)
committermikewuping <mikewuping@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Nov 2006 03:34:43 +0000 (03:34 +0000)
1. In AsmFuncs.asm, DebugSupport, Vect2Desc() function will use hardcode CS to fill the IDT. 20h for Ia32.If the system CS is changed by CPU driver, this driver can not work. System maybe crash.
2. In EBC, RegisterExceptionCallback() can not restore the environment and I add some enhancements.
3. In Image.c, CoreLoadImageCommon never return EFI_SECURITY_VIOLATION when SecurityStatus == EFI_SECURITY_VIOLATION.
4. In Variable.c, 1. There're additional unnecessary loop. All blocks will be gone through even if all the data has been written. We should check the "CurrWriteSize" to see if there's no more data to write, and stop the for loop immediately. 2 "if.else." can be merged to save lines of code.
5. in FvbServices,c, Checksum calculation error.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1891 6f19259b-4bc3-4df7-8a09-765794883524

EdkModulePkg/Core/Dxe/Image/Image.c
EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.asm
EdkModulePkg/Universal/Ebc/Dxe/EbcExecute.c
EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c
EdkModulePkg/Universal/Ebc/Dxe/EbcInt.h
EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c
EdkNt32Pkg/RuntimeDxe/FvbServices/FWBlockService.c

index 9b9720d8975b1f5e698c8065f68fcf9a2a90dfc6..0bef1ff82ed6aa12a0f85a294565f112d999ccea 100644 (file)
@@ -595,6 +595,7 @@ Returns:
   EFI_DEVICE_PATH_PROTOCOL   *HandleFilePath;\r
   UINTN                      FilePathSize;\r
 \r
+  SecurityStatus = EFI_SUCCESS;\r
 \r
   ASSERT (gEfiCurrentTpl < EFI_TPL_NOTIFY);\r
   ParentImage = NULL;\r
@@ -753,6 +754,8 @@ Done:
       CoreUnloadAndCloseImage (Image, (BOOLEAN)(DstBuffer == 0));\r
       *ImageHandle = NULL;\r
     }\r
+  } else if (EFI_ERROR (SecurityStatus)) {\r
+    Status = SecurityStatus;\r
   }\r
 \r
   return Status;\r
index 89c9f83176076b1773f754e4471844dd70f88790..1741ce83c07d1a1355c4c2dc8e1394b44c00a963 100644 (file)
@@ -189,7 +189,8 @@ Vect2Desc       PROC    C PUBLIC DestPtr:DWORD, Vector:DWORD
                 mov     eax, Vector\r
                 mov     ecx, DestPtr\r
                 mov     word ptr [ecx], ax                  ; write bits 15..0 of offset\r
-                mov     word ptr [ecx+2], 20h               ; SYS_CODE_SEL from GDT\r
+                mov     dx, cs\r
+                mov     word ptr [ecx+2], dx                ; SYS_CODE_SEL from GDT\r
                 mov     word ptr [ecx+4], 0e00h OR 8000h    ; type = 386 interrupt gate, present\r
                 shr     eax, 16\r
                 mov     word ptr [ecx+6], ax                ; write bits 31..16 of offset\r
index 13e2d7c08f3aefed8c71bd36a51912dd4d777e42..70db1574bf3b64c8491909be654f36f427afb3af 100644 (file)
@@ -685,6 +685,7 @@ Returns:
   EFI_STATUS                        Status;\r
   EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL  *EbcSimpleDebugger;\r
 \r
+  mVmPtr            = VmPtr;\r
   EbcSimpleDebugger = NULL;\r
   Status            = EFI_SUCCESS;\r
   StackCorrupted    = 0;\r
@@ -779,6 +780,7 @@ Returns:
   }\r
 \r
 Done:\r
+  mVmPtr          = NULL;\r
   return Status;\r
 }\r
 \r
index 2a5d48a431f5875ea364201184c074943245167a..e38f5be7309d10ba913a7d6997b01cbb86597951 100644 (file)
@@ -77,6 +77,32 @@ EbcGetVersion (
   IN OUT UINT64           *Version\r
   );\r
 \r
+EFI_STATUS\r
+EFIAPI\r
+InitializeEbcCallback (\r
+  IN EFI_DEBUG_SUPPORT_PROTOCOL  *This\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+CommonEbcExceptionHandler (\r
+  IN EFI_EXCEPTION_TYPE   InterruptType,\r
+  IN EFI_SYSTEM_CONTEXT   SystemContext\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+EbcPeriodicNotifyFunction (\r
+  IN EFI_EVENT     Event,\r
+  IN VOID          *Context\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+EbcDebugPeriodic (\r
+  IN VM_CONTEXT *VmPtr\r
+  );\r
+\r
 //\r
 // These two functions and the  GUID are used to produce an EBC test protocol.\r
 // This functionality is definitely not required for execution.\r
@@ -158,6 +184,12 @@ static EFI_PERIODIC_CALLBACK  mDebugPeriodicCallback
 static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL};\r
 static EFI_GUID               mEfiEbcVmTestProtocolGuid = EFI_EBC_VM_TEST_PROTOCOL_GUID;\r
 \r
+//\r
+// Event for Periodic callback\r
+//\r
+static EFI_EVENT              mEbcPeriodicEvent;\r
+VM_CONTEXT                    *mVmPtr = NULL;\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 InitializeEbcDriver (\r
@@ -190,6 +222,9 @@ Returns:
   UINTN                       Index;\r
   BOOLEAN                     Installed;\r
 \r
+  EbcProtocol      = NULL;\r
+  EbcDebugProtocol = NULL;\r
+\r
   //\r
   // Allocate memory for our protocol. Then fill in the blanks.\r
   //\r
@@ -271,7 +306,7 @@ Returns:
                   (VOID **) &EbcDebugProtocol\r
                   );\r
   if (Status != EFI_SUCCESS) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    goto ErrorExit;\r
   }\r
 \r
   EbcDebugProtocol->Isa                         = IsaEbc;\r
@@ -294,7 +329,14 @@ Returns:
   //\r
   if (EFI_ERROR (Status)) {\r
     gBS->FreePool (EbcDebugProtocol);\r
+    goto ErrorExit;\r
   }\r
+  //\r
+  // Install EbcDebugSupport Protocol Successfully\r
+  // Now we need to initialize the Ebc default Callback\r
+  //\r
+  Status = InitializeEbcCallback (EbcDebugProtocol);\r
+\r
   //\r
   // Produce a VM test interface protocol. Not required for execution.\r
   //\r
@@ -302,6 +344,44 @@ Returns:
     InitEbcVmTestProtocol (&ImageHandle);\r
   DEBUG_CODE_END ();\r
 \r
+  return EFI_SUCCESS;\r
+\r
+ErrorExit:\r
+  HandleBuffer  = NULL;\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEfiEbcProtocolGuid,\r
+                  NULL,\r
+                  &NumHandles,\r
+                  &HandleBuffer\r
+                  );\r
+  if (Status == EFI_SUCCESS) {\r
+    //\r
+    // Loop through the handles\r
+    //\r
+    for (Index = 0; Index < NumHandles; Index++) {\r
+      Status = gBS->HandleProtocol (\r
+                      HandleBuffer[Index],\r
+                      &gEfiEbcProtocolGuid,\r
+                      (VOID **) &OldEbcProtocol\r
+                      );\r
+      if (Status == EFI_SUCCESS) {\r
+        gBS->UninstallProtocolInterface (\r
+               HandleBuffer[Index],\r
+               &gEfiEbcProtocolGuid,\r
+               OldEbcProtocol\r
+               );\r
+      }\r
+    }\r
+  }\r
+\r
+  if (HandleBuffer != NULL) {\r
+    gBS->FreePool (HandleBuffer);\r
+    HandleBuffer = NULL;\r
+  }\r
+\r
+  gBS->FreePool (EbcProtocol);\r
+\r
   return Status;\r
 }\r
 \r
@@ -508,8 +588,8 @@ Returns:
 {\r
   EFI_SYSTEM_CONTEXT_EBC  EbcContext;\r
   EFI_SYSTEM_CONTEXT      SystemContext;\r
-  EFI_STATUS_CODE_VALUE   StatusCodeValue;\r
-  BOOLEAN                 Report;\r
+\r
+  ASSERT ((ExceptionType >= 0) && (ExceptionType <= MAX_EBC_EXCEPTION));\r
   //\r
   // Save the exception in the context passed in\r
   //\r
@@ -522,156 +602,179 @@ Returns:
   if (ExceptionFlags & EXCEPTION_FLAG_FATAL) {\r
     VmPtr->StopFlags |= STOPFLAG_APP_DONE;\r
   }\r
-  //\r
-  // Initialize the context structure\r
-  //\r
-  EbcContext.R0                   = VmPtr->R[0];\r
-  EbcContext.R1                   = VmPtr->R[1];\r
-  EbcContext.R2                   = VmPtr->R[2];\r
-  EbcContext.R3                   = VmPtr->R[3];\r
-  EbcContext.R4                   = VmPtr->R[4];\r
-  EbcContext.R5                   = VmPtr->R[5];\r
-  EbcContext.R6                   = VmPtr->R[6];\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
   //\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 ((ExceptionType >= 0) && (ExceptionType <= MAX_EBC_EXCEPTION) &&\r
-      (mDebugExceptionCallback[ExceptionType] != NULL)) {\r
+  // EBC driver will register default exception callback to report the\r
+  // status code via the status code API\r
+  //\r
+  if (mDebugExceptionCallback[ExceptionType] != NULL) {\r
+\r
+    //\r
+    // Initialize the context structure\r
+    //\r
+    EbcContext.R0                   = VmPtr->R[0];\r
+    EbcContext.R1                   = VmPtr->R[1];\r
+    EbcContext.R2                   = VmPtr->R[2];\r
+    EbcContext.R3                   = VmPtr->R[3];\r
+    EbcContext.R4                   = VmPtr->R[4];\r
+    EbcContext.R5                   = VmPtr->R[5];\r
+    EbcContext.R6                   = VmPtr->R[6];\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
     mDebugExceptionCallback[ExceptionType] (ExceptionType, SystemContext);\r
+    //\r
+    // Restore the context structure and continue to execute\r
+    //\r
+    VmPtr->R[0]  = EbcContext.R0;\r
+    VmPtr->R[1]  = EbcContext.R1;\r
+    VmPtr->R[2]  = EbcContext.R2;\r
+    VmPtr->R[3]  = EbcContext.R3;\r
+    VmPtr->R[4]  = EbcContext.R4;\r
+    VmPtr->R[5]  = EbcContext.R5;\r
+    VmPtr->R[6]  = EbcContext.R6;\r
+    VmPtr->R[7]  = EbcContext.R7;\r
+    VmPtr->Ip    = (VMIP)(UINTN)EbcContext.Ip;\r
+    VmPtr->Flags = EbcContext.Flags;\r
   }\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+InitializeEbcCallback (\r
+  IN EFI_DEBUG_SUPPORT_PROTOCOL  *This\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  To install default Callback function for the VM interpreter.\r
+  \r
+Arguments:\r
+\r
+  This - pointer to the instance of DebugSupport protocol\r
+\r
+Returns:\r
+\r
+  None\r
+  \r
+--*/\r
+{\r
+  INTN       Index;\r
+  EFI_STATUS Status;\r
+\r
   //\r
-  // Determine if we should report the exception. We report all of them by default,\r
-  // but if a debugger is attached don't report the breakpoint, debug, and step exceptions.\r
-  // Note that EXCEPT_EBC_OVERFLOW is never reported by this VM implementation, so is\r
-  // not included in the switch statement.\r
-  //\r
-  Report = TRUE;\r
-  switch (ExceptionType) {\r
-  case EXCEPT_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_EBC_EXCEPTION | EFI_SW_EC_EBC_DIVIDE_ERROR;\r
-    break;\r
-\r
-  case EXCEPT_EBC_DEBUG:\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_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_EBC_EXCEPTION | EFI_SW_EC_EBC_INVALID_OPCODE;\r
-    break;\r
-\r
-  case EXCEPT_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_EBC_EXCEPTION | EFI_SW_EC_EBC_ALIGNMENT_CHECK;\r
-    break;\r
-\r
-  case EXCEPT_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_EBC_EXCEPTION | EFI_SW_EC_EBC_BAD_BREAK;\r
-    break;\r
-\r
-  case EXCEPT_EBC_STEP:\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_EBC_EXCEPTION | EFI_SW_EC_NON_SPECIFIC;\r
-    break;\r
+  // For ExceptionCallback\r
+  //\r
+  for (Index = 0; Index <= MAX_EBC_EXCEPTION; Index++) {\r
+    EbcDebugRegisterExceptionCallback (\r
+      This,\r
+      0,\r
+      CommonEbcExceptionHandler,\r
+      Index\r
+      );\r
   }\r
+\r
   //\r
-  // If we determined that we should report the condition, then do so now.\r
+  // For PeriodicCallback\r
   //\r
-  if (Report) {\r
-    REPORT_STATUS_CODE (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED, StatusCodeValue);\r
+  Status = gBS->CreateEvent (\r
+                  EFI_EVENT_TIMER | EFI_EVENT_NOTIFY_SIGNAL,\r
+                  EFI_TPL_NOTIFY,\r
+                  EbcPeriodicNotifyFunction,\r
+                  &mVmPtr,\r
+                  &mEbcPeriodicEvent\r
+                  );\r
+  if (EFI_ERROR(Status)) {\r
+    return Status;\r
   }\r
 \r
-  switch (ExceptionType) {\r
-  //\r
-  // If ReportStatusCode returned, then for most exceptions we do an assert. The\r
-  // ExceptionType++ is done simply to force the ASSERT() condition to be met.\r
-  // For breakpoints, assume a debugger did not insert a software breakpoint\r
-  // and skip the instruction.\r
-  //\r
-  case EXCEPT_EBC_BREAKPOINT:\r
-    VmPtr->Ip += 2;\r
-    break;\r
-\r
-  case EXCEPT_EBC_STEP:\r
-    break;\r
-\r
-  case EXCEPT_EBC_UNDEFINED:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_UNDEFINED);\r
-    break;\r
-\r
-  case EXCEPT_EBC_DIVIDE_ERROR:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_DIVIDE_ERROR);\r
-    break;\r
-\r
-  case EXCEPT_EBC_DEBUG:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_DEBUG);\r
-    break;\r
-\r
-  case EXCEPT_EBC_INVALID_OPCODE:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_INVALID_OPCODE);\r
-    break;\r
-\r
-  case EXCEPT_EBC_STACK_FAULT:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_STACK_FAULT);\r
-    break;\r
-\r
-  case EXCEPT_EBC_ALIGNMENT_CHECK:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_ALIGNMENT_CHECK);\r
-    break;\r
-\r
-  case EXCEPT_EBC_INSTRUCTION_ENCODING:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_INSTRUCTION_ENCODING);\r
-    break;\r
-\r
-  case EXCEPT_EBC_BAD_BREAK:\r
-    ExceptionType++;\r
-    ASSERT (ExceptionType == EXCEPT_EBC_BAD_BREAK);\r
-    break;\r
-\r
-  default:\r
-    //\r
-    // Unknown\r
-    //\r
-    ASSERT (0);\r
-    break;\r
+  Status = gBS->SetTimer (\r
+                  mEbcPeriodicEvent,\r
+                  TimerPeriodic,\r
+                  EBC_VM_PERIODIC_CALLBACK_RATE\r
+                  );\r
+  if (EFI_ERROR(Status)) {\r
+    return Status;\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+VOID\r
+CommonEbcExceptionHandler (\r
+  IN EFI_EXCEPTION_TYPE   InterruptType,\r
+  IN EFI_SYSTEM_CONTEXT   SystemContext\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  The default Exception Callback for the VM interpreter.\r
+  In this function, we report status code, and print debug information\r
+  about EBC_CONTEXT, then dead loop.\r
+  \r
+Arguments:\r
+\r
+  InterruptType - Interrupt type.\r
+  SystemContext - EBC system context.\r
+\r
+Returns:\r
+\r
+  None\r
+  \r
+--*/\r
+{\r
+  //\r
+  // We deadloop here to make it easy to debug this issue.\r
+  //\r
+  ASSERT (FALSE);\r
+\r
+  return ;\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+EbcPeriodicNotifyFunction (\r
+  IN EFI_EVENT     Event,\r
+  IN VOID          *Context\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  The periodic callback function for EBC VM interpreter, which is used\r
+  to support the EFI debug support protocol.\r
+  \r
+Arguments:\r
+\r
+  Event   - The Periodic Callback Event.\r
+  Context - It should be the address of VM_CONTEXT pointer.\r
+\r
+Returns:\r
+\r
+  None.\r
+  \r
+--*/\r
+{\r
+  VM_CONTEXT *VmPtr;\r
+\r
+  VmPtr = *(VM_CONTEXT **)Context;\r
+\r
+  if (VmPtr != NULL) {\r
+    EbcDebugPeriodic (VmPtr);\r
+  }\r
+\r
+  return ;\r
+}\r
+\r
+\r
 EFI_STATUS\r
 EbcDebugPeriodic (\r
   IN VM_CONTEXT *VmPtr\r
@@ -693,6 +796,47 @@ Returns:
   \r
 --*/\r
 {\r
+  EFI_SYSTEM_CONTEXT_EBC   EbcContext;\r
+  EFI_SYSTEM_CONTEXT       SystemContext;\r
+  \r
+  //\r
+  // If someone's registered for periodic callbacks, then call them.\r
+  //\r
+  if (mDebugPeriodicCallback != NULL) {\r
+\r
+    //\r
+    // Initialize the context structure\r
+    //\r
+    EbcContext.R0                   = VmPtr->R[0];\r
+    EbcContext.R1                   = VmPtr->R[1];\r
+    EbcContext.R2                   = VmPtr->R[2];\r
+    EbcContext.R3                   = VmPtr->R[3];\r
+    EbcContext.R4                   = VmPtr->R[4];\r
+    EbcContext.R5                   = VmPtr->R[5];\r
+    EbcContext.R6                   = VmPtr->R[6];\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
+    mDebugPeriodicCallback (SystemContext);\r
+\r
+    //\r
+    // Restore the context structure and continue to execute\r
+    //\r
+    VmPtr->R[0]  = EbcContext.R0;\r
+    VmPtr->R[1]  = EbcContext.R1;\r
+    VmPtr->R[2]  = EbcContext.R2;\r
+    VmPtr->R[3]  = EbcContext.R3;\r
+    VmPtr->R[4]  = EbcContext.R4;\r
+    VmPtr->R[5]  = EbcContext.R5;\r
+    VmPtr->R[6]  = EbcContext.R6;\r
+    VmPtr->R[7]  = EbcContext.R7;\r
+    VmPtr->Ip    = (VMIP)(UINTN)EbcContext.Ip;\r
+    VmPtr->Flags = EbcContext.Flags;\r
+  }\r
+  \r
   return EFI_SUCCESS;\r
 }\r
 \r
index 51bd785a53229f9861c788fde53f8161ad3483bd..11b72f64aa66e0a181fe5155ba1302acaaf53be7 100644 (file)
@@ -51,6 +51,8 @@ typedef struct {
   UINTN             ImageBase;\r
 } VM_CONTEXT;\r
 \r
+extern VM_CONTEXT                    *mVmPtr;\r
+\r
 //\r
 // Bits of exception flags field of VM context\r
 //\r
index d575417fe94515d3980559a1568c9df9622992e2..178fa1ea598114d84919f95a2e268e80daa9e9e9 100644 (file)
@@ -15,7 +15,7 @@ Module Name:
 \r
 Abstract:\r
 \r
-Revision History\r
+  Provide support functions for variable services.\r
 \r
 --*/\r
 \r
@@ -125,7 +125,8 @@ Arguments:
 \r
 Returns:\r
 \r
-  EFI STATUS\r
+  EFI_INVALID_PARAMETER   - Parameters not valid\r
+  EFI_SUCCESS             - Variable store successfully updated\r
 \r
 --*/\r
 {\r
@@ -176,11 +177,10 @@ Returns:
     if ((DataPtr + DataSize) >= ((UINTN) ((UINT8 *) VolatileBase + VolatileBase->Size))) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-  }\r
-  //\r
-  // If Volatile Variable just do a simple mem copy.\r
-  //\r
-  if (Volatile) {\r
+\r
+    //\r
+    // If Volatile Variable just do a simple mem copy.\r
+    //\r
     CopyMem ((UINT8 *) ((UINTN) DataPtr), Buffer, DataSize);\r
     return EFI_SUCCESS;\r
   }\r
@@ -212,9 +212,7 @@ Returns:
                     &CurrWriteSize,\r
                     CurrBuffer\r
                     );\r
-          if (EFI_ERROR (Status)) {\r
-            return Status;\r
-          }\r
+          return Status;\r
         } else {\r
           Size = (UINT32) (LinearOffset + PtrBlockMapEntry->BlockLength - CurrWritePtr);\r
           Status = EfiFvbWriteBlock (\r
index 1f2f8fd2b46d64d4c44c56f9e147407fe8b3d4d6..8824dc412afd89cd368cf70559c8d91e2fdf851a 100644 (file)
@@ -1196,8 +1196,9 @@ Returns:
   Ptr           = (UINT16 *) FwVolHeader;\r
   Checksum      = 0;\r
   while (HeaderLength > 0) {\r
-    Checksum = *Ptr++;\r
+    Checksum = Checksum + (*Ptr);\r
     HeaderLength--;\r
+    Ptr++;\r
   }\r
 \r
   if (Checksum != 0) {\r