diff options
Diffstat (limited to 'vendor/github.com/tetratelabs/wazero/internal/platform')
12 files changed, 35 insertions, 57 deletions
diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_amd64.go b/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_amd64.go index a0c7734a0..3619eecd4 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_amd64.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_amd64.go @@ -2,8 +2,10 @@ package platform +import "sync" + // CpuFeatures exposes the capabilities for this CPU, queried via the Has, HasExtra methods. -var CpuFeatures = loadCpuFeatureFlags() +var CpuFeatures = sync.OnceValue(loadCpuFeatureFlags) // cpuFeatureFlags implements CpuFeatureFlags interface. type cpuFeatureFlags struct { diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_arm64.go b/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_arm64.go index 5430353fd..583b2941e 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_arm64.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_arm64.go @@ -2,10 +2,13 @@ package platform -import "runtime" +import ( + "runtime" + "sync" +) // CpuFeatures exposes the capabilities for this CPU, queried via the Has, HasExtra methods. -var CpuFeatures = loadCpuFeatureFlags() +var CpuFeatures = sync.OnceValue(loadCpuFeatureFlags) // cpuFeatureFlags implements CpuFeatureFlags interface. type cpuFeatureFlags struct { diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_unsupported.go index 50a178f52..5f9009453 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_unsupported.go @@ -2,7 +2,7 @@ package platform -var CpuFeatures CpuFeatureFlags = &cpuFeatureFlags{} +var CpuFeatures = func() CpuFeatureFlags { return &cpuFeatureFlags{} } // cpuFeatureFlags implements CpuFeatureFlags for unsupported platforms. type cpuFeatureFlags struct{} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go index 55906e827..3e2f435dc 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go @@ -59,12 +59,16 @@ func init() { }) } -func mmapCodeSegment(size, prot int) ([]byte, error) { - flags := syscall.MAP_ANON | syscall.MAP_PRIVATE +func mmapCodeSegment(size int) ([]byte, error) { + flag := syscall.MAP_ANON | syscall.MAP_PRIVATE + prot := syscall.PROT_READ | syscall.PROT_WRITE + if noopMprotectRX { + prot = syscall.PROT_READ | syscall.PROT_WRITE | syscall.PROT_EXEC + } for _, hugePagesConfig := range hugePagesConfigs { if hugePagesConfig.match(size) { - b, err := syscall.Mmap(-1, 0, size, prot, flags|hugePagesConfig.flag) + b, err := syscall.Mmap(-1, 0, size, prot, flag|hugePagesConfig.flag) if err != nil { continue } @@ -72,5 +76,5 @@ func mmapCodeSegment(size, prot int) ([]byte, error) { } } - return syscall.Mmap(-1, 0, size, prot, flags) + return syscall.Mmap(-1, 0, size, prot, flag) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go index 9f0610f27..ee2d87022 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go @@ -5,7 +5,11 @@ package platform import "syscall" -func mmapCodeSegment(size, prot int) ([]byte, error) { +func mmapCodeSegment(size int) ([]byte, error) { + prot := syscall.PROT_READ | syscall.PROT_WRITE + if noopMprotectRX { + prot = syscall.PROT_READ | syscall.PROT_WRITE | syscall.PROT_EXEC + } return syscall.Mmap( -1, 0, diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unix.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unix.go index 8d0baa712..6b7c617b2 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unix.go @@ -2,31 +2,8 @@ package platform -import ( - "syscall" -) - -const ( - mmapProtAMD64 = syscall.PROT_READ | syscall.PROT_WRITE | syscall.PROT_EXEC - mmapProtARM64 = syscall.PROT_READ | syscall.PROT_WRITE -) +import "syscall" func munmapCodeSegment(code []byte) error { return syscall.Munmap(code) } - -// mmapCodeSegmentAMD64 gives all read-write-exec permission to the mmap region -// to enter the function. Otherwise, segmentation fault exception is raised. -func mmapCodeSegmentAMD64(size int) ([]byte, error) { - // The region must be RWX: RW for writing native codes, X for executing the region. - return mmapCodeSegment(size, mmapProtAMD64) -} - -// mmapCodeSegmentARM64 cannot give all read-write-exec permission to the mmap region. -// Otherwise, the mmap systemcall would raise an error. Here we give read-write -// to the region so that we can write contents at call-sites. Callers are responsible to -// execute MprotectRX on the returned buffer. -func mmapCodeSegmentARM64(size int) ([]byte, error) { - // The region must be RW: RW for writing native codes. - return mmapCodeSegment(size, mmapProtARM64) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unsupported.go index f3fa0911a..06517b7b6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unsupported.go @@ -13,11 +13,7 @@ func munmapCodeSegment(code []byte) error { panic(errUnsupported) } -func mmapCodeSegmentAMD64(size int) ([]byte, error) { - panic(errUnsupported) -} - -func mmapCodeSegmentARM64(size int) ([]byte, error) { +func mmapCodeSegment(size int) ([]byte, error) { panic(errUnsupported) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_windows.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_windows.go index 03a254d4a..68b11ad38 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_windows.go @@ -56,16 +56,7 @@ func virtualProtect(address, size, newprotect uintptr, oldprotect *uint32) error return nil } -func mmapCodeSegmentAMD64(size int) ([]byte, error) { - p, err := allocateMemory(uintptr(size), windows_PAGE_EXECUTE_READWRITE) - if err != nil { - return nil, err - } - - return unsafe.Slice((*byte)(unsafe.Pointer(p)), size), nil -} - -func mmapCodeSegmentARM64(size int) ([]byte, error) { +func mmapCodeSegment(size int) ([]byte, error) { p, err := allocateMemory(uintptr(size), windows_PAGE_READWRITE) if err != nil { return nil, err diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_bsd.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_bsd.go index f8f40cabe..d9b264863 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_bsd.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_bsd.go @@ -7,6 +7,8 @@ import ( "unsafe" ) +const noopMprotectRX = false + // MprotectRX is like syscall.Mprotect with RX permission, defined locally so that BSD compiles. func MprotectRX(b []byte) (err error) { var _p0 unsafe.Pointer diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_syscall.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_syscall.go index 6fe96d6f6..71baabb44 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_syscall.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_syscall.go @@ -4,6 +4,8 @@ package platform import "syscall" +const noopMprotectRX = false + // MprotectRX is like syscall.Mprotect with RX permission. func MprotectRX(b []byte) (err error) { return syscall.Mprotect(b, syscall.PROT_READ|syscall.PROT_EXEC) diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_unsupported.go index 84719ab08..e367b2030 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_unsupported.go @@ -2,8 +2,9 @@ package platform -import "syscall" +const noopMprotectRX = true func MprotectRX(b []byte) error { - return syscall.ENOTSUP + // Assume we already called mmap with at least RX. + return nil } diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go b/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go index 532cc7b8c..35806f6e4 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go @@ -21,13 +21,13 @@ func CompilerSupports(features api.CoreFeatures) bool { case "linux", "darwin", "freebsd", "netbsd", "dragonfly", "windows": if runtime.GOARCH == "arm64" { if features.IsEnabled(experimental.CoreFeaturesThreads) { - return CpuFeatures.Has(CpuFeatureArm64Atomic) + return CpuFeatures().Has(CpuFeatureArm64Atomic) } return true } fallthrough case "solaris", "illumos": - return runtime.GOARCH == "amd64" && CpuFeatures.Has(CpuFeatureAmd64SSE4_1) + return runtime.GOARCH == "amd64" && CpuFeatures().Has(CpuFeatureAmd64SSE4_1) default: return false } @@ -40,11 +40,7 @@ func MmapCodeSegment(size int) ([]byte, error) { if size == 0 { panic("BUG: MmapCodeSegment with zero length") } - if runtime.GOARCH == "amd64" { - return mmapCodeSegmentAMD64(size) - } else { - return mmapCodeSegmentARM64(size) - } + return mmapCodeSegment(size) } // MunmapCodeSegment unmaps the given memory region. |
