diff --git a/.github/workflows/test-wasm-arm64.yml b/.github/workflows/test-wasm-arm64.yml
new file mode 100644
index 0000000000000..009cec91e0803
--- /dev/null
+++ b/.github/workflows/test-wasm-arm64.yml
@@ -0,0 +1,33 @@
+name: Testing dotnet with emsdk arm64
+
+on:
+ pull_request:
+ branches: [ "main" ]
+ workflow_dispatch:
+
+jobs:
+ test-dotnet-emsdk-arm64:
+ runs-on: [self-hosted, Windows, ARM64, WASM]
+
+ steps:
+ - name: Git checkout
+ uses: actions/checkout@v3
+
+ - name: Build dotnet with emsdk arm64
+ run: |
+ Set-PSDebug -Trace 1
+ git clone https://github.com/Windows-on-ARM-Experiments/emsdk
+ cd emsdk
+ ./emsdk install latest
+ ./emsdk activate latest
+ cd ..
+ $env:EMSDK_PATH = $PWD.Path + "\emsdk"
+ ./build.cmd -bl -os browser -subset mono+libs+packs -c Release
+
+ - name: Test dotnet with emsdk arm64
+ run: |
+ Set-PSDebug -Trace 1
+ .\dotnet.cmd build -c Release /t:RunSample -p:RunAOTCompilation=false .\src\mono\sample\wasm\console-node\Wasm.Console.Node.Sample.csproj
+ .\dotnet.cmd build -c Release -p:RunAOTCompilation=false .\src\mono\sample\wasm\browser\Wasm.Browser.Sample.csproj
+ .\dotnet.cmd build -c Release -p:RunAOTCompilation=false .\src\mono\sample\wasm\browser-advanced\Wasm.Advanced.Sample.csproj
+ .\dotnet.cmd build -c Release -p:RunAOTCompilation=false .\src\mono\sample\wasm\browser-bench\Wasm.Browser.Bench.Sample.csproj
diff --git a/eng/native/init-vs-env.cmd b/eng/native/init-vs-env.cmd
index 68242ed725f67..6c1ad8f3a1786 100644
--- a/eng/native/init-vs-env.cmd
+++ b/eng/native/init-vs-env.cmd
@@ -8,7 +8,7 @@ if /i "%~1" == "x86" (set __VCBuildArch=x86)
if /i "%~1" == "x64" (set __VCBuildArch=x86_amd64)
if /i "%~1" == "arm" (set __VCBuildArch=x86_arm)
if /i "%~1" == "arm64" (set __VCBuildArch=x86_arm64)
-if /i "%~1" == "wasm" (set __VCBuildArch=x86_amd64)
+if /i "%~1" == "wasm" (if /i "%PROCESSOR_ARCHITECTURE%" == "ARM64" (set __VCBuildArch=x86_arm64) else (set __VCBuildArch=x86_amd64))
:: Default to highest Visual Studio version available that has Visual C++ tools.
::
diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt
index 7b57776aa007c..e4863f7dbf05d 100644
--- a/src/mono/CMakeLists.txt
+++ b/src/mono/CMakeLists.txt
@@ -40,9 +40,11 @@ set(CMAKE_MODULE_PATH
)
set(CMAKE_INSTALL_MESSAGE LAZY)
-find_program(CCACHE_PROGRAM ccache)
-if(CCACHE_PROGRAM)
- set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
+if(USE_CCACHE)
+ find_program(CCACHE_PROGRAM ccache)
+ if(CCACHE_PROGRAM)
+ set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
+ endif()
endif()
function(append value)
diff --git a/src/mono/mono.proj b/src/mono/mono.proj
index 695064cc7663b..da81b42e1b2b2 100644
--- a/src/mono/mono.proj
+++ b/src/mono/mono.proj
@@ -745,7 +745,6 @@
$(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.dylib
$(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.so
$([MSBuild]::NormalizePath('$(MonoLLVMDir)', '$(BuildArchitecture)', 'bin', 'libclang.dll'))
- setlocal EnableDelayedExpansion && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.bat'))" && !EMSDK_PYTHON!
<_ForceRelease Condition="$([MSBuild]::IsOSPlatform('Windows')) and '$(TargetArchitecture)' == 'wasm' and '$(Configuration)' == 'Debug'">true
diff --git a/src/mono/mono/metadata/coree.c b/src/mono/mono/metadata/coree.c
index 2efdfd25adb64..37c94daf32fdb 100644
--- a/src/mono/mono/metadata/coree.c
+++ b/src/mono/mono/metadata/coree.c
@@ -646,7 +646,7 @@ STDAPI MonoFixupCorEE(HMODULE ModuleHandle)
*(Trampoline)++ = 0xFF;
*(Trampoline)++ = 0xE3;
#else
-#error Unsupported architecture.
+ g_assert_not_reached();
#endif
#else
ProcRva = (DWORD)(ExportFixup->ProcAddress.DWordPtr - (DWORD_PTR)DosHeader);
diff --git a/src/mono/mono/mini/mini-windows.c b/src/mono/mono/mini/mini-windows.c
index c678f4c4594c4..f5d81c537a691 100644
--- a/src/mono/mono/mini/mini-windows.c
+++ b/src/mono/mono/mini/mini-windows.c
@@ -283,7 +283,9 @@ thread_timer_expired (HANDLE thread)
if (GetThreadContext (thread, &context)) {
guchar *ip;
-#ifdef _WIN64
+#ifdef _ARM64_
+ ip = (guchar *) context.Pc;
+#elif _WIN64
ip = (guchar *) context.Rip;
#else
ip = (guchar *) context.Eip;
diff --git a/src/mono/mono/utils/mono-threads-coop.c b/src/mono/mono/utils/mono-threads-coop.c
index 4ed659d66058c..b6263bd844cea 100644
--- a/src/mono/mono/utils/mono-threads-coop.c
+++ b/src/mono/mono/utils/mono-threads-coop.c
@@ -219,6 +219,7 @@ typedef struct {
__declspec(naked) void __cdecl
copy_stack_data_internal_win32_wrapper (MonoThreadInfo *info, MonoStackData *stackdata_begin, MonoBuiltinUnwindInfo *unwind_info_data, CopyStackDataFunc func)
{
+#if defined(TARGET_X86) || defined(TARGET_AMD64)
__asm {
mov edx, dword ptr [esp + 0Ch]
mov dword ptr [edx + 00h], ebx
@@ -230,6 +231,7 @@ copy_stack_data_internal_win32_wrapper (MonoThreadInfo *info, MonoStackData *sta
mov edx, dword ptr [esp + 10h]
jmp edx
};
+#endif
}
#endif
diff --git a/src/mono/wasm/wasm.proj b/src/mono/wasm/wasm.proj
index 9755e405afed4..8342ee12786eb 100644
--- a/src/mono/wasm/wasm.proj
+++ b/src/mono/wasm/wasm.proj
@@ -293,7 +293,6 @@
<_EmccLinkFlags Include="-s EXPORTED_RUNTIME_METHODS=$(_EmccExportedRuntimeMethods)" />
<_EmccLinkFlags Include="-s EXPORTED_FUNCTIONS=$(_EmccExportedFunctions)" />
<_EmccLinkFlags Include="--source-map-base http://example.com" />
- <_EmccLinkFlags Include="-s STRICT_JS=1" />
<_EmccLinkFlags Include="-s WASM_BIGINT=1" />
<_EmccLinkFlags Include="-s EXPORT_NAME="'createDotnetRuntime'"" />
<_EmccLinkFlags Include="-s MODULARIZE=1"/>