* The VmReadIndex## function now take an optional pointer to an index pair structure which, when not NULL, is filled with the decoded const and natural values. * This feature is needed by the ARM EBC VM. * For now, the new parameters is set to NULL, so as not to change existing behaviour with current EBC VM platforms.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Pete Batard <p...@akeo.ie> --- MdeModulePkg/Universal/EbcDxe/EbcExecute.c | 116 +++++++++++++++++++++-------- MdeModulePkg/Universal/EbcDxe/EbcExecute.h | 8 ++ 2 files changed, 93 insertions(+), 31 deletions(-) diff --git a/MdeModulePkg/Universal/EbcDxe/EbcExecute.c b/MdeModulePkg/Universal/EbcDxe/EbcExecute.c index e5d290a2fec6..2d21c3364e0d 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcExecute.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcExecute.c @@ -61,6 +61,8 @@ UINT64 @param VmPtr A pointer to VM context. @param CodeOffset Offset from IP of the location of the 16-bit index to decode. + @param IndexPtr An optional pointer where the decoded index pair + values can be written. @return The decoded offset. @@ -68,7 +70,8 @@ UINT64 INT16 VmReadIndex16 ( IN VM_CONTEXT *VmPtr, - IN UINT32 CodeOffset + IN UINT32 CodeOffset, + OUT EBC_INDEX *IndexPtr OPTIONAL ); /** @@ -77,6 +80,8 @@ VmReadIndex16 ( @param VmPtr A pointer to VM context. @param CodeOffset Offset from IP of the location of the 32-bit index to decode. + @param IndexPtr An optional pointer where the decoded index pair + values can be written. @return Converted index per EBC VM specification. @@ -84,7 +89,8 @@ VmReadIndex16 ( INT32 VmReadIndex32 ( IN VM_CONTEXT *VmPtr, - IN UINT32 CodeOffset + IN UINT32 CodeOffset, + OUT EBC_INDEX *IndexPtr OPTIONAL ); /** @@ -93,6 +99,8 @@ VmReadIndex32 ( @param VmPtr A pointer to VM context.s @param CodeOffset Offset from IP of the location of the 64-bit index to decode. + @param IndexPtr An optional pointer where the decoded index pair + values can be written. @return Converted index per EBC VM specification @@ -100,7 +108,8 @@ VmReadIndex32 ( INT64 VmReadIndex64 ( IN VM_CONTEXT *VmPtr, - IN UINT32 CodeOffset + IN UINT32 CodeOffset, + OUT EBC_INDEX *IndexPtr OPTIONAL ); /** @@ -1600,13 +1609,13 @@ ExecuteMOVxx ( // Get one or both index values. // if ((Opcode & OPCODE_M_IMMED_OP1) != 0) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); Index64Op1 = (INT64) Index16; Size += sizeof (UINT16); } if ((Opcode & OPCODE_M_IMMED_OP2) != 0) { - Index16 = VmReadIndex16 (VmPtr, Size); + Index16 = VmReadIndex16 (VmPtr, Size, NULL); Index64Op2 = (INT64) Index16; Size += sizeof (UINT16); } @@ -1615,13 +1624,13 @@ ExecuteMOVxx ( // MOVBD, MOVWD, MOVDD, MOVQD, and MOVND have 32-bit immediate index // if ((Opcode & OPCODE_M_IMMED_OP1) != 0) { - Index32 = VmReadIndex32 (VmPtr, 2); + Index32 = VmReadIndex32 (VmPtr, 2, NULL); Index64Op1 = (INT64) Index32; Size += sizeof (UINT32); } if ((Opcode & OPCODE_M_IMMED_OP2) != 0) { - Index32 = VmReadIndex32 (VmPtr, Size); + Index32 = VmReadIndex32 (VmPtr, Size, NULL); Index64Op2 = (INT64) Index32; Size += sizeof (UINT32); } @@ -1630,12 +1639,12 @@ ExecuteMOVxx ( // MOVqq -- only form with a 64-bit index // if ((Opcode & OPCODE_M_IMMED_OP1) != 0) { - Index64Op1 = VmReadIndex64 (VmPtr, 2); + Index64Op1 = VmReadIndex64 (VmPtr, 2, NULL); Size += sizeof (UINT64); } if ((Opcode & OPCODE_M_IMMED_OP2) != 0) { - Index64Op2 = VmReadIndex64 (VmPtr, Size); + Index64Op2 = VmReadIndex64 (VmPtr, Size, NULL); Size += sizeof (UINT64); } } else { @@ -2042,7 +2051,7 @@ ExecuteJMP ( // if ((Opcode & OPCODE_M_IMMDATA) != 0) { if (OPERAND1_INDIRECT (Operand)) { - Index32 = VmReadIndex32 (VmPtr, 2); + Index32 = VmReadIndex32 (VmPtr, 2, NULL); } else { Index32 = VmReadImmed32 (VmPtr, 2); } @@ -2210,7 +2219,7 @@ ExecuteMOVI ( // Get the index (16-bit) if present // if ((Operands & MOVI_M_IMMDATA) != 0) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); Size = 4; } else { Index16 = 0; @@ -2329,7 +2338,7 @@ ExecuteMOVIn ( // Get the operand1 index (16-bit) if present // if ((Operands & MOVI_M_IMMDATA) != 0) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); Size = 4; } else { Index16 = 0; @@ -2339,15 +2348,15 @@ ExecuteMOVIn ( // Extract the immediate data and convert to a 64-bit index. // if ((Opcode & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH16) { - ImmedIndex16 = VmReadIndex16 (VmPtr, Size); + ImmedIndex16 = VmReadIndex16 (VmPtr, Size, NULL); ImmedIndex64 = (INT64) ImmedIndex16; Size += 2; } else if ((Opcode & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH32) { - ImmedIndex32 = VmReadIndex32 (VmPtr, Size); + ImmedIndex32 = VmReadIndex32 (VmPtr, Size, NULL); ImmedIndex64 = (INT64) ImmedIndex32; Size += 4; } else if ((Opcode & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH64) { - ImmedIndex64 = VmReadIndex64 (VmPtr, Size); + ImmedIndex64 = VmReadIndex64 (VmPtr, Size, NULL); Size += 8; } else { // @@ -2430,7 +2439,7 @@ ExecuteMOVREL ( // Get the Operand 1 index (16-bit) if present // if ((Operands & MOVI_M_IMMDATA) != 0) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); Size = 4; } else { Index16 = 0; @@ -2539,7 +2548,7 @@ ExecuteMOVsnw ( Size = 2; if ((Opcode & OPCODE_M_IMMED_OP1) !=0) { if (OPERAND1_INDIRECT (Operands)) { - Op1Index = VmReadIndex16 (VmPtr, 2); + Op1Index = VmReadIndex16 (VmPtr, 2, NULL); } else { // // Illegal form operand1 direct with index: MOVsnw R1 Index16, {@}R2 @@ -2557,7 +2566,7 @@ ExecuteMOVsnw ( if ((Opcode & OPCODE_M_IMMED_OP2) != 0) { if (OPERAND2_INDIRECT (Operands)) { - Op2Index = VmReadIndex16 (VmPtr, Size); + Op2Index = VmReadIndex16 (VmPtr, Size, NULL); } else { Op2Index = VmReadImmed16 (VmPtr, Size); } @@ -2632,7 +2641,7 @@ ExecuteMOVsnd ( Size = 2; if ((Opcode & OPCODE_M_IMMED_OP1) != 0) { if (OPERAND1_INDIRECT (Operands)) { - Op1Index = VmReadIndex32 (VmPtr, 2); + Op1Index = VmReadIndex32 (VmPtr, 2, NULL); } else { // // Illegal form operand1 direct with index: MOVsnd R1 Index16,.. @@ -2650,7 +2659,7 @@ ExecuteMOVsnd ( if ((Opcode & OPCODE_M_IMMED_OP2) != 0) { if (OPERAND2_INDIRECT (Operands)) { - Op2Index = VmReadIndex32 (VmPtr, Size); + Op2Index = VmReadIndex32 (VmPtr, Size, NULL); } else { Op2Index = VmReadImmed32 (VmPtr, Size); } @@ -2712,7 +2721,7 @@ ExecutePUSHn ( // if ((Opcode & PUSHPOP_M_IMMDATA) != 0) { if (OPERAND1_INDIRECT (Operands)) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); } else { Index16 = VmReadImmed16 (VmPtr, 2); } @@ -2771,7 +2780,7 @@ ExecutePUSH ( // if ((Opcode & PUSHPOP_M_IMMDATA) != 0) { if (OPERAND1_INDIRECT (Operands)) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); } else { Index16 = VmReadImmed16 (VmPtr, 2); } @@ -2846,7 +2855,7 @@ ExecutePOPn ( // if ((Opcode & PUSHPOP_M_IMMDATA) != 0) { if (OPERAND1_INDIRECT (Operands)) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); } else { Index16 = VmReadImmed16 (VmPtr, 2); } @@ -2906,7 +2915,7 @@ ExecutePOP ( // if ((Opcode & PUSHPOP_M_IMMDATA) != 0) { if (OPERAND1_INDIRECT (Operands)) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); } else { Index16 = VmReadImmed16 (VmPtr, 2); } @@ -3012,7 +3021,7 @@ ExecuteCALL ( // If register operand is indirect, then the immediate data is an index // if (OPERAND1_INDIRECT (Operands)) { - Immed32 = VmReadIndex32 (VmPtr, 2); + Immed32 = VmReadIndex32 (VmPtr, 2, NULL); } else { Immed32 = VmReadImmed32 (VmPtr, 2); } @@ -3196,7 +3205,7 @@ ExecuteCMP ( // if ((Opcode & OPCODE_M_IMMDATA) != 0) { if (OPERAND2_INDIRECT (Operands)) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); } else { Index16 = VmReadImmed16 (VmPtr, 2); } @@ -3354,7 +3363,7 @@ ExecuteCMPI ( // Size = 2; if ((Operands & OPERAND_M_CMPI_INDEX) != 0) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); Size += 2; } else { Index16 = 0; @@ -4187,7 +4196,7 @@ ExecuteDataManip ( // Index16 if Ry is indirect, or Immed16 if Ry direct. // if (OPERAND2_INDIRECT (Operands)) { - Index16 = VmReadIndex16 (VmPtr, 2); + Index16 = VmReadIndex16 (VmPtr, 2, NULL); } else { Index16 = VmReadImmed16 (VmPtr, 2); } @@ -4430,6 +4439,8 @@ ExecuteSTORESP ( @param VmPtr A pointer to VM context. @param CodeOffset Offset from IP of the location of the 16-bit index to decode. + @param IndexPtr An optional pointer where the decoded index pair + values can be written. @return The decoded offset. @@ -4437,7 +4448,8 @@ ExecuteSTORESP ( INT16 VmReadIndex16 ( IN VM_CONTEXT *VmPtr, - IN UINT32 CodeOffset + IN UINT32 CodeOffset, + OUT EBC_INDEX *IndexPtr OPTIONAL ) { UINT16 Index; @@ -4491,6 +4503,18 @@ VmReadIndex16 ( Offset = (INT16) ((INT32) Offset * -1); } + // + // Copy the decoded index values if requested + // + if (IndexPtr != NULL) { + IndexPtr->NaturalUnits = (INT64) NaturalUnits; + IndexPtr->ConstUnits = (INT64) ConstUnits; + if ((Index & 0x8000) != 0) { + IndexPtr->NaturalUnits = MultS64x64 (IndexPtr->NaturalUnits, -1); + IndexPtr->ConstUnits = MultS64x64 (IndexPtr->ConstUnits, -1); + } + } + return Offset; } @@ -4501,6 +4525,8 @@ VmReadIndex16 ( @param VmPtr A pointer to VM context. @param CodeOffset Offset from IP of the location of the 32-bit index to decode. + @param IndexPtr An optional pointer where the decoded index pair + values can be written. @return Converted index per EBC VM specification. @@ -4508,7 +4534,8 @@ VmReadIndex16 ( INT32 VmReadIndex32 ( IN VM_CONTEXT *VmPtr, - IN UINT32 CodeOffset + IN UINT32 CodeOffset, + OUT EBC_INDEX *IndexPtr OPTIONAL ) { UINT32 Index; @@ -4554,6 +4581,18 @@ VmReadIndex32 ( Offset = Offset * -1; } + // + // Copy the decoded index values if requested + // + if (IndexPtr != NULL) { + IndexPtr->NaturalUnits = (INT64) NaturalUnits; + IndexPtr->ConstUnits = (INT64) ConstUnits; + if ((Index & 0x80000000) != 0) { + IndexPtr->NaturalUnits = MultS64x64 (IndexPtr->NaturalUnits, -1); + IndexPtr->ConstUnits = MultS64x64 (IndexPtr->ConstUnits, -1); + } + } + return Offset; } @@ -4564,6 +4603,8 @@ VmReadIndex32 ( @param VmPtr A pointer to VM context.s @param CodeOffset Offset from IP of the location of the 64-bit index to decode. + @param IndexPtr An optional pointer where the decoded index pair + values can be written. @return Converted index per EBC VM specification @@ -4571,7 +4612,8 @@ VmReadIndex32 ( INT64 VmReadIndex64 ( IN VM_CONTEXT *VmPtr, - IN UINT32 CodeOffset + IN UINT32 CodeOffset, + OUT EBC_INDEX *IndexPtr OPTIONAL ) { UINT64 Index; @@ -4617,6 +4659,18 @@ VmReadIndex64 ( Offset = MultS64x64 (Offset, -1); } + // + // Copy the decoded index values if requested + // + if (IndexPtr != NULL) { + IndexPtr->NaturalUnits = (INT64) NaturalUnits; + IndexPtr->ConstUnits = (INT64) ConstUnits; + if ((Index & 0x8000000000000000ULL) != 0) { + IndexPtr->NaturalUnits = MultS64x64 (IndexPtr->NaturalUnits, -1); + IndexPtr->ConstUnits = MultS64x64 (IndexPtr->ConstUnits, -1); + } + } + return Offset; } diff --git a/MdeModulePkg/Universal/EbcDxe/EbcExecute.h b/MdeModulePkg/Universal/EbcDxe/EbcExecute.h index b7489514b919..301c52666366 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcExecute.h +++ b/MdeModulePkg/Universal/EbcDxe/EbcExecute.h @@ -24,6 +24,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define IS_ALIGNED(addr, size) !((UINT32) (addr) & (size - 1)) // +// EBC index pair +// +typedef struct { + UINT64 NaturalUnits; + UINT64 ConstUnits; +} EBC_INDEX; + +// // Debug macro // #define EBCMSG(s) gST->ConOut->OutputString (gST->ConOut, s) -- 2.9.3.windows.2 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel