diff --git a/internal/util/mmap_windows.go b/internal/util/mmap_windows.go index 913a5f7..f1fee0b 100644 --- a/internal/util/mmap_windows.go +++ b/internal/util/mmap_windows.go @@ -1,12 +1,10 @@ package util import ( - "context" "os" "reflect" "unsafe" - "github.com/tetratelabs/wazero/api" "golang.org/x/sys/windows" ) @@ -16,14 +14,21 @@ type MappedRegion struct { addr uintptr } -func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, size int32) (*MappedRegion, error) { - h, err := windows.CreateFileMapping(windows.Handle(f.Fd()), nil, windows.PAGE_READWRITE, 0, 0, nil) +func MapRegion(f *os.File, offset int64, size int32) (*MappedRegion, error) { + maxSize := offset + int64(size) + h, err := windows.CreateFileMapping( + windows.Handle(f.Fd()), nil, windows.PAGE_READWRITE, + uint32(maxSize>>32), uint32(maxSize), nil) if h == 0 { return nil, err } + const allocationGranularity = 64 * 1024 + align := offset % allocationGranularity + offset -= align + a, err := windows.MapViewOfFile(h, windows.FILE_MAP_WRITE, - uint32(offset>>32), uint32(offset), uintptr(size)) + uint32(offset>>32), uint32(offset), uintptr(size)+uintptr(align)) if a == 0 { windows.CloseHandle(h) return nil, err @@ -32,9 +37,9 @@ func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, si ret := &MappedRegion{Handle: h, addr: a} // SliceHeader, although deprecated, avoids a go vet warning. sh := (*reflect.SliceHeader)(unsafe.Pointer(&ret.Data)) + sh.Data = a + uintptr(align) sh.Len = int(size) sh.Cap = int(size) - sh.Data = a return ret, nil } diff --git a/vfs/shm_windows.go b/vfs/shm_windows.go index ad3e153..80ddad5 100644 --- a/vfs/shm_windows.go +++ b/vfs/shm_windows.go @@ -98,7 +98,7 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext // Maps regions into memory. for int(id) >= len(s.shared) { - r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size) + r, err := util.MapRegion(s.File, int64(id)*int64(size), size) if err != nil { return 0, err } diff --git a/vfs/vfs.go b/vfs/vfs.go index 569346f..db53b6f 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -470,6 +470,8 @@ func vfsErrorCode(ctx context.Context, err error, code _ErrorCode) _ErrorCode { switch v := reflect.ValueOf(err); v.Kind() { case reflect.Uint8, reflect.Uint16: code = _ErrorCode(v.Uint()) + default: + sys = err } }