1// Copyright 2016 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
5package runtime
6
7import "unsafe"
8
9const (
10	_EINTR  = 0x4
11	_EAGAIN = 0xb
12	_ENOMEM = 0xc
13
14	_PROT_NONE  = 0x0
15	_PROT_READ  = 0x1
16	_PROT_WRITE = 0x2
17	_PROT_EXEC  = 0x4
18
19	_MAP_ANON    = 0x20
20	_MAP_PRIVATE = 0x2
21	_MAP_FIXED   = 0x10
22
23	_MADV_DONTNEED   = 0x4
24	_MADV_FREE       = 0x8
25	_MADV_HUGEPAGE   = 0xe
26	_MADV_NOHUGEPAGE = 0xf
27	_MADV_COLLAPSE   = 0x19
28
29	_SA_RESTART = 0x10000000
30	_SA_ONSTACK = 0x8000000
31	_SA_SIGINFO = 0x4
32
33	_SI_KERNEL = 0x80
34	_SI_TIMER  = -0x2
35
36	_SIGHUP    = 0x1
37	_SIGINT    = 0x2
38	_SIGQUIT   = 0x3
39	_SIGILL    = 0x4
40	_SIGTRAP   = 0x5
41	_SIGABRT   = 0x6
42	_SIGBUS    = 0x7
43	_SIGFPE    = 0x8
44	_SIGKILL   = 0x9
45	_SIGUSR1   = 0xa
46	_SIGSEGV   = 0xb
47	_SIGUSR2   = 0xc
48	_SIGPIPE   = 0xd
49	_SIGALRM   = 0xe
50	_SIGSTKFLT = 0x10
51	_SIGCHLD   = 0x11
52	_SIGCONT   = 0x12
53	_SIGSTOP   = 0x13
54	_SIGTSTP   = 0x14
55	_SIGTTIN   = 0x15
56	_SIGTTOU   = 0x16
57	_SIGURG    = 0x17
58	_SIGXCPU   = 0x18
59	_SIGXFSZ   = 0x19
60	_SIGVTALRM = 0x1a
61	_SIGPROF   = 0x1b
62	_SIGWINCH  = 0x1c
63	_SIGIO     = 0x1d
64	_SIGPWR    = 0x1e
65	_SIGSYS    = 0x1f
66
67	_SIGRTMIN = 0x20
68
69	_FPE_INTDIV = 0x1
70	_FPE_INTOVF = 0x2
71	_FPE_FLTDIV = 0x3
72	_FPE_FLTOVF = 0x4
73	_FPE_FLTUND = 0x5
74	_FPE_FLTRES = 0x6
75	_FPE_FLTINV = 0x7
76	_FPE_FLTSUB = 0x8
77
78	_BUS_ADRALN = 0x1
79	_BUS_ADRERR = 0x2
80	_BUS_OBJERR = 0x3
81
82	_SEGV_MAPERR = 0x1
83	_SEGV_ACCERR = 0x2
84
85	_ITIMER_REAL    = 0x0
86	_ITIMER_VIRTUAL = 0x1
87	_ITIMER_PROF    = 0x2
88
89	_CLOCK_THREAD_CPUTIME_ID = 0x3
90
91	_SIGEV_THREAD_ID = 0x4
92)
93
94type timespec struct {
95	tv_sec  int64
96	tv_nsec int64
97}
98
99//go:nosplit
100func (ts *timespec) setNsec(ns int64) {
101	ts.tv_sec = ns / 1e9
102	ts.tv_nsec = ns % 1e9
103}
104
105type timeval struct {
106	tv_sec  int64
107	tv_usec int64
108}
109
110func (tv *timeval) set_usec(x int32) {
111	tv.tv_usec = int64(x)
112}
113
114type sigactiont struct {
115	sa_handler  uintptr
116	sa_flags    uint64
117	sa_restorer uintptr
118	sa_mask     uint64
119}
120
121type siginfoFields struct {
122	si_signo int32
123	si_errno int32
124	si_code  int32
125	// below here is a union; si_addr is the only field we use
126	si_addr uint64
127}
128
129type siginfo struct {
130	siginfoFields
131
132	// Pad struct to the max size in the kernel.
133	_ [_si_max_size - unsafe.Sizeof(siginfoFields{})]byte
134}
135
136type itimerspec struct {
137	it_interval timespec
138	it_value    timespec
139}
140
141type itimerval struct {
142	it_interval timeval
143	it_value    timeval
144}
145
146type sigeventFields struct {
147	value  uintptr
148	signo  int32
149	notify int32
150	// below here is a union; sigev_notify_thread_id is the only field we use
151	sigev_notify_thread_id int32
152}
153
154type sigevent struct {
155	sigeventFields
156
157	// Pad struct to the max size in the kernel.
158	_ [_sigev_max_size - unsafe.Sizeof(sigeventFields{})]byte
159}
160
161const (
162	_O_RDONLY    = 0x0
163	_O_WRONLY    = 0x1
164	_O_CREAT     = 0x40
165	_O_TRUNC     = 0x200
166	_O_NONBLOCK  = 0x800
167	_O_CLOEXEC   = 0x80000
168	_SA_RESTORER = 0
169)
170
171type stackt struct {
172	ss_sp    *byte
173	ss_flags int32
174	ss_size  uintptr
175}
176
177type sigcontext struct {
178	psw_mask uint64
179	psw_addr uint64
180	gregs    [16]uint64
181	aregs    [16]uint32
182	fpc      uint32
183	fpregs   [16]uint64
184}
185
186type ucontext struct {
187	uc_flags    uint64
188	uc_link     *ucontext
189	uc_stack    stackt
190	uc_mcontext sigcontext
191	uc_sigmask  uint64
192}
193