github.com/miolini/go@v0.0.0-20160405192216-fca68c8cb408/src/runtime/os_solaris.go (about)

     1  // Copyright 2014 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  package runtime
     6  
     7  import "unsafe"
     8  
     9  type mts struct {
    10  	tv_sec  int64
    11  	tv_nsec int64
    12  }
    13  
    14  type mscratch struct {
    15  	v [6]uintptr
    16  }
    17  
    18  type mOS struct {
    19  	waitsema uintptr // semaphore for parking on locks
    20  	perrno   *int32  // pointer to tls errno
    21  	// these are here because they are too large to be on the stack
    22  	// of low-level NOSPLIT functions.
    23  	//LibCall       libcall;
    24  	ts      mts
    25  	scratch mscratch
    26  }
    27  
    28  type libcFunc uintptr
    29  
    30  var asmsysvicall6 libcFunc
    31  
    32  //go:nosplit
    33  func sysvicall0(fn *libcFunc) uintptr {
    34  	var libcall libcall
    35  	libcall.fn = uintptr(unsafe.Pointer(fn))
    36  	libcall.n = 0
    37  	libcall.args = uintptr(unsafe.Pointer(fn)) // it's unused but must be non-nil, otherwise crashes
    38  	asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
    39  	return libcall.r1
    40  }
    41  
    42  //go:nosplit
    43  func sysvicall1(fn *libcFunc, a1 uintptr) uintptr {
    44  	var libcall libcall
    45  	libcall.fn = uintptr(unsafe.Pointer(fn))
    46  	libcall.n = 1
    47  	// TODO(rsc): Why is noescape necessary here and below?
    48  	libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
    49  	asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
    50  	return libcall.r1
    51  }
    52  
    53  //go:nosplit
    54  func sysvicall2(fn *libcFunc, a1, a2 uintptr) uintptr {
    55  	var libcall libcall
    56  	libcall.fn = uintptr(unsafe.Pointer(fn))
    57  	libcall.n = 2
    58  	libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
    59  	asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
    60  	return libcall.r1
    61  }
    62  
    63  //go:nosplit
    64  func sysvicall3(fn *libcFunc, a1, a2, a3 uintptr) uintptr {
    65  	var libcall libcall
    66  	libcall.fn = uintptr(unsafe.Pointer(fn))
    67  	libcall.n = 3
    68  	libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
    69  	asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
    70  	return libcall.r1
    71  }
    72  
    73  //go:nosplit
    74  func sysvicall4(fn *libcFunc, a1, a2, a3, a4 uintptr) uintptr {
    75  	var libcall libcall
    76  	libcall.fn = uintptr(unsafe.Pointer(fn))
    77  	libcall.n = 4
    78  	libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
    79  	asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
    80  	return libcall.r1
    81  }
    82  
    83  //go:nosplit
    84  func sysvicall5(fn *libcFunc, a1, a2, a3, a4, a5 uintptr) uintptr {
    85  	var libcall libcall
    86  	libcall.fn = uintptr(unsafe.Pointer(fn))
    87  	libcall.n = 5
    88  	libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
    89  	asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
    90  	return libcall.r1
    91  }
    92  
    93  //go:nosplit
    94  func sysvicall6(fn *libcFunc, a1, a2, a3, a4, a5, a6 uintptr) uintptr {
    95  	var libcall libcall
    96  	libcall.fn = uintptr(unsafe.Pointer(fn))
    97  	libcall.n = 6
    98  	libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
    99  	asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
   100  	return libcall.r1
   101  }