]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/EbcDxe/EbcExecute.c
Refine soma code to make code run safely.
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcExecute.c
index 29fcb2c418cdda69a62b79a1fc4ae295ef7f720b..48f7dcebdb728923b94b7c8a69287a422bed8d67 100644 (file)
@@ -1718,7 +1718,7 @@ ExecuteMOVxx (
     //\r
     // Not indirect source: MOVxx {@}Rx, Ry [Index]\r
     //\r
-    Data64 = VmPtr->Gpr[OPERAND2_REGNUM (Operands)] + Index64Op2;\r
+    Data64 = (UINT64) (VmPtr->Gpr[OPERAND2_REGNUM (Operands)] + Index64Op2);\r
     //\r
     // Did Operand2 have an index? If so, treat as two signed values since\r
     // indexes are signed values.\r
@@ -2005,7 +2005,7 @@ ExecuteJMP (
     // 64-bit immediate data is full address. Read the immediate data,\r
     // check for alignment, and jump absolute.\r
     //\r
-    Data64 = VmReadImmed64 (VmPtr, 2);\r
+    Data64 = (UINT64) VmReadImmed64 (VmPtr, 2);\r
     if (!IS_ALIGNED ((UINTN) Data64, sizeof (UINT16))) {\r
       EbcDebugSignalException (\r
         EXCEPT_EBC_ALIGNMENT_CHECK,\r
@@ -2049,7 +2049,7 @@ ExecuteJMP (
   if (OPERAND1_REGNUM (Operand) == 0) {\r
     Data64 = 0;\r
   } else {\r
-    Data64 = OPERAND1_REGDATA (VmPtr, Operand);\r
+    Data64 = (UINT64) OPERAND1_REGDATA (VmPtr, Operand);\r
   }\r
   //\r
   // Decode the forms\r
@@ -2264,7 +2264,7 @@ ExecuteMOVI (
     } else if ((Operands & MOVI_M_MOVEWIDTH) == MOVI_MOVEWIDTH32) {\r
       VmWriteMem32 (VmPtr, (UINTN) Op1, (UINT32) ImmData64);\r
     } else {\r
-      VmWriteMem64 (VmPtr, (UINTN) Op1, ImmData64);\r
+      VmWriteMem64 (VmPtr, (UINTN) Op1, (UINT64) ImmData64);\r
     }\r
   }\r
   //\r
@@ -2551,9 +2551,9 @@ ExecuteMOVsnw (
   //\r
   // Get the data from the source.\r
   //\r
-  Op2 = (INT64) ((INTN) (VmPtr->Gpr[OPERAND2_REGNUM (Operands)] + Op2Index));\r
+  Op2 = (UINT64) (VmPtr->Gpr[OPERAND2_REGNUM (Operands)] + Op2Index);\r
   if (OPERAND2_INDIRECT (Operands)) {\r
-    Op2 = (INT64) (INTN) VmReadMemN (VmPtr, (UINTN) Op2);\r
+    Op2 = (UINT64) VmReadMemN (VmPtr, (UINTN) Op2);\r
   }\r
   //\r
   // Now write back the result.\r
@@ -2644,9 +2644,9 @@ ExecuteMOVsnd (
   //\r
   // Get the data from the source.\r
   //\r
-  Op2 = (INT64) ((INTN) (VmPtr->Gpr[OPERAND2_REGNUM (Operands)] + Op2Index));\r
+  Op2 = (UINT64) (VmPtr->Gpr[OPERAND2_REGNUM (Operands)] + Op2Index);\r
   if (OPERAND2_INDIRECT (Operands)) {\r
-    Op2 = (INT64) (INTN) VmReadMemN (VmPtr, (UINTN) Op2);\r
+    Op2 = (UINT64) VmReadMemN (VmPtr, (UINTN) Op2);\r
   }\r
   //\r
   // Now write back the result.\r
@@ -3698,7 +3698,7 @@ ExecuteDIVU (
     // Get the destination register\r
     //\r
     if ((*VmPtr->Ip & DATAMANIP_M_64) != 0) {\r
-      return (UINT64) (DivU64x64Remainder ((INT64)Op1, (INT64)Op2, &Remainder));\r
+      return (UINT64) (DivU64x64Remainder (Op1, Op2, &Remainder));\r
     } else {\r
       return (UINT64) ((UINT32) Op1 / (UINT32) Op2);\r
     }\r
@@ -4195,7 +4195,7 @@ ExecuteDataManip (
   // Get operand1 (destination and sometimes also an actual operand)\r
   // of form {@}R1\r
   //\r
-  Op1 = VmPtr->Gpr[OPERAND1_REGNUM (Operands)];\r
+  Op1 = (UINT64) VmPtr->Gpr[OPERAND1_REGNUM (Operands)];\r
   if (OPERAND1_INDIRECT (Operands)) {\r
     if ((Opcode & DATAMANIP_M_64) != 0) {\r
       Op1 = VmReadMem64 (VmPtr, (UINTN) Op1);\r
@@ -4238,7 +4238,7 @@ ExecuteDataManip (
   // Write back the result.\r
   //\r
   if (OPERAND1_INDIRECT (Operands)) {\r
-    Op1 = VmPtr->Gpr[OPERAND1_REGNUM (Operands)];\r
+    Op1 = (UINT64) VmPtr->Gpr[OPERAND1_REGNUM (Operands)];\r
     if ((Opcode & DATAMANIP_M_64) != 0) {\r
       VmWriteMem64 (VmPtr, (UINTN) Op1, Op2);\r
     } else {\r
@@ -4573,7 +4573,7 @@ VmReadIndex64 (
   //\r
   ConstUnits = ARShiftU64 (((Index &~0xF000000000000000ULL) & Mask), (UINTN)NBits);\r
 \r
-  Offset  = MultU64x64 (NaturalUnits, sizeof (UINTN)) + ConstUnits;\r
+  Offset  = MultU64x64 ((UINT64) NaturalUnits, sizeof (UINTN)) + ConstUnits;\r
 \r
   //\r
   // Now set the sign\r
@@ -4781,7 +4781,6 @@ VmWriteMem64 (
   )\r
 {\r
   EFI_STATUS  Status;\r
-  UINT32      Data32;\r
 \r
   //\r
   // Convert the address if it's in the stack gap\r
@@ -4803,8 +4802,7 @@ VmWriteMem64 (
     }\r
 \r
     MemoryFence ();\r
-    Data32 = (UINT32) (((UINT32 *) &Data)[1]);\r
-    if ((Status = VmWriteMem32 (VmPtr, Addr + sizeof (UINT32), Data32)) != EFI_SUCCESS) {\r
+    if ((Status = VmWriteMem32 (VmPtr, Addr + sizeof (UINT32), (UINT32) RShiftU64(Data, 32))) != EFI_SUCCESS) {\r
       return Status;\r
     }\r
 \r
@@ -5259,9 +5257,9 @@ VmReadMem64 (
   //\r
   // Return unaligned data. Assume little endian.\r
   //\r
-  Data    = (UINT64) VmReadMem32 (VmPtr, Addr);\r
-  Data32  = VmReadMem32 (VmPtr, Addr + sizeof (UINT32));\r
-  *(UINT32 *) ((UINT32 *) &Data + 1) = Data32;\r
+  Data32 = VmReadMem32 (VmPtr, Addr);\r
+  Data  = (UINT64) VmReadMem32 (VmPtr, Addr + sizeof (UINT32));\r
+  Data  = LShiftU64 (Data, 32) | Data32;\r
   return Data;\r
 }\r
 \r