diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index 04e074cf449120..18208214d0b44d 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -6960,7 +6960,9 @@ void Compiler::impImportNewObjArray(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORI // CLANG_FORMAT_COMMENT_ANCHOR; +#ifndef OSX_ARM64_ABI if (!opts.IsReadyToRun() || IsTargetAbi(CORINFO_CORERT_ABI)) +#endif // !OSX_ARM64_ABI { // Reuse the temp used to pass the array dimensions to avoid bloating @@ -7017,6 +7019,7 @@ void Compiler::impImportNewObjArray(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORI node = gtNewHelperCallNode(CORINFO_HELP_NEW_MDARR_NONVARARG, TYP_REF, args); } +#ifndef OSX_ARM64_ABI else { // @@ -7046,6 +7049,7 @@ void Compiler::impImportNewObjArray(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORI } #endif } +#endif // !OSX_ARM64_ABI for (GenTreeCall::Use& use : node->AsCall()->Args()) { diff --git a/src/coreclr/pal/src/map/map.cpp b/src/coreclr/pal/src/map/map.cpp index af97934f7ca845..7d0635c4abea2e 100644 --- a/src/coreclr/pal/src/map/map.cpp +++ b/src/coreclr/pal/src/map/map.cpp @@ -2045,14 +2045,48 @@ MAPmmapAndRecord( // Mojave hardened runtime doesn't allow executable mappings of a file. So we have to create an // anonymous mapping and read the file contents into it instead. +#if defined(HOST_ARM64) + // Set the requested mapping with forced PROT_WRITE, mmap the file, and copy its contents there. + // Once PROT_WRITE and PROT_EXEC are set together, Apple Silicon will require the use of + // PAL_JitWriteProtect to switch between executable and writable. + LPVOID pvMappedFile = mmap(NULL, len + adjust, PROT_READ, MAP_PRIVATE, fd, offset - adjust); + if (MAP_FAILED == pvMappedFile) + { + ERROR_(LOADER)("mmap failed with code %d: %s.\n", errno, strerror(errno)); + palError = FILEGetLastErrorFromErrno(); + } + else + { + if (-1 == mprotect(pvBaseAddress, len + adjust, prot | PROT_WRITE)) + { + ERROR_(LOADER)("mprotect failed with code %d: %s.\n", errno, strerror(errno)); + palError = FILEGetLastErrorFromErrno(); + } + else + { + PAL_JitWriteProtect(true); + memcpy(pvBaseAddress, pvMappedFile, len + adjust); + PAL_JitWriteProtect(false); + } + if (-1 == munmap(pvMappedFile, len + adjust)) + { + ERROR_(LOADER)("Unable to unmap the file. Expect trouble.\n"); + if (NO_ERROR == palError) + palError = FILEGetLastErrorFromErrno(); + } + } +#else // Set the requested mapping with forced PROT_WRITE to ensure data from the file can be read there, - // read the data in and finally remove the forced PROT_WRITE + // read the data in and finally remove the forced PROT_WRITE. On Intel we can still switch the + // protection later with mprotect. if ((mprotect(pvBaseAddress, len + adjust, prot | PROT_WRITE) == -1) || (pread(fd, pvBaseAddress, len + adjust, offset - adjust) == -1) || (((prot & PROT_WRITE) == 0) && mprotect(pvBaseAddress, len + adjust, prot) == -1)) { palError = FILEGetLastErrorFromErrno(); } +#endif + } else #endif diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 75d3160dda7b1a..59fcb0c9f5ec9e 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -14200,6 +14200,13 @@ BOOL LoadDynamicInfoEntry(Module *currentModule, CorInfoHelpFunc corInfoHelpFunc = MapReadyToRunHelper((ReadyToRunHelper)helperNum); if (corInfoHelpFunc != CORINFO_HELP_UNDEF) { +#ifdef OSX_ARM64_ABI + if (corInfoHelpFunc == CORINFO_HELP_NEW_MDARR) + { + STRESS_LOG(LF_ZAP, LL_WARNING, "CORINFO_HELP_NEW_MDARR is not supported on osx-arm64\n"); + return FALSE; + } +#endif // OSX_ARM64_ABI result = (size_t)CEEJitInfo::getHelperFtnStatic(corInfoHelpFunc); } else diff --git a/src/coreclr/vm/peimagelayout.cpp b/src/coreclr/vm/peimagelayout.cpp index 76a4f52d6edd37..44781faa29128f 100644 --- a/src/coreclr/vm/peimagelayout.cpp +++ b/src/coreclr/vm/peimagelayout.cpp @@ -213,13 +213,18 @@ void PEImageLayout::ApplyBaseRelocations() // Restore the protection if (dwOldProtection != 0) { +#if defined(__APPLE__) && defined(HOST_ARM64) BOOL bExecRegion = (dwOldProtection & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)) != 0; + // Disable writing on Apple Silicon + if (bExecRegion) + PAL_JitWriteProtect(false); +#else if (!ClrVirtualProtect(pWriteableRegion, cbWriteableRegion, dwOldProtection, &dwOldProtection)) ThrowLastError(); - +#endif // __APPLE__ && HOST_ARM64 dwOldProtection = 0; } @@ -238,14 +243,21 @@ void PEImageLayout::ApplyBaseRelocations() #if defined(TARGET_UNIX) && !defined(CROSSGEN_COMPILE) if (((pSection->Characteristics & VAL32(IMAGE_SCN_MEM_EXECUTE)) != 0)) { +#if defined(__APPLE__) && defined(HOST_ARM64) + // Enable writing on Apple Silicon + PAL_JitWriteProtect(true); +#else // On SELinux, we cannot change protection that doesn't have execute access rights // to one that has it, so we need to set the protection to RWX instead of RW dwNewProtection = PAGE_EXECUTE_READWRITE; +#endif // __APPLE__ && HOST_ARM64 } #endif // TARGET_UNIX && !CROSSGEN_COMPILE +#if !(defined(__APPLE__) && defined(HOST_ARM64)) if (!ClrVirtualProtect(pWriteableRegion, cbWriteableRegion, dwNewProtection, &dwOldProtection)) ThrowLastError(); +#endif // !(__APPLE__ && HOST_ARM64) #ifdef TARGET_UNIX dwOldProtection = SectionCharacteristicsToPageProtection(pSection->Characteristics); #endif // TARGET_UNIX @@ -307,13 +319,19 @@ void PEImageLayout::ApplyBaseRelocations() #ifndef CROSSGEN_COMPILE if (dwOldProtection != 0) { +#if defined(__APPLE__) && defined(HOST_ARM64) BOOL bExecRegion = (dwOldProtection & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)) != 0; + // Disable writing on Apple Silicon + if (bExecRegion) + PAL_JitWriteProtect(false); +#else // Restore the protection if (!ClrVirtualProtect(pWriteableRegion, cbWriteableRegion, dwOldProtection, &dwOldProtection)) ThrowLastError(); +#endif // __APPLE__ && HOST_ARM64 } #ifdef TARGET_UNIX PAL_LOADMarkSectionAsNotNeeded((void*)dir);