Skip to content

Commit 3fead03

Browse files
tklausergopherbot
authored andcommitted
unix: add Mremap for netbsd
Fixes golang/go#60409 Change-Id: I2d872a1a6fb63c27ab3753deff370e1c2f752bdd Reviewed-on: https://go-review.googlesource.com/c/sys/+/508397 Auto-Submit: Tobias Klauser <[email protected]> Run-TryBot: Tobias Klauser <[email protected]> Reviewed-by: Benny Siegert <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent a1a9c4b commit 3fead03

15 files changed

+119
-89
lines changed

unix/export_mremap_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright 2023 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
//go:build linux || netbsd
6+
// +build linux netbsd
7+
8+
package unix
9+
10+
const (
11+
MremapFixed = mremapFixed
12+
MremapMaymove = mremapMaymove
13+
)

unix/mmap_nomremap.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright 2023 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
//go:build aix || darwin || dragonfly || freebsd || openbsd || solaris
6+
// +build aix darwin dragonfly freebsd openbsd solaris
7+
8+
package unix
9+
10+
var mapper = &mmapper{
11+
active: make(map[*byte][]byte),
12+
mmap: mmap,
13+
munmap: munmap,
14+
}

unix/mremap.go

+17-4
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build linux
6-
// +build linux
5+
//go:build linux || netbsd
6+
// +build linux netbsd
77

88
package unix
99

@@ -14,8 +14,17 @@ type mremapMmapper struct {
1414
mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error)
1515
}
1616

17+
var mapper = &mremapMmapper{
18+
mmapper: mmapper{
19+
active: make(map[*byte][]byte),
20+
mmap: mmap,
21+
munmap: munmap,
22+
},
23+
mremap: mremap,
24+
}
25+
1726
func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
18-
if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&MREMAP_FIXED != 0 {
27+
if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&mremapFixed != 0 {
1928
return nil, EINVAL
2029
}
2130

@@ -32,9 +41,13 @@ func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data [
3241
}
3342
bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength)
3443
pNew := &bNew[cap(bNew)-1]
35-
if flags&MREMAP_DONTUNMAP == 0 {
44+
if flags&mremapDontunmap == 0 {
3645
delete(m.active, pOld)
3746
}
3847
m.active[pNew] = bNew
3948
return bNew, nil
4049
}
50+
51+
func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
52+
return mapper.Mremap(oldData, newLength, flags)
53+
}

unix/mremap_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build linux
6-
// +build linux
5+
//go:build linux || netbsd
6+
// +build linux netbsd
77

88
package unix_test
99

@@ -24,7 +24,7 @@ func TestMremap(t *testing.T) {
2424

2525
b[0] = 42
2626

27-
bNew, err := unix.Mremap(b, unix.Getpagesize()*2, unix.MREMAP_MAYMOVE)
27+
bNew, err := unix.Mremap(b, unix.Getpagesize()*2, unix.MremapMaymove)
2828
if err != nil {
2929
t.Fatalf("Mremap2: %v", err)
3030
}
@@ -40,8 +40,8 @@ func TestMremap(t *testing.T) {
4040
t.Fatal("new memory cap not equal to specified len")
4141
}
4242

43-
_, err = unix.Mremap(b, unix.Getpagesize(), unix.MREMAP_FIXED)
43+
_, err = unix.Mremap(b, unix.Getpagesize(), unix.MremapFixed)
4444
if err != unix.EINVAL {
45-
t.Fatalf("unix.MREMAP_FIXED should be forbidden")
45+
t.Fatalf("remapping to a fixed address; got %v, want %v", err, unix.EINVAL)
4646
}
4747
}

unix/syscall_aix.go

-15
Original file line numberDiff line numberDiff line change
@@ -535,21 +535,6 @@ func Fsync(fd int) error {
535535
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg
536536

537537
//sys munmap(addr uintptr, length uintptr) (err error)
538-
539-
var mapper = &mmapper{
540-
active: make(map[*byte][]byte),
541-
mmap: mmap,
542-
munmap: munmap,
543-
}
544-
545-
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
546-
return mapper.Mmap(fd, offset, length, prot, flags)
547-
}
548-
549-
func Munmap(b []byte) (err error) {
550-
return mapper.Munmap(b)
551-
}
552-
553538
//sys Madvise(b []byte, advice int) (err error)
554539
//sys Mprotect(b []byte, prot int) (err error)
555540
//sys Mlock(b []byte) (err error)

unix/syscall_bsd.go

-14
Original file line numberDiff line numberDiff line change
@@ -601,20 +601,6 @@ func Poll(fds []PollFd, timeout int) (n int, err error) {
601601
// Gethostuuid(uuid *byte, timeout *Timespec) (err error)
602602
// Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error)
603603

604-
var mapper = &mmapper{
605-
active: make(map[*byte][]byte),
606-
mmap: mmap,
607-
munmap: munmap,
608-
}
609-
610-
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
611-
return mapper.Mmap(fd, offset, length, prot, flags)
612-
}
613-
614-
func Munmap(b []byte) (err error) {
615-
return mapper.Munmap(b)
616-
}
617-
618604
//sys Madvise(b []byte, behav int) (err error)
619605
//sys Mlock(b []byte) (err error)
620606
//sys Mlockall(flags int) (err error)

unix/syscall_linux.go

+6-22
Original file line numberDiff line numberDiff line change
@@ -2125,28 +2125,6 @@ func writevRacedetect(iovecs []Iovec, n int) {
21252125
// mmap varies by architecture; see syscall_linux_*.go.
21262126
//sys munmap(addr uintptr, length uintptr) (err error)
21272127
//sys mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error)
2128-
2129-
var mapper = &mremapMmapper{
2130-
mmapper: mmapper{
2131-
active: make(map[*byte][]byte),
2132-
mmap: mmap,
2133-
munmap: munmap,
2134-
},
2135-
mremap: mremap,
2136-
}
2137-
2138-
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
2139-
return mapper.Mmap(fd, offset, length, prot, flags)
2140-
}
2141-
2142-
func Munmap(b []byte) (err error) {
2143-
return mapper.Munmap(b)
2144-
}
2145-
2146-
func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
2147-
return mapper.Mremap(oldData, newLength, flags)
2148-
}
2149-
21502128
//sys Madvise(b []byte, advice int) (err error)
21512129
//sys Mprotect(b []byte, prot int) (err error)
21522130
//sys Mlock(b []byte) (err error)
@@ -2155,6 +2133,12 @@ func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
21552133
//sys Munlock(b []byte) (err error)
21562134
//sys Munlockall() (err error)
21572135

2136+
const (
2137+
mremapFixed = MREMAP_FIXED
2138+
mremapDontunmap = MREMAP_DONTUNMAP
2139+
mremapMaymove = MREMAP_MAYMOVE
2140+
)
2141+
21582142
// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd,
21592143
// using the specified flags.
21602144
func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) {

unix/syscall_netbsd.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,18 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
360360
//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
361361
//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
362362

363+
const (
364+
mremapFixed = MAP_FIXED
365+
mremapDontunmap = 0
366+
mremapMaymove = 0
367+
)
368+
369+
//sys mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) = SYS_MREMAP
370+
371+
func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (uintptr, error) {
372+
return mremapNetBSD(oldaddr, oldlength, newaddr, newlength, flags)
373+
}
374+
363375
/*
364376
* Unimplemented
365377
*/
@@ -564,7 +576,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
564576
// mq_timedreceive
565577
// mq_timedsend
566578
// mq_unlink
567-
// mremap
568579
// msgget
569580
// msgrcv
570581
// msgsnd

unix/syscall_solaris.go

-14
Original file line numberDiff line numberDiff line change
@@ -716,20 +716,6 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) {
716716
return
717717
}
718718

719-
var mapper = &mmapper{
720-
active: make(map[*byte][]byte),
721-
mmap: mmap,
722-
munmap: munmap,
723-
}
724-
725-
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
726-
return mapper.Mmap(fd, offset, length, prot, flags)
727-
}
728-
729-
func Munmap(b []byte) (err error) {
730-
return mapper.Munmap(b)
731-
}
732-
733719
// Event Ports
734720

735721
type fileObjCookie struct {

unix/syscall_unix.go

+8
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,14 @@ func (m *mmapper) Munmap(data []byte) (err error) {
147147
return nil
148148
}
149149

150+
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
151+
return mapper.Mmap(fd, offset, length, prot, flags)
152+
}
153+
154+
func Munmap(b []byte) (err error) {
155+
return mapper.Munmap(b)
156+
}
157+
150158
func Read(fd int, p []byte) (n int, err error) {
151159
n, err = read(fd, p)
152160
if raceenabled {

unix/syscall_zos_s390x.go

-14
Original file line numberDiff line numberDiff line change
@@ -285,25 +285,11 @@ func Close(fd int) (err error) {
285285
return
286286
}
287287

288-
var mapper = &mmapper{
289-
active: make(map[*byte][]byte),
290-
mmap: mmap,
291-
munmap: munmap,
292-
}
293-
294288
// Dummy function: there are no semantics for Madvise on z/OS
295289
func Madvise(b []byte, advice int) (err error) {
296290
return
297291
}
298292

299-
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
300-
return mapper.Mmap(fd, offset, length, prot, flags)
301-
}
302-
303-
func Munmap(b []byte) (err error) {
304-
return mapper.Munmap(b)
305-
}
306-
307293
//sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A
308294
//sysnb Getegid() (egid int)
309295
//sysnb Geteuid() (uid int)

unix/zsyscall_netbsd_386.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

unix/zsyscall_netbsd_amd64.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

unix/zsyscall_netbsd_arm.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

unix/zsyscall_netbsd_arm64.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)