This commit is contained in:
Nuno Cruces
2025-11-06 11:25:05 +00:00
parent 6d92aa16ef
commit 5e73c5d714
3 changed files with 14 additions and 7 deletions

View File

@@ -1,12 +1,10 @@
package util package util
import ( import (
"context"
"os" "os"
"reflect" "reflect"
"unsafe" "unsafe"
"github.com/tetratelabs/wazero/api"
"golang.org/x/sys/windows" "golang.org/x/sys/windows"
) )
@@ -16,14 +14,21 @@ type MappedRegion struct {
addr uintptr addr uintptr
} }
func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, size int32) (*MappedRegion, error) { func MapRegion(f *os.File, offset int64, size int32) (*MappedRegion, error) {
h, err := windows.CreateFileMapping(windows.Handle(f.Fd()), nil, windows.PAGE_READWRITE, 0, 0, nil) 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 { if h == 0 {
return nil, err return nil, err
} }
const allocationGranularity = 64 * 1024
align := offset % allocationGranularity
offset -= align
a, err := windows.MapViewOfFile(h, windows.FILE_MAP_WRITE, 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 { if a == 0 {
windows.CloseHandle(h) windows.CloseHandle(h)
return nil, err 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} ret := &MappedRegion{Handle: h, addr: a}
// SliceHeader, although deprecated, avoids a go vet warning. // SliceHeader, although deprecated, avoids a go vet warning.
sh := (*reflect.SliceHeader)(unsafe.Pointer(&ret.Data)) sh := (*reflect.SliceHeader)(unsafe.Pointer(&ret.Data))
sh.Data = a + uintptr(align)
sh.Len = int(size) sh.Len = int(size)
sh.Cap = int(size) sh.Cap = int(size)
sh.Data = a
return ret, nil return ret, nil
} }

View File

@@ -98,7 +98,7 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext
// Maps regions into memory. // Maps regions into memory.
for int(id) >= len(s.shared) { 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 { if err != nil {
return 0, err return 0, err
} }

View File

@@ -470,6 +470,8 @@ func vfsErrorCode(ctx context.Context, err error, code _ErrorCode) _ErrorCode {
switch v := reflect.ValueOf(err); v.Kind() { switch v := reflect.ValueOf(err); v.Kind() {
case reflect.Uint8, reflect.Uint16: case reflect.Uint8, reflect.Uint16:
code = _ErrorCode(v.Uint()) code = _ErrorCode(v.Uint())
default:
sys = err
} }
} }