blob: 57c38bc5dc8a78870dd01fddb71dd4aa8542c6c9 [file] [log] [blame]
Brad Fitzpatrick51947442016-03-01 22:57:46 +00001// Copyright 2016 The Go Authors. All rights reserved.
Ian Lance Taylorcc0a04d2016-02-10 21:46:51 -08002// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
6
7package runtime_test
8
9import (
10 "runtime"
Ian Lance Taylorcc0a04d2016-02-10 21:46:51 -080011 "testing"
Austin Clements276a52d2016-07-18 21:40:02 -040012 "unsafe"
Ian Lance Taylorcc0a04d2016-02-10 21:46:51 -080013)
14
15// Test that the error value returned by mmap is positive, as that is
16// what the code in mem_bsd.go, mem_darwin.go, and mem_linux.go expects.
17// See the uses of ENOMEM in sysMap in those files.
18func TestMmapErrorSign(t *testing.T) {
Austin Clements193088b2017-10-16 20:28:29 -040019 p, err := runtime.Mmap(nil, ^uintptr(0)&^(runtime.GetPhysPageSize()-1), 0, runtime.MAP_ANON|runtime.MAP_PRIVATE, -1, 0)
Ian Lance Taylorcc0a04d2016-02-10 21:46:51 -080020
Austin Clements193088b2017-10-16 20:28:29 -040021 if p != nil || err != runtime.ENOMEM {
22 t.Errorf("mmap = %v, %v, want nil, %v", p, err, runtime.ENOMEM)
Ian Lance Taylorcc0a04d2016-02-10 21:46:51 -080023 }
24}
Austin Clements276a52d2016-07-18 21:40:02 -040025
26func TestPhysPageSize(t *testing.T) {
27 // Mmap fails if the address is not page aligned, so we can
28 // use this to test if the page size is the true page size.
29 ps := runtime.GetPhysPageSize()
30
31 // Get a region of memory to play with. This should be page-aligned.
Austin Clements193088b2017-10-16 20:28:29 -040032 b, err := runtime.Mmap(nil, 2*ps, 0, runtime.MAP_ANON|runtime.MAP_PRIVATE, -1, 0)
33 if err != 0 {
34 t.Fatalf("Mmap: %v", err)
Austin Clements276a52d2016-07-18 21:40:02 -040035 }
36
37 // Mmap should fail at a half page into the buffer.
Austin Clements193088b2017-10-16 20:28:29 -040038 _, err = runtime.Mmap(unsafe.Pointer(uintptr(b)+ps/2), ps, 0, runtime.MAP_ANON|runtime.MAP_PRIVATE|runtime.MAP_FIXED, -1, 0)
39 if err == 0 {
Austin Clements276a52d2016-07-18 21:40:02 -040040 t.Errorf("Mmap should have failed with half-page alignment %d, but succeeded: %v", ps/2, err)
41 }
42
43 // Mmap should succeed at a full page into the buffer.
Austin Clements193088b2017-10-16 20:28:29 -040044 _, err = runtime.Mmap(unsafe.Pointer(uintptr(b)+ps), ps, 0, runtime.MAP_ANON|runtime.MAP_PRIVATE|runtime.MAP_FIXED, -1, 0)
45 if err != 0 {
Austin Clements276a52d2016-07-18 21:40:02 -040046 t.Errorf("Mmap at full-page alignment %d failed: %v", ps, err)
47 }
48}