From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id DDA5981E02 for ; Mon, 14 Nov 2016 05:14:59 -0800 (PST) Received: by mail-wm0-x244.google.com with SMTP id g23so15290503wme.1 for ; Mon, 14 Nov 2016 05:15:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MEyXBLxScQxPzheZZsT3kKCpAo+vgbZsiJLFV4/TN/4=; b=pM7dnXt4onWZnSwwC9S+QzoJrX4F7I1iu/WP0pacuLYd16eAZKM7kHeNDk7CYkx9Ni iFiZCmDIp4R9lAmfKJlYtykHyj3y7lyQ5OUW3OO/jiJo+7IOYUUzm6D4mXixlpwOVGtk KmyRxFsOcH7cNo3wpqELipx90XvY9JQ0PAD9V4ffq9d19wO8/W4hqReuqVEKfVE9J+3r FEFXKqjqNvsdDKNex8n9ZmYBfsCC76VayNh6Hg5An5E4NOtrVBS7vKe30FeYd+xCfawT DSOnmkYNQoyOdJplAXgTf9JiSvhhwsFh2XeNxdBr2VQJ5bueLuIuXHAMqbaILeyA9zTI hrLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MEyXBLxScQxPzheZZsT3kKCpAo+vgbZsiJLFV4/TN/4=; b=P5aKEGsjPiogKXstdRo/nMHnk/G5kpjBQyY0p4ltbpVGzqNZ/RWnNNBBC1HiZpZeiQ RspqjT/UoPgZI0kF2C55X6KkiyoMcj/U9kjVi7ry24NPXyU0SB1xIfBd03LV2S28f7Tz YTVZpbGs2GtenDhuDPliJ6poyUOfSsA1mmaObzzHcjGHll3KcFPFzQPi8KYbVntNM2+h bSL+of30K0SYSKB58QWqrj8TB3TOFGp1rBBHcM4DmoS9rX0BIem3cx24mQsMqw8XbMfD CSzcOJgqd+vesVQVbP1OuijOMUiimNqdZRuRoUq4ibflqxwKRBtqLV9uB+Pjb8ewPp3J pstg== X-Gm-Message-State: ABUngvfKTVbaQj71FJ4x/hLmBvkRDkYmB0wXztS0sfWaptQ4QqqktaRcDbYX2KMY4pjBUg== X-Received: by 10.194.124.233 with SMTP id ml9mr19585105wjb.139.1479129302681; Mon, 14 Nov 2016 05:15:02 -0800 (PST) Received: from localhost.localdomain ([84.203.71.247]) by smtp.gmail.com with ESMTPSA id b7sm11616886wjm.39.2016.11.14.05.14.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 14 Nov 2016 05:15:02 -0800 (PST) From: Pete Batard To: edk2-devel@lists.01.org Date: Mon, 14 Nov 2016 13:14:16 +0000 Message-Id: <20161114131418.11876-2-pete@akeo.ie> X-Mailer: git-send-email 2.9.3.windows.2 In-Reply-To: <20161114131418.11876-1-pete@akeo.ie> References: <20161114131418.11876-1-pete@akeo.ie> Subject: [PATCH (RESEND) v2 1/3] MdeModulePkg/EbcDxe: prepare support for EBC Debugger X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Nov 2016 13:15:00 -0000 * This patch introduces EbcDebuggerHook.c/h and inserts the required EBCDebugger references into the existing EBC source files. * With all the hooks defined to their empty version in EbcDebuggerHook.c the existing EBC VM behaviour is left unaffected. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Pete Batard --- MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c | 3 + MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.c | 158 +++++++++++++++++++++ MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.h | 113 +++++++++++++++ MdeModulePkg/Universal/EbcDxe/EbcDxe.inf | 4 +- MdeModulePkg/Universal/EbcDxe/EbcExecute.c | 39 +++++ MdeModulePkg/Universal/EbcDxe/EbcInt.c | 6 + MdeModulePkg/Universal/EbcDxe/Ia32/EbcSupport.c | 7 +- MdeModulePkg/Universal/EbcDxe/Ipf/EbcSupport.c | 9 +- MdeModulePkg/Universal/EbcDxe/X64/EbcSupport.c | 7 +- 9 files changed, 339 insertions(+), 7 deletions(-) create mode 100644 MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.c create mode 100644 MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.h diff --git a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c index c5cc76d7bdcb..8fad8929008b 100644 --- a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c +++ b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c @@ -18,6 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "EbcInt.h" #include "EbcExecute.h" +#include "EbcDebuggerHook.h" // // Amount of space that is not used in the stack @@ -225,6 +226,7 @@ EbcInterpret ( // // Begin executing the EBC code // + EbcDebuggerHookEbcInterpret (&VmContext); EbcExecute (&VmContext); // @@ -336,6 +338,7 @@ ExecuteEbcImageEntryPoint ( // // Begin executing the EBC code // + EbcDebuggerHookExecuteEbcImageEntryPoint (&VmContext); EbcExecute (&VmContext); // diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.c b/MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.c new file mode 100644 index 000000000000..68fc4725fc54 --- /dev/null +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.c @@ -0,0 +1,158 @@ +/** @file + Contains the empty version of the EBC Debugger hooks, to be used when + compiling the regular EBC VM module. + As debugging is not needed for the standard EBC VM, all calls are left empty. + + The EBC Debugger defines its own version for these calls in EbdHooks.c. + + Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include + +VOID +EbcDebuggerHookInit ( + IN EFI_HANDLE Handle, + IN EFI_DEBUG_SUPPORT_PROTOCOL *EbcDebugProtocol + ) +{ + return; +} + +VOID +EbcDebuggerHookUnload ( + VOID + ) +{ + return; +} + +VOID +EbcDebuggerHookEbcUnloadImage ( + IN EFI_HANDLE Handle + ) +{ + return; +} + +VOID +EbcDebuggerHookExecuteEbcImageEntryPoint ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookEbcInterpret ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookExecuteStart ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookExecuteEnd ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookCALLStart ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookCALLEnd ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookCALLEXStart ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookCALLEXEnd ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookRETStart ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookRETEnd ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookJMPStart ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookJMPEnd ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookJMP8Start ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} + +VOID +EbcDebuggerHookJMP8End ( + IN VM_CONTEXT *VmPtr + ) +{ + return; +} diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.h b/MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.h new file mode 100644 index 000000000000..383052b2c3cd --- /dev/null +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebuggerHook.h @@ -0,0 +1,113 @@ +/** @file + Prototypes for the EBC Debugger hooks. + + Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef _EFI_EBC_DEBUGGER_HOOK_H_ +#define _EFI_EBC_DEBUGGER_HOOK_H_ + +// +// Hooks in EbcInt.c +// +VOID +EbcDebuggerHookInit ( + IN EFI_HANDLE Handle, + IN EFI_DEBUG_SUPPORT_PROTOCOL *EbcDebugProtocol + ); + +VOID +EbcDebuggerHookUnload ( + VOID + ); + +VOID +EbcDebuggerHookEbcUnloadImage ( + IN EFI_HANDLE Handle + ); + +// +// Hooks in EbcSupport.c +// +VOID +EbcDebuggerHookExecuteEbcImageEntryPoint ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookEbcInterpret ( + IN VM_CONTEXT *VmPtr + ); + +// +// Hooks in EbcExecute.c +// +VOID +EbcDebuggerHookExecuteStart ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookExecuteEnd ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookCALLStart ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookCALLEnd ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookCALLEXStart ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookCALLEXEnd ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookRETStart ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookRETEnd ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookJMPStart ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookJMPEnd ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookJMP8Start ( + IN VM_CONTEXT *VmPtr + ); + +VOID +EbcDebuggerHookJMP8End ( + IN VM_CONTEXT *VmPtr + ); + +#endif diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf b/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf index e9a0b28c4074..f5d9ecec6997 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf +++ b/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf @@ -33,6 +33,8 @@ # [Sources] + EbcDebuggerHook.h + EbcDebuggerHook.c EbcExecute.h EbcExecute.c EbcInt.h @@ -88,4 +90,4 @@ # EVENT_TYPE_PERIODIC_TIMER ## CONSUMES [UserExtensions.TianoCore."ExtraFiles"] - EbcDxeExtra.uni \ No newline at end of file + EbcDxeExtra.uni diff --git a/MdeModulePkg/Universal/EbcDxe/EbcExecute.c b/MdeModulePkg/Universal/EbcDxe/EbcExecute.c index d9c17f48a038..c8da00bf598f 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcExecute.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcExecute.c @@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "EbcInt.h" #include "EbcExecute.h" +#include "EbcDebuggerHook.h" // @@ -1488,6 +1489,9 @@ EbcExecute ( Status = EFI_UNSUPPORTED; goto Done; } + + EbcDebuggerHookExecuteStart (VmPtr); + // // The EBC VM is a strongly ordered processor, so perform a fence operation before // and after each instruction is executed. @@ -1498,6 +1502,8 @@ EbcExecute ( MemoryFence (); + EbcDebuggerHookExecuteEnd (VmPtr); + // // If the step flag is set, signal an exception and continue. We don't // clear it here. Assuming the debugger is responsible for clearing it. @@ -1976,7 +1982,9 @@ ExecuteJMP ( ConditionFlag = (UINT8) VMFLAG_ISSET (VmPtr, VMFLAGS_CC); if ((Operand & CONDITION_M_CONDITIONAL) != 0) { if (CompareSet != ConditionFlag) { + EbcDebuggerHookJMPStart (VmPtr); VmPtr->Ip += Size; + EbcDebuggerHookJMPEnd (VmPtr); return EFI_SUCCESS; } } @@ -2015,11 +2023,13 @@ ExecuteJMP ( // // Take jump -- relative or absolute // + EbcDebuggerHookJMPStart (VmPtr); if ((Operand & JMP_M_RELATIVE) != 0) { VmPtr->Ip += (UINTN) Data64 + Size; } else { VmPtr->Ip = (VMIP) (UINTN) Data64; } + EbcDebuggerHookJMPEnd (VmPtr); return EFI_SUCCESS; } @@ -2065,11 +2075,14 @@ ExecuteJMP ( return EFI_UNSUPPORTED; } + EbcDebuggerHookJMPStart (VmPtr); if ((Operand & JMP_M_RELATIVE) != 0) { VmPtr->Ip += (UINTN) Addr + Size; } else { VmPtr->Ip = (VMIP) Addr; } + EbcDebuggerHookJMPEnd (VmPtr); + } else { // // Form: JMP32 Rx {Immed32} @@ -2085,11 +2098,14 @@ ExecuteJMP ( return EFI_UNSUPPORTED; } + EbcDebuggerHookJMPStart (VmPtr); if ((Operand & JMP_M_RELATIVE) != 0) { VmPtr->Ip += (UINTN) Addr + Size; } else { VmPtr->Ip = (VMIP) Addr; } + EbcDebuggerHookJMPEnd (VmPtr); + } return EFI_SUCCESS; @@ -2129,7 +2145,9 @@ ExecuteJMP8 ( // if ((Opcode & CONDITION_M_CONDITIONAL) != 0) { if (CompareSet != ConditionFlag) { + EbcDebuggerHookJMP8Start (VmPtr); VmPtr->Ip += 2; + EbcDebuggerHookJMP8End (VmPtr); return EFI_SUCCESS; } } @@ -2141,7 +2159,9 @@ ExecuteJMP8 ( // // Want to check for offset == -2 and then raise an exception? // + EbcDebuggerHookJMP8Start (VmPtr); VmPtr->Ip += (Offset * 2) + 2; + EbcDebuggerHookJMP8End (VmPtr); return EFI_SUCCESS; } @@ -2966,6 +2986,13 @@ ExecuteCALL ( // Opcode = GETOPCODE (VmPtr); Operands = GETOPERANDS (VmPtr); + + if (Operands & OPERAND_M_NATIVE_CALL) { + EbcDebuggerHookCALLEXStart (VmPtr); + } else { + EbcDebuggerHookCALLStart (VmPtr); + } + // // Assign these as well to avoid compiler warnings // @@ -3067,6 +3094,12 @@ ExecuteCALL ( } } + if (Operands & OPERAND_M_NATIVE_CALL) { + EbcDebuggerHookCALLEXEnd (VmPtr); + } else { + EbcDebuggerHookCALLEnd (VmPtr); + } + return EFI_SUCCESS; } @@ -3087,6 +3120,9 @@ ExecuteRET ( IN VM_CONTEXT *VmPtr ) { + + EbcDebuggerHookRETStart (VmPtr); + // // If we're at the top of the stack, then simply set the done // flag and return @@ -3114,6 +3150,9 @@ ExecuteRET ( VmPtr->Gpr[0] += 8; } + + EbcDebuggerHookRETEnd (VmPtr); + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Universal/EbcDxe/EbcInt.c b/MdeModulePkg/Universal/EbcDxe/EbcInt.c index 549e0dd8dc1c..91206c32f5c2 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcInt.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcInt.c @@ -16,6 +16,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "EbcInt.h" #include "EbcExecute.h" +#include "EbcDebuggerHook.h" // // We'll keep track of all thunks we create in a linked list. Each @@ -497,6 +498,8 @@ InitializeEbcDriver ( InitEbcVmTestProtocol (&ImageHandle); DEBUG_CODE_END (); + EbcDebuggerHookInit (ImageHandle, EbcDebugProtocol); + return EFI_SUCCESS; ErrorExit: @@ -1094,6 +1097,9 @@ EbcUnloadImage ( // Now free up the image list element // FreePool (ImageList); + + EbcDebuggerHookEbcUnloadImage (ImageHandle); + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Universal/EbcDxe/Ia32/EbcSupport.c b/MdeModulePkg/Universal/EbcDxe/Ia32/EbcSupport.c index bddfbf630d73..89be9eb5f4df 100644 --- a/MdeModulePkg/Universal/EbcDxe/Ia32/EbcSupport.c +++ b/MdeModulePkg/Universal/EbcDxe/Ia32/EbcSupport.c @@ -15,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "EbcInt.h" #include "EbcExecute.h" +#include "EbcDebuggerHook.h" // // NOTE: This is the stack size allocated for the interpreter @@ -332,10 +333,11 @@ EbcInterpret ( // // Begin executing the EBC code // + EbcDebuggerHookEbcInterpret (&VmContext); EbcExecute (&VmContext); // - // Return the value in R[7] unless there was an error + // Return the value in Gpr[7] unless there was an error // ReturnEBCStack(StackIndex); return (UINT64) VmContext.Gpr[7]; @@ -432,10 +434,11 @@ ExecuteEbcImageEntryPoint ( // // Begin executing the EBC code // + EbcDebuggerHookExecuteEbcImageEntryPoint (&VmContext); EbcExecute (&VmContext); // - // Return the value in R[7] unless there was an error + // Return the value in Gpr[7] unless there was an error // ReturnEBCStack(StackIndex); return (UINT64) VmContext.Gpr[7]; diff --git a/MdeModulePkg/Universal/EbcDxe/Ipf/EbcSupport.c b/MdeModulePkg/Universal/EbcDxe/Ipf/EbcSupport.c index 23b6c1bd8472..07499137e621 100644 --- a/MdeModulePkg/Universal/EbcDxe/Ipf/EbcSupport.c +++ b/MdeModulePkg/Universal/EbcDxe/Ipf/EbcSupport.c @@ -16,6 +16,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "EbcInt.h" #include "EbcExecute.h" #include "EbcSupport.h" +#include "EbcDebuggerHook.h" /** Given raw bytes of Itanium based code, format them into a bundle and @@ -214,12 +215,15 @@ EbcInterpret ( PushU64 (&VmContext, 0); PushU64 (&VmContext, 0xDEADBEEFDEADBEEF); VmContext.StackRetAddr = (UINT64) VmContext.Gpr[0]; + // // Begin executing the EBC code // + EbcDebuggerHookEbcInterpret (&VmContext); EbcExecute (&VmContext); + // - // Return the value in R[7] unless there was an error + // Return the value in Gpr[7] unless there was an error // ReturnEBCStack(StackIndex); return (UINT64) VmContext.Gpr[7]; @@ -334,10 +338,11 @@ ExecuteEbcImageEntryPoint ( // // Begin executing the EBC code // + EbcDebuggerHookExecuteEbcImageEntryPoint (&VmContext); EbcExecute (&VmContext); // - // Return the value in R[7] unless there was an error + // Return the value in Gpr[7] unless there was an error // ReturnEBCStack(StackIndex); return (UINT64) VmContext.Gpr[7]; diff --git a/MdeModulePkg/Universal/EbcDxe/X64/EbcSupport.c b/MdeModulePkg/Universal/EbcDxe/X64/EbcSupport.c index bdde5e41fad8..9c188a8e2dae 100644 --- a/MdeModulePkg/Universal/EbcDxe/X64/EbcSupport.c +++ b/MdeModulePkg/Universal/EbcDxe/X64/EbcSupport.c @@ -15,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "EbcInt.h" #include "EbcExecute.h" +#include "EbcDebuggerHook.h" // // NOTE: This is the stack size allocated for the interpreter @@ -278,10 +279,11 @@ EbcInterpret ( // // Begin executing the EBC code // + EbcDebuggerHookEbcInterpret (&VmContext); EbcExecute (&VmContext); // - // Return the value in R[7] unless there was an error + // Return the value in Gpr[7] unless there was an error // ReturnEBCStack(StackIndex); return (UINT64) VmContext.Gpr[7]; @@ -389,10 +391,11 @@ ExecuteEbcImageEntryPoint ( // // Begin executing the EBC code // + EbcDebuggerHookExecuteEbcImageEntryPoint (&VmContext); EbcExecute (&VmContext); // - // Return the value in R[7] unless there was an error + // Return the value in Gpr[7] unless there was an error // ReturnEBCStack(StackIndex); return (UINT64) VmContext.Gpr[7]; -- 2.9.3.windows.2