Add IMAGE_FILE_MACHINE_ARM64X and IMAGE_FILE_MACHINE_ARM64EC (#2858)
authorJuan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Thu, 19 Sep 2024 01:57:47 +0000 (18:57 -0700)
committerGitHub <noreply@github.com>
Thu, 19 Sep 2024 01:57:47 +0000 (18:57 -0700)
Co-authored-by: David Mason <davmason@microsoft.com>
---------

Co-authored-by: Mike McLaughlin <mikem@microsoft.com>
29 files changed:
diagnostics.sln
eng/Versions.props
src/SOS/CMakeLists.txt
src/SOS/SOS.Extensions/DebuggerServices.cs
src/SOS/SOS.Extensions/TargetFromFromDebuggerServices.cs
src/SOS/SOS.Hosting/DbgEng/DebugControl.cs
src/SOS/SOS.Hosting/DbgEng/Interop/Enums/ImageFileMachine.cs
src/SOS/SOS.Hosting/SOSHost.cs
src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt
src/SOS/Strike/CMakeLists.txt
src/SOS/Strike/clrma/managedanalysis.cpp
src/SOS/Strike/clrma/managedanalysis.h
src/SOS/Strike/dbgengservices.cpp
src/SOS/Strike/dbgengservices.h
src/SOS/Strike/disasmX86.cpp
src/SOS/Strike/exts.cpp
src/SOS/Strike/exts.h
src/SOS/Strike/platformspecific.h
src/SOS/Strike/sos.def
src/SOS/Strike/strike.cpp
src/SOS/Strike/xplat/dbgeng.h
src/SOS/inc/debuggerservices.h
src/SOS/inc/lldbservices.h
src/SOS/lldbplugin/CMakeLists.txt
src/SOS/lldbplugin/services.cpp
src/SOS/lldbplugin/services.h
src/dbgshim/debugshim.cpp
src/inc/ntimageex.h [new file with mode: 0644]
src/shared/pal/src/init/pal.cpp

index ed4beeecb2062d9b84bdb0e3e1a865429698b635..91ac02996f9eb94c6195cdfaceb4d5b9d5f2ec7f 100644 (file)
@@ -155,7 +155,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "inc", "inc", "{41BDFD6D-D16
                src\shared\inc\readytoruninstructionset.h = src\shared\inc\readytoruninstructionset.h
                src\shared\inc\regdisp.h = src\shared\inc\regdisp.h
                src\shared\inc\registrywrapper.h = src\shared\inc\registrywrapper.h
-               src\shared\inc\releaseholder.h = src\shared\inc\releaseholder.h
                src\shared\inc\resource.h = src\shared\inc\resource.h
                src\shared\inc\runtimeinfo.h = src\shared\inc\runtimeinfo.h
                src\shared\inc\safemath.h = src\shared\inc\safemath.h
@@ -333,6 +332,26 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "minipal", "minipal", "{D9A9
                src\shared\native\minipal\utils.h = src\shared\native\minipal\utils.h
        EndProjectSection
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "inc", "inc", "{9E51C821-4095-4250-BD8A-2A29396DB1B4}"
+       ProjectSection(SolutionItems) = preProject
+               src\inc\corcompile.h = src\inc\corcompile.h
+               src\inc\ntimageex.h = src\inc\ntimageex.h
+               src\inc\releaseholder.h = src\inc\releaseholder.h
+               src\inc\stacktrace.h = src\inc\stacktrace.h
+       EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rt", "rt", "{D2D76252-D225-4B79-9DDB-A36867A4720E}"
+       ProjectSection(SolutionItems) = preProject
+               src\inc\rt\intsafe.h = src\inc\rt\intsafe.h
+               src\inc\rt\oaidl.h = src\inc\rt\oaidl.h
+               src\inc\rt\psapi.h = src\inc\rt\psapi.h
+               src\inc\rt\tchar.h = src\inc\rt\tchar.h
+               src\inc\rt\tlhelp32.h = src\inc\rt\tlhelp32.h
+               src\inc\rt\winapifamily.h = src\inc\rt\winapifamily.h
+               src\inc\rt\winternl.h = src\inc\rt\winternl.h
+               src\inc\rt\winver.h = src\inc\rt\winver.h
+       EndProjectSection
+EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                Checked|Any CPU = Checked|Any CPU
@@ -2365,6 +2384,8 @@ Global
                {06FB18BC-F4DD-4DB9-A566-551254CD1064} = {795B7A50-1B1F-406E-94E0-F9B35104EF22}
                {641F00F0-2693-451B-A96A-13E4E115BF0F} = {7852EDE4-93DF-4DB1-8A86-C521703811AF}
                {D9A91544-CDF8-4C68-BAD2-47F4968A8652} = {641F00F0-2693-451B-A96A-13E4E115BF0F}
+               {9E51C821-4095-4250-BD8A-2A29396DB1B4} = {19FAB78C-3351-4911-8F0C-8C6056401740}
+               {D2D76252-D225-4B79-9DDB-A36867A4720E} = {9E51C821-4095-4250-BD8A-2A29396DB1B4}
        EndGlobalSection
        GlobalSection(ExtensibilityGlobals) = postSolution
                SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0}
index c1ed9f0a1719fef4c58140c3aa670b41fe0c873c..bfec6d92c3c3d86688c997cc00001e7702c6e598 100644 (file)
@@ -56,7 +56,7 @@
     <MicrosoftDotNetCodeAnalysisVersion>10.0.0-beta.24463.4</MicrosoftDotNetCodeAnalysisVersion>
     <StyleCopAnalyzersVersion>1.2.0-beta.406</StyleCopAnalyzersVersion>
     <MicrosoftDotNetRemoteExecutorVersion>7.0.0-beta.22316.2</MicrosoftDotNetRemoteExecutorVersion>
-    <cdbsosversion>10.0.18362</cdbsosversion>
+    <cdbsosversion>10.0.26100.1</cdbsosversion>
     <NewtonSoftJsonVersion>13.0.1</NewtonSoftJsonVersion>
     <MicrosoftSourceBuildIntermediatesourcebuildreferencepackagesPackageVersion>10.0.0-alpha.1.24467.1</MicrosoftSourceBuildIntermediatesourcebuildreferencepackagesPackageVersion>
     <!-- Roslyn and analyzers -->
index ddee23f624850b32990faefafb76d33ea6df889f..e1de7aff3322f307940ebaaafcf22c23fb9ca08b 100644 (file)
@@ -14,9 +14,9 @@ if(CLR_CMAKE_HOST_WIN32)
   add_compile_options(/Zl) # omit default library name in .OBJ
 
   add_subdirectory(runcommand)
-  if(NOT CLR_CMAKE_TARGET_ARCH_ARM64 AND NOT CLR_CMAKE_TARGET_ARCH_ARM)
+  if(NOT CLR_CMAKE_TARGET_ARCH_ARM)
     add_subdirectory(SOS.UnitTests/Debuggees/DesktopClrHost)
-  endif(NOT CLR_CMAKE_TARGET_ARCH_ARM64 AND NOT CLR_CMAKE_TARGET_ARCH_ARM)
+  endif(NOT CLR_CMAKE_TARGET_ARCH_ARM)
 endif(CLR_CMAKE_HOST_WIN32)
 
 add_compile_definitions(STRESS_LOG_ANALYZER)
index f1f4caf56369553191e5044eef4f9d9d0a8b2853..82cb8872dd2e1ce905a33878119b2b55fdf7df04 100644 (file)
@@ -82,9 +82,9 @@ namespace SOS.Extensions
             return VTable.GetDebuggeeType(Self, out debugClass, out qualifier);
         }
 
-        public HResult GetExecutingProcessorType(out IMAGE_FILE_MACHINE type)
+        public HResult GetProcessorType(out IMAGE_FILE_MACHINE type)
         {
-            return VTable.GetExecutingProcessorType(Self, out type);
+            return VTable.GetProcessorType(Self, out type);
         }
 
         public HResult AddCommand(string command, string help, IEnumerable<string> aliases)
@@ -519,7 +519,7 @@ namespace SOS.Extensions
         {
             public readonly delegate* unmanaged[Stdcall]<IntPtr, out OperatingSystem, int> GetOperatingSystem;
             public readonly delegate* unmanaged[Stdcall]<IntPtr, out DEBUG_CLASS, out DEBUG_CLASS_QUALIFIER, int> GetDebuggeeType;
-            public readonly delegate* unmanaged[Stdcall]<IntPtr, out IMAGE_FILE_MACHINE, int> GetExecutingProcessorType;
+            public readonly delegate* unmanaged[Stdcall]<IntPtr, out IMAGE_FILE_MACHINE, int> GetProcessorType;
             public readonly delegate* unmanaged[Stdcall]<IntPtr, byte*, byte*, IntPtr*, int, int> AddCommand;
             public readonly delegate* unmanaged[Stdcall]<IntPtr, DEBUG_OUTPUT, byte*, void> OutputString;
             public readonly delegate* unmanaged[Stdcall]<IntPtr, ulong, byte*, uint, out int, int> ReadVirtual;
index aa8b378258c93bce75cc519c76eec76ee793df02..13fc5cd324aa99db1022f326aac900b5a1c60bf6 100644 (file)
@@ -44,9 +44,10 @@ namespace SOS.Extensions
                 IsDump = true;
             }
 
-            hr = debuggerServices.GetExecutingProcessorType(out IMAGE_FILE_MACHINE type);
+            hr = debuggerServices.GetProcessorType(out IMAGE_FILE_MACHINE type);
             if (hr == HResult.S_OK)
             {
+                Debug.Assert(type is not IMAGE_FILE_MACHINE.ARM64X and not IMAGE_FILE_MACHINE.ARM64EC);
                 Architecture = type switch
                 {
                     IMAGE_FILE_MACHINE.I386 => Architecture.X86,
@@ -62,7 +63,7 @@ namespace SOS.Extensions
             }
             else
             {
-                throw new PlatformNotSupportedException($"GetExecutingProcessorType() FAILED {hr:X8}");
+                throw new PlatformNotSupportedException($"GetProcessorType() FAILED {hr:X8}");
             }
 
             hr = debuggerServices.GetCurrentProcessId(out uint processId);
index 50e09666885c21cfb33a20e56432ab7c8de5be7b..097e8c1ac7577296efaf566364a14ece7a06d479 100644 (file)
@@ -56,7 +56,7 @@ namespace SOS.Hosting.DbgEng
             builder.AddMethod(new GetReturnOffsetDelegate((self, offset) => DebugClient.NotImplemented));
             builder.AddMethod(new OutputStackTraceDelegate((self, outputControl, frames, frameSize, flags) => DebugClient.NotImplemented));
             builder.AddMethod(new GetDebuggeeTypeDelegate(soshost.GetDebuggeeType));
-            builder.AddMethod(new GetActualProcessorTypeDelegate((self, type) => DebugClient.NotImplemented));
+            builder.AddMethod(new GetActualProcessorTypeDelegate(soshost.GetExecutingProcessorType));
             builder.AddMethod(new GetExecutingProcessorTypeDelegate(soshost.GetExecutingProcessorType));
             builder.AddMethod(new GetNumberPossibleExecutingProcessorTypesDelegate((self, number) => DebugClient.NotImplemented));
             builder.AddMethod(new GetPossibleExecutingProcessorTypesDelegate((self, start, count, types) => DebugClient.NotImplemented));
index da1a4881e2065f33a30ae2b7bb0191ab9e7f592e..a8524a388f94130d4098c8c581b6ef1710312071 100644 (file)
@@ -35,6 +35,8 @@ namespace SOS.Hosting.DbgEng.Interop
         AMD64 = 0x8664,     // AMD64 (K8)
         M32R = 0x9041,      // M32R little-endian
         ARM64 = 0xAA64,     // ARM64 Little-endian
+        ARM64EC = 0xA641,
+        ARM64X = 0xA64E,
         CEE = 0xC0EE,
         LOONGARCH64 = 0x6264,
         RISCV64 = 0x5064
index e78234871ac57c8427a2d689cb9fedc2ef2dc72f..5a8cfb48b4df2ba5afae2c453c56f9e9a1aa1f27 100644 (file)
@@ -165,30 +165,16 @@ namespace SOS.Hosting
             IntPtr self,
             IMAGE_FILE_MACHINE* type)
         {
-            switch (Target.Architecture)
-            {
-                case Architecture.X64:
-                    *type = IMAGE_FILE_MACHINE.AMD64;
-                    break;
-                case Architecture.X86:
-                    *type = IMAGE_FILE_MACHINE.I386;
-                    break;
-                case Architecture.Arm:
-                    *type = IMAGE_FILE_MACHINE.ARMNT;
-                    break;
-                case Architecture.Arm64:
-                    *type = IMAGE_FILE_MACHINE.ARM64;
-                    break;
-                case (Architecture)6 /* Architecture.LoongArch64 */:
-                    *type = IMAGE_FILE_MACHINE.LOONGARCH64;
-                    break;
-                case (Architecture)9 /* Architecture.RiscV64 */:
-                    *type = IMAGE_FILE_MACHINE.RISCV64;
-                    break;
-                default:
-                    *type = IMAGE_FILE_MACHINE.UNKNOWN;
-                    break;
-            }
+            *type = Target.Architecture switch
+            {
+                Architecture.X64 => IMAGE_FILE_MACHINE.AMD64,
+                Architecture.X86 => IMAGE_FILE_MACHINE.I386,
+                Architecture.Arm => IMAGE_FILE_MACHINE.ARMNT,
+                Architecture.Arm64 => IMAGE_FILE_MACHINE.ARM64,
+                (Architecture)6 /* Architecture.LoongArch64 */=> IMAGE_FILE_MACHINE.LOONGARCH64,
+                (Architecture)9 /* Architecture.RiscV64 */=> IMAGE_FILE_MACHINE.RISCV64,
+                _ => IMAGE_FILE_MACHINE.UNKNOWN,
+            };
             return HResult.S_OK;
         }
 
index bf79961cf4ee530037bbe49ceb2b89455ab4db23..2d701b681bdd66dec4b090acca98914124756399 100644 (file)
             <Option>
               <SetHostRuntime>$(DotNetRoot)/shared/Microsoft.NETCore.App/$(RuntimeFrameworkVersion)</SetHostRuntime>
             </Option>
-            <Option>
+            <Option Condition="'$(TargetArchitecture)' != 'arm64'">
               <SetHostRuntime>-netfx</SetHostRuntime>
             </Option>
           </Options>
index 63124f3dc374d4452ba332dfce2a2ca60f60470c..f0c7ab5410fcc14b7d7ef89f4e3a6348e2de76b1 100644 (file)
@@ -30,9 +30,6 @@ if(CLR_CMAKE_HOST_ARCH_AMD64)
   message(STATUS "CLR_CMAKE_HOST_ARCH_AMD64")
   add_definitions(-DSOS_TARGET_AMD64=1)
   add_definitions(-D_TARGET_WIN64_=1)
-  add_definitions(-DDBG_TARGET_64BIT=1)
-  add_definitions(-DDBG_TARGET_AMD64=1)
-  add_definitions(-DDBG_TARGET_WIN64=1)
   if (CLR_CMAKE_HOST_WIN32)
     add_definitions(-DSOS_TARGET_ARM64=1)
   endif(CLR_CMAKE_HOST_WIN32)
@@ -43,43 +40,26 @@ elseif(CLR_CMAKE_HOST_ARCH_I386)
   add_definitions(-DSOS_TARGET_X86=1)
   add_definitions(-D_TARGET_X86_=1)
   add_definitions(-DTARGET_X86)
-  add_definitions(-DDBG_TARGET_X86=1)
-  add_definitions(-DDBG_TARGET_32BIT=1)
   if (CLR_CMAKE_HOST_WIN32)
     add_definitions(-DSOS_TARGET_ARM=1)
   endif(CLR_CMAKE_HOST_WIN32)
 elseif(CLR_CMAKE_HOST_ARCH_ARM)
   message(STATUS "CLR_CMAKE_HOST_ARCH_ARM")
   add_definitions(-DSOS_TARGET_ARM=1)
-  add_definitions(-D_TARGET_WIN32_=1)
   add_definitions(-D_TARGET_ARM_=1)
-  add_definitions(-DDBG_TARGET_ARM=1)
-  add_definitions(-DDBG_TARGET_32BIT=1)
 elseif(CLR_CMAKE_HOST_ARCH_ARM64)
   message(STATUS "CLR_CMAKE_HOST_ARCH_ARM64")
   add_definitions(-DSOS_TARGET_ARM64=1)
   add_definitions(-D_TARGET_WIN64_=1)
-  add_definitions(-DDBG_TARGET_64BIT=1)
-  add_definitions(-DDBG_TARGET_ARM64=1)
-  add_definitions(-DDBG_TARGET_WIN64=1)
 elseif(CLR_CMAKE_HOST_ARCH_MIPS64)
   add_definitions(-DSOS_TARGET_MIPS64=1)
   add_definitions(-D_TARGET_WIN64_=1)
-  add_definitions(-DDBG_TARGET_64BIT=1)
-  add_definitions(-DDBG_TARGET_MIPS64=1)
-  add_definitions(-DDBG_TARGET_WIN64=1)
 elseif(CLR_CMAKE_HOST_ARCH_RISCV64)
   add_definitions(-DSOS_TARGET_RISCV64=1)
   add_definitions(-D_TARGET_WIN64_=1)
-  add_definitions(-DDBG_TARGET_64BIT=1)
-  add_definitions(-DDBG_TARGET_RISCV64=1)
-  add_definitions(-DDBG_TARGET_WIN64=1)
 elseif(CLR_CMAKE_HOST_ARCH_LOONGARCH64)
   add_definitions(-DSOS_TARGET_LOONGARCH64=1)
   add_definitions(-D_TARGET_WIN64_=1)
-  add_definitions(-DDBG_TARGET_64BIT=1)
-  add_definitions(-DDBG_TARGET_LOONGARCH64=1)
-  add_definitions(-DDBG_TARGET_WIN64=1)
 endif()
 
 add_definitions(-DSTRIKE)  
index 04df2f27607c6b29d19523fb63041185f684ddff..6adb3fa73ac8b2749cac5e2cf44ff5e5a0cf4371 100644 (file)
@@ -70,8 +70,10 @@ ClrmaManagedAnalysis::QueryDebugClient(IUnknown* pUnknown)
     }
     switch (m_processorType)
     {
-        case IMAGE_FILE_MACHINE_ARM64:
         case IMAGE_FILE_MACHINE_AMD64:
+        case IMAGE_FILE_MACHINE_ARM64:
+        case IMAGE_FILE_MACHINE_ARM64X:
+        case IMAGE_FILE_MACHINE_ARM64EC:
         case IMAGE_FILE_MACHINE_LOONGARCH64:
         case IMAGE_FILE_MACHINE_RISCV64:
             m_pointerSize = 8;
index a78852e9ef91aa226f35a42f2560dd9501ab41e6..02a80a3304de94cd5a2ba89b6a153b734b1d1885 100644 (file)
@@ -9,6 +9,7 @@
 #include <clrma.h> // IDL
 #include <clrmaservice.h>
 #include <dbgtargetcontext.h>
+#include <ntimageex.h>
 #include <corhdr.h>
 #include <cordebug.h>
 #include <xclrdata.h>
 #include <runtime.h>
 #include <vector>
 
-#ifndef IMAGE_FILE_MACHINE_RISCV64
-#define IMAGE_FILE_MACHINE_RISCV64          0x5064  // RISCV64
-#endif
-
-#ifndef IMAGE_FILE_MACHINE_LOONGARCH64
-#define IMAGE_FILE_MACHINE_LOONGARCH64      0x6264  // LOONGARCH64
-#endif
-
 enum ClrmaGlobalFlags
 {
     LoggingEnabled = 0x01,                  // CLRMA logging enabled
index 6dad478366002fefd810adca5ac92efd58148b24..8d6bbaa64ed6ee6bf80bc6d3f91aa6146395a0a8 100644 (file)
@@ -189,10 +189,24 @@ DbgEngServices::GetDebuggeeType(
 }
 
 HRESULT
-DbgEngServices::GetExecutingProcessorType(
+DbgEngServices::GetProcessorType(
     PULONG type)
 {
-    return m_control->GetExecutingProcessorType(type);
+    ULONG executingType;
+    HRESULT hr = m_control->GetExecutingProcessorType(&executingType);
+    if (FAILED(hr))
+    {
+        return hr;
+    }
+    _ASSERTE(executingType != IMAGE_FILE_MACHINE_ARM64X);
+    *type = executingType;
+#if defined(SOS_TARGET_AMD64) || defined(SOS_TARGET_ARM64)
+    if (executingType == IMAGE_FILE_MACHINE_ARM64EC)
+    {
+        *type = IMAGE_FILE_MACHINE_AMD64;
+    }
+#endif // defined(SOS_TARGET_AMD64) || defined(SOS_TARGET_ARM64)
+    return S_OK;
 }
 
 HRESULT
index 73eff8044dcf71f447c2efa05b28ed644961496e..c7cbb4092e23ff11b4adeab165deef3df43d106b 100644 (file)
@@ -72,7 +72,7 @@ public:
         PULONG debugClass,
         PULONG qualifier);
 
-    HRESULT STDMETHODCALLTYPE GetExecutingProcessorType(
+    HRESULT STDMETHODCALLTYPE GetProcessorType(
         PULONG type);
 
     HRESULT STDMETHODCALLTYPE AddCommand(
index 11750ab77c238740e8ea0007dfcd0b826058d6e1..21db6e526a7e8697540e9c14f8b47b8c7f257968 100644 (file)
@@ -620,7 +620,14 @@ void
             //
 
 #ifdef _WIN64
-            ExtOut("%08x`%08x ", (ULONG)(InstrAddr >> 32), (ULONG)InstrAddr);
+            if (GetHost()->GetHostType() == IHost::HostType::DbgEng)
+            {
+                ExtOut("%08x`%08x ", (ULONG)(InstrAddr >> 32), (ULONG)InstrAddr);
+            }
+            else
+            {
+                ExtOut("%016llx ", InstrAddr);
+            }
 #else
             ExtOut("%08x ", (ULONG)InstrAddr);
 #endif
index 81f304fd477635cd81144aa80ca45c1a917c83ea..1bb392ba47233a504e538815ef9da18db4caac3c 100644 (file)
@@ -152,6 +152,15 @@ GetTargetMachine(ULONG processorType)
         targetMachine = ARM64Machine::GetInstance();
     }
 #endif // SOS_TARGET_ARM64
+    _ASSERTE(processorType != IMAGE_FILE_MACHINE_ARM64X);
+#if defined(SOS_TARGET_AMD64) || defined(SOS_TARGET_ARM64)
+    if (processorType == IMAGE_FILE_MACHINE_ARM64EC)
+    {
+#ifdef SOS_TARGET_AMD64
+        targetMachine = AMD64Machine::GetInstance();
+#endif // SOS_TARGET_AMD64
+    }
+#endif // defined(SOS_TARGET_AMD64) || defined(SOS_TARGET_ARM64)
 #ifdef SOS_TARGET_RISCV64
     if (processorType == IMAGE_FILE_MACHINE_RISCV64)
     {
@@ -167,6 +176,46 @@ GetTargetMachine(ULONG processorType)
     return targetMachine;
 }
 
+const char*
+GetProcessorName(ULONG type)
+{
+    const char* architecture = "unknown";
+    switch (type)
+    {
+        case IMAGE_FILE_MACHINE_AMD64:
+            architecture = "x64";
+            break;
+        case IMAGE_FILE_MACHINE_I386:
+            architecture = "x86";
+            break;
+        case IMAGE_FILE_MACHINE_ARM:
+            architecture = "arm";
+            break;
+        case IMAGE_FILE_MACHINE_THUMB:
+            architecture = "thumb";
+            break;
+        case IMAGE_FILE_MACHINE_ARMNT:
+            architecture = "armnt";
+            break;
+        case IMAGE_FILE_MACHINE_ARM64:
+            architecture = "arm64";
+            break;
+        case IMAGE_FILE_MACHINE_ARM64EC:
+            architecture = "arm64ec";
+            break;
+        case IMAGE_FILE_MACHINE_ARM64X:
+            architecture = "arm64x";
+            break;
+        case IMAGE_FILE_MACHINE_RISCV64:
+            architecture = "riscv64";
+            break;
+        case IMAGE_FILE_MACHINE_LOONGARCH64:
+            architecture = "loongarch64";
+            break;
+    }
+    return architecture;
+}
+
 HRESULT
 ArchQuery(void)
 {
@@ -176,32 +225,19 @@ ArchQuery(void)
     g_targetMachine = GetTargetMachine(processorType);
     if (g_targetMachine == NULL)
     {
-        const char* architecture = "";
-        switch (processorType)
+        const char* architecture = GetProcessorName(processorType);
+        const char* message = "";
+#if defined(SOS_TARGET_AMD64) || defined(SOS_TARGET_ARM64)
+        if (processorType == IMAGE_FILE_MACHINE_ARM64EC)
+        {
+            message = "Arm64ec targets require a x64 compatible SOS and debugger.";
+        }
+        else
+#endif
         {
-            case IMAGE_FILE_MACHINE_AMD64:
-                architecture = "x64";
-                break;
-            case IMAGE_FILE_MACHINE_I386:
-                architecture = "x86";
-                break;
-            case IMAGE_FILE_MACHINE_ARM:
-            case IMAGE_FILE_MACHINE_THUMB:
-            case IMAGE_FILE_MACHINE_ARMNT:
-                architecture = "arm32";
-                break;
-            case IMAGE_FILE_MACHINE_ARM64:
-                architecture = "arm64";
-                break;
-            case IMAGE_FILE_MACHINE_RISCV64:
-                architecture = "riscv64";
-                break;
-            case IMAGE_FILE_MACHINE_LOONGARCH64:
-                architecture = "loongarch64";
-                break;
+            message = "A 32 bit target may require a 32 bit debugger or vice versa. In general, try to use the same bitness for the debugger and target process.";
         }
-        ExtErr("SOS does not support the current target architecture '%s' (0x%04x). A 32 bit target may require a 32 bit debugger or vice versa. In general, try to use the same bitness for the debugger and target process.\n",
-            architecture, processorType);
+        ExtErr("SOS does not support the current target architecture '%s' (0x%04x). %s\n", architecture, processorType, message);
         return E_FAIL;
     }
     return S_OK;
index 31a15fd92cf3c05b91e28ff885a8de7a4eb2f53b..5ee3a0c70d9ffe4d54848f936a95f3d90d1a712e 100644 (file)
 // printing CDA values.
 #define CDA_TO_UL64(cda) ((ULONG64)(TO_TADDR(cda)))
 
-#ifndef IMAGE_FILE_MACHINE_RISCV64
-#define IMAGE_FILE_MACHINE_RISCV64        0x5064  // RISCV64
-#endif // !IMAGE_FILE_MACHINE_RISCV64
-
-#ifndef IMAGE_FILE_MACHINE_LOONGARCH64
-#define IMAGE_FILE_MACHINE_LOONGARCH64        0x6264  // LOONGARCH64
-#endif // !IMAGE_FILE_MACHINE_LOONGARCH64
-
 typedef struct _TADDR_RANGE
 {
     TADDR start;
@@ -159,6 +151,9 @@ ExtQuery(PDEBUG_CLIENT client);
 HRESULT
 ExtInit(PDEBUG_CLIENT client);
 
+const char*
+GetProcessorName(ULONG type);
+
 HRESULT 
 ArchQuery(void);
 
index 6a66df890da0f260a5407ca4f9d87258354715f8..88ac1a73686923560a0acae937c013cb1c11f7b9 100644 (file)
@@ -14,6 +14,7 @@
 
 // The main debugger code already has target platform definitions for CONTEXT.
 #include <dbgtargetcontext.h>
+#include <ntimageex.h>
 
 #ifndef FEATURE_PAL
 
@@ -42,14 +43,6 @@ struct DT_UNICODE_STRING
 #define DT_GDI_HANDLE_BUFFER_SIZE32  34
 #define DT_GDI_HANDLE_BUFFER_SIZE64  60
 
-#ifndef IMAGE_FILE_MACHINE_ARMNT
-#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian 
-#endif
-
-#ifndef IMAGE_FILE_MACHINE_ARM64
-#define IMAGE_FILE_MACHINE_ARM64             0xAA64  // ARM64 Little-Endian
-#endif
-
 #ifdef _TARGET_WIN64_
 typedef ULONG DT_GDI_HANDLE_BUFFER[DT_GDI_HANDLE_BUFFER_SIZE64];
 #else
index 50b7ae329955d1b4a5b30d9ebbea88429163f1a5..73f7ed5dac88fe471c512960dba3edec203908cc 100644 (file)
@@ -141,6 +141,7 @@ EXPORTS
     pe=PrintException    
     printexception=PrintException
     Printexception=PrintException
+    processor
     SaveModule
     savemodule=SaveModule
     SetHostRuntime
index 59861b441127fafd6540fc6493129d5045754d4b..bf8ac0e4bde1d3cdc0565342bd4c1c9cb86935af 100644 (file)
@@ -13618,6 +13618,27 @@ exit:
     return S_OK;
 }
 
+DECLARE_API(processor)
+{
+    INIT_API_EXT();
+    ULONG executingType;
+    if (SUCCEEDED(g_ExtControl->GetExecutingProcessorType(&executingType)))
+    {
+        ExtOut("Executing processor type: %04x '%s'\n", executingType, GetProcessorName(executingType));
+    }
+    ULONG actualType;
+    if (SUCCEEDED(g_ExtControl->GetActualProcessorType(&actualType)))
+    {
+        ExtOut("Actual processor type:    %04x '%s'\n", actualType, GetProcessorName(actualType));
+    }
+    ULONG effectiveType;
+    if (SUCCEEDED(g_ExtControl->GetEffectiveProcessorType(&effectiveType)))
+    {
+        ExtOut("Effective processor type: %04x '%s'\n", effectiveType, GetProcessorName(effectiveType));
+    }
+    return S_OK;
+}
+
 #endif // FEATURE_PAL
 
 //
index 64a64fc9164f2966de6ec1ab304c19e4986054af..146ecf1bdb913f8cabf4c0a6cd42cbdddbd37a16 100644 (file)
@@ -111,7 +111,14 @@ public:
     GetExecutingProcessorType(
         PULONG type)
     {
-        return m_lldbservices->GetExecutingProcessorType(type);
+        return m_lldbservices->GetProcessorType(type);
+    }
+
+    HRESULT 
+    GetActualProcessorType(
+        PULONG type)
+    {
+        return m_lldbservices->GetProcessorType(type);
     }
 
     HRESULT 
index e333177bc3e0e2606b066642dd7d184f9740baea..204a164525b574de7ba2f6ac315006642898d11c 100644 (file)
@@ -37,7 +37,7 @@ public:
         PULONG debugClass,
         PULONG qualifier) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetExecutingProcessorType(
+    virtual HRESULT STDMETHODCALLTYPE GetProcessorType(
         PULONG type) = 0;
 
     virtual HRESULT STDMETHODCALLTYPE AddCommand(
index b31f2512236356d7d7164e6cb86241d739a98025..bef3f2ace68c27b5c26844387e9323a1b090aa51 100644 (file)
@@ -321,7 +321,7 @@ public:
 
     // Returns the type of processor used in the
     // current processor context.
-    virtual HRESULT STDMETHODCALLTYPE GetExecutingProcessorType(
+    virtual HRESULT STDMETHODCALLTYPE GetProcessorType(
         PULONG type) = 0;
 
     // Executes the given command string.
index a1656bfb71c323e05e0190294f3b71ded363f325..76dc0ecc7bcbe366cd1ab2b33b489d10f13f6269 100644 (file)
@@ -20,50 +20,6 @@ if(SKIP_LLDBPLUGIN)
     set(REQUIRE_LLDBPLUGIN false)
 endif()
 
-if(CLR_CMAKE_HOST_ARCH_AMD64)
-    add_definitions(-D_TARGET_AMD64_=1)
-    add_definitions(-DDBG_TARGET_64BIT=1)
-    add_definitions(-DDBG_TARGET_AMD64=1)
-    add_definitions(-DDBG_TARGET_WIN64=1)
-    add_definitions(-DBIT64)
-elseif(CLR_CMAKE_HOST_ARCH_I386)
-    add_definitions(-D_TARGET_X86_=1)
-    add_definitions(-DDBG_TARGET_32BIT=1)
-    add_definitions(-DDBG_TARGET_X86=1)
-elseif(CLR_CMAKE_HOST_ARCH_ARM)
-    add_definitions(-D_TARGET_ARM_=1)
-    add_definitions(-DDBG_TARGET_32BIT=1)
-    add_definitions(-DDBG_TARGET_ARM=1)
-elseif(CLR_CMAKE_HOST_ARCH_ARM64)
-    add_definitions(-D_TARGET_ARM64_=1)
-    add_definitions(-DDBG_TARGET_64BIT=1)
-    add_definitions(-DDBG_TARGET_ARM64=1)
-    add_definitions(-DDBG_TARGET_WIN64=1)
-    add_definitions(-DBIT64)
-    SET(REQUIRE_LLDBPLUGIN false)
-elseif(CLR_CMAKE_HOST_ARCH_MIPS64)
-    add_definitions(-D_TARGET_MIPS64_=1)
-    add_definitions(-DDBG_TARGET_64BIT=1)
-    add_definitions(-DDBG_TARGET_MIPS64=1)
-    add_definitions(-DDBG_TARGET_WIN64=1)
-    add_definitions(-DBIT64)
-    SET(REQUIRE_LLDBPLUGIN false)
-elseif(CLR_CMAKE_HOST_ARCH_RISCV64)
-    add_definitions(-D_TARGET_RISCV64_=1)
-    add_definitions(-DDBG_TARGET_64BIT=1)
-    add_definitions(-DDBG_TARGET_RISCV64=1)
-    add_definitions(-DDBG_TARGET_WIN64=1)
-    add_definitions(-DBIT64)
-    SET(REQUIRE_LLDBPLUGIN false)
-elseif(CLR_CMAKE_HOST_ARCH_LOONGARCH64)
-    add_definitions(-D_TARGET_LOONGARCH64_=1)
-    add_definitions(-DDBG_TARGET_64BIT=1)
-    add_definitions(-DDBG_TARGET_LOONGARCH64=1)
-    add_definitions(-DDBG_TARGET_WIN64=1)
-    add_definitions(-DBIT64)
-    SET(REQUIRE_LLDBPLUGIN false)
-endif()
-
 if(NOT $ENV{LLVM_HOME} STREQUAL "")
     set(LLDB_INCLUDE_DIR "$ENV{LLVM_HOME}/include")
     set(LLDB_LIB_DIR "$ENV{LLVM_HOME}/lib")
index 182a74be464e59c22865acf51f9ec61449e460f8..9f8285b40eed6f54626bc20d3b27a92248081bce 100644 (file)
@@ -223,17 +223,17 @@ LLDBServices::VirtualUnwind(
     DT_CONTEXT *dtcontext = (DT_CONTEXT*)context;
     lldb::SBFrame frameFound;
 
-#ifdef DBG_TARGET_AMD64
+#ifdef TARGET_AMD64
     DWORD64 spToFind = dtcontext->Rsp;
-#elif DBG_TARGET_X86
+#elif TARGET_X86
     DWORD spToFind = dtcontext->Esp;
-#elif DBG_TARGET_ARM
+#elif TARGET_ARM
     DWORD spToFind = dtcontext->Sp;
-#elif DBG_TARGET_ARM64
+#elif TARGET_ARM64
     DWORD64 spToFind = dtcontext->Sp;
-#elif DBG_TARGET_RISCV64
+#elif TARGET_RISCV64
     DWORD64 spToFind = dtcontext->Sp;
-#elif DBG_TARGET_LOONGARCH64
+#elif TARGET_LOONGARCH64
     DWORD64 spToFind = dtcontext->Sp;
 #else
 #error "spToFind undefined for this platform"
@@ -447,20 +447,20 @@ LLDBServices::GetPageSize(
 }
 
 HRESULT 
-LLDBServices::GetExecutingProcessorType(
+LLDBServices::GetProcessorType(
     PULONG type)
 {
-#ifdef DBG_TARGET_AMD64
+#ifdef TARGET_AMD64
     *type = IMAGE_FILE_MACHINE_AMD64;
-#elif DBG_TARGET_ARM
+#elif TARGET_ARM
     *type = IMAGE_FILE_MACHINE_ARMNT;
-#elif DBG_TARGET_ARM64
+#elif TARGET_ARM64
     *type = IMAGE_FILE_MACHINE_ARM64;
-#elif DBG_TARGET_X86
+#elif TARGET_X86
     *type = IMAGE_FILE_MACHINE_I386;
-#elif DBG_TARGET_RISCV64
+#elif TARGET_RISCV64
     *type = IMAGE_FILE_MACHINE_RISCV64;
-#elif DBG_TARGET_LOONGARCH64
+#elif TARGET_LOONGARCH64
     *type = IMAGE_FILE_MACHINE_LOONGARCH64;
 #else
 #error "Unsupported target"
@@ -1629,7 +1629,7 @@ LLDBServices::GetContextFromFrame(
     /* const */ lldb::SBFrame& frame,
     DT_CONTEXT *dtcontext)
 {
-#ifdef DBG_TARGET_AMD64
+#ifdef TARGET_AMD64
     dtcontext->Rip = frame.GetPC();
     dtcontext->Rsp = frame.GetSP();
     dtcontext->Rbp = frame.GetFP();
@@ -1656,7 +1656,7 @@ LLDBServices::GetContextFromFrame(
     dtcontext->SegEs = GetRegister(frame, "es");
     dtcontext->SegFs = GetRegister(frame, "fs");
     dtcontext->SegGs = GetRegister(frame, "gs");
-#elif DBG_TARGET_ARM
+#elif TARGET_ARM
     dtcontext->Pc = frame.GetPC();
     dtcontext->Sp = frame.GetSP();
     dtcontext->Lr = GetRegister(frame, "lr");
@@ -1675,7 +1675,7 @@ LLDBServices::GetContextFromFrame(
     dtcontext->R10 = GetRegister(frame, "r10");
     dtcontext->R11 = GetRegister(frame, "r11");
     dtcontext->R12 = GetRegister(frame, "r12");
-#elif DBG_TARGET_ARM64
+#elif TARGET_ARM64
     dtcontext->Pc = frame.GetPC();
     dtcontext->Sp = frame.GetSP();
     dtcontext->Lr = GetRegister(frame, "x30");
@@ -1711,7 +1711,7 @@ LLDBServices::GetContextFromFrame(
     dtcontext->X26 = GetRegister(frame, "x26");
     dtcontext->X27 = GetRegister(frame, "x27");
     dtcontext->X28 = GetRegister(frame, "x28");
-#elif DBG_TARGET_X86
+#elif TARGET_X86
     dtcontext->Eip = frame.GetPC();
     dtcontext->Esp = frame.GetSP();
     dtcontext->Ebp = frame.GetFP();
@@ -1730,7 +1730,7 @@ LLDBServices::GetContextFromFrame(
     dtcontext->SegEs = GetRegister(frame, "es");
     dtcontext->SegFs = GetRegister(frame, "fs");
     dtcontext->SegGs = GetRegister(frame, "gs");
-#elif DBG_TARGET_LOONGARCH64
+#elif TARGET_LOONGARCH64
     dtcontext->Pc = frame.GetPC();
     dtcontext->Sp = frame.GetSP();
     dtcontext->Ra = GetRegister(frame, "ra");
index a69bb236a278531c8f211699dc7ae2a5c56364ea..734f56bf2f520670799e6622fc48df4f7d4ffb87 100644 (file)
@@ -136,7 +136,7 @@ public:
     HRESULT STDMETHODCALLTYPE GetPageSize(
         PULONG size);
 
-    HRESULT STDMETHODCALLTYPE GetExecutingProcessorType(
+    HRESULT STDMETHODCALLTYPE GetProcessorType(
         PULONG type);
 
     HRESULT STDMETHODCALLTYPE Execute(
index 06cbe5f8af3c1636ab4fe687975536229448928a..6525aa97e46f1d978ee77b3e632336a0d1aa683e 100644 (file)
 #include "dbgutil.h"
 #include <crtdbg.h>
 #include <clrinternal.h> //has the CLR_ID_V4_DESKTOP guid in it
+#include <ntimageex.h>
 #include "palclr.h"
 
-#ifndef IMAGE_FILE_MACHINE_ARMNT
-#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian
-#endif
-
-#ifndef IMAGE_FILE_MACHINE_ARM64
-#define IMAGE_FILE_MACHINE_ARM64             0xAA64  // ARM64 Little-Endian
-#endif
-
 //*****************************************************************************
 // CLRDebuggingImpl implementation (ICLRDebugging)
 //*****************************************************************************
@@ -766,9 +759,9 @@ HRESULT CLRDebuggingImpl::FormatLongDacModuleName(_Inout_updates_z_(cchBuffer) W
 #endif
 
     const WCHAR* pDacBaseName = NULL;
-    if(m_skuId == CLR_ID_V4_DESKTOP)
+    if (m_skuId == CLR_ID_V4_DESKTOP)
         pDacBaseName = CLR_DAC_MODULE_NAME_W;
-    else if(m_skuId == CLR_ID_CORECLR || m_skuId == CLR_ID_PHONE_CLR || m_skuId == CLR_ID_ONECORE_CLR)
+    else if (m_skuId == CLR_ID_CORECLR || m_skuId == CLR_ID_PHONE_CLR || m_skuId == CLR_ID_ONECORE_CLR)
         pDacBaseName = CORECLR_DAC_MODULE_NAME_W;
     else
     {
@@ -776,23 +769,33 @@ HRESULT CLRDebuggingImpl::FormatLongDacModuleName(_Inout_updates_z_(cchBuffer) W
         return E_UNEXPECTED;
     }
 
+    _ASSERTE(targetImageFileMachine != IMAGE_FILE_MACHINE_ARM64X && targetImageFileMachine != IMAGE_FILE_MACHINE_ARM64EC);
+
     const WCHAR* pTargetArch = NULL;
-    if(targetImageFileMachine == IMAGE_FILE_MACHINE_I386)
+    if (targetImageFileMachine == IMAGE_FILE_MACHINE_I386)
     {
         pTargetArch = W("x86");
     }
-    else if(targetImageFileMachine == IMAGE_FILE_MACHINE_AMD64)
+    else if (targetImageFileMachine == IMAGE_FILE_MACHINE_AMD64)
     {
         pTargetArch = W("amd64");
     }
-    else if(targetImageFileMachine == IMAGE_FILE_MACHINE_ARMNT)
+    else if (targetImageFileMachine == IMAGE_FILE_MACHINE_ARMNT)
     {
         pTargetArch = W("arm");
     }
-    else if(targetImageFileMachine == IMAGE_FILE_MACHINE_ARM64)
+    else if (targetImageFileMachine == IMAGE_FILE_MACHINE_ARM64)
     {
         pTargetArch = W("arm64");
     }
+    else if (targetImageFileMachine == IMAGE_FILE_MACHINE_RISCV64)
+    {
+        pTargetArch = W("riscv64");
+    }
+    else if (targetImageFileMachine == IMAGE_FILE_MACHINE_LOONGARCH64)
+    {
+        pTargetArch = W("loongarch64");
+    }
     else
     {
         _ASSERTE(!"Unknown target image file machine type");
@@ -800,9 +803,9 @@ HRESULT CLRDebuggingImpl::FormatLongDacModuleName(_Inout_updates_z_(cchBuffer) W
     }
 
     const WCHAR* pBuildFlavor = W("");
-    if(pVersion->dwFileFlags & VS_FF_DEBUG)
+    if (pVersion->dwFileFlags & VS_FF_DEBUG)
     {
-        if(pVersion->dwFileFlags & VS_FF_SPECIALBUILD)
+        if (pVersion->dwFileFlags & VS_FF_SPECIALBUILD)
             pBuildFlavor = W(".dbg");
         else
             pBuildFlavor = W(".chk");
@@ -823,7 +826,7 @@ HRESULT CLRDebuggingImpl::FormatLongDacModuleName(_Inout_updates_z_(cchBuffer) W
 
     // validate the output buffer is larger than our estimate above
     _ASSERTE(cchBuffer >= minCchBuffer);
-    if(!(cchBuffer >= minCchBuffer)) return E_INVALIDARG;
+    if (!(cchBuffer >= minCchBuffer)) return E_INVALIDARG;
 
     swprintf_s(pBuffer, cchBuffer, W("%s_%s_%s_%u.%u.%u.%02u%s.dll"),
         pDacBaseName,
diff --git a/src/inc/ntimageex.h b/src/inc/ntimageex.h
new file mode 100644 (file)
index 0000000..b249b74
--- /dev/null
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#pragma once
+
+#ifndef IMAGE_FILE_MACHINE_ARMNT
+#define IMAGE_FILE_MACHINE_ARMNT            0x01c4  // ARM Thumb-2 Little-Endian 
+#endif
+
+#ifndef IMAGE_FILE_MACHINE_ARM64
+#define IMAGE_FILE_MACHINE_ARM64            0xAA64  // ARM64 Little-Endian
+#endif
+
+#ifndef IMAGE_FILE_MACHINE_ARM64EC
+#define IMAGE_FILE_MACHINE_ARM64EC          0xA641
+#endif
+
+#ifndef IMAGE_FILE_MACHINE_ARM64X
+#define IMAGE_FILE_MACHINE_ARM64X           0xA64E
+#endif
+
+#ifndef IMAGE_FILE_MACHINE_RISCV64
+#define IMAGE_FILE_MACHINE_RISCV64          0x5064  // RISCV64
+#endif
+
+#ifndef IMAGE_FILE_MACHINE_LOONGARCH64
+#define IMAGE_FILE_MACHINE_LOONGARCH64      0x6264  // LOONGARCH64
+#endif
+
index 871c220db024cd373347701ef83bbf49e72117cc..f6ea18445d0afb853c359e5f02a0bd059abca394 100644 (file)
@@ -87,6 +87,11 @@ int CacheLineSize;
 
 using namespace CorUnix;
 
+#if defined(HOST_ARM64)
+// Flag to check if atomics feature is available on
+// the machine
+bool g_arm64_atomics_present = false;
+#endif
 
 Volatile<INT> init_count = 0;
 Volatile<BOOL> shutdown_intent = 0;