// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package runtime

// Constants
const (
	_EINTR  = 0x4
	_ENOMEM = 0xc
	_EAGAIN = 0xb
	_ENOSYS = 0x26

	_PROT_NONE  = 0
	_PROT_READ  = 0x1
	_PROT_WRITE = 0x2
	_PROT_EXEC  = 0x4

	_MAP_ANON    = 0x20
	_MAP_PRIVATE = 0x2
	_MAP_FIXED   = 0x10

	_MADV_DONTNEED   = 0x4
	_MADV_FREE       = 0x8
	_MADV_HUGEPAGE   = 0xe
	_MADV_NOHUGEPAGE = 0xf

	_SA_RESTART     = 0x10000000
	_SA_ONSTACK     = 0x8000000
	_SA_RESTORER    = 0 // unused on ARM
	_SA_SIGINFO     = 0x4
	_SI_KERNEL      = 0x80
	_SI_TIMER       = -0x2
	_SIGHUP         = 0x1
	_SIGINT         = 0x2
	_SIGQUIT        = 0x3
	_SIGILL         = 0x4
	_SIGTRAP        = 0x5
	_SIGABRT        = 0x6
	_SIGBUS         = 0x7
	_SIGFPE         = 0x8
	_SIGKILL        = 0x9
	_SIGUSR1        = 0xa
	_SIGSEGV        = 0xb
	_SIGUSR2        = 0xc
	_SIGPIPE        = 0xd
	_SIGALRM        = 0xe
	_SIGSTKFLT      = 0x10
	_SIGCHLD        = 0x11
	_SIGCONT        = 0x12
	_SIGSTOP        = 0x13
	_SIGTSTP        = 0x14
	_SIGTTIN        = 0x15
	_SIGTTOU        = 0x16
	_SIGURG         = 0x17
	_SIGXCPU        = 0x18
	_SIGXFSZ        = 0x19
	_SIGVTALRM      = 0x1a
	_SIGPROF        = 0x1b
	_SIGWINCH       = 0x1c
	_SIGIO          = 0x1d
	_SIGPWR         = 0x1e
	_SIGSYS         = 0x1f
	_FPE_INTDIV     = 0x1
	_FPE_INTOVF     = 0x2
	_FPE_FLTDIV     = 0x3
	_FPE_FLTOVF     = 0x4
	_FPE_FLTUND     = 0x5
	_FPE_FLTRES     = 0x6
	_FPE_FLTINV     = 0x7
	_FPE_FLTSUB     = 0x8
	_BUS_ADRALN     = 0x1
	_BUS_ADRERR     = 0x2
	_BUS_OBJERR     = 0x3
	_SEGV_MAPERR    = 0x1
	_SEGV_ACCERR    = 0x2
	_ITIMER_REAL    = 0
	_ITIMER_PROF    = 0x2
	_ITIMER_VIRTUAL = 0x1
	_O_RDONLY       = 0
	_O_NONBLOCK     = 0x800
	_O_CLOEXEC      = 0x80000

	_CLOCK_THREAD_CPUTIME_ID = 0x3

	_SIGEV_THREAD_ID = 0x4

	_EPOLLIN       = 0x1
	_EPOLLOUT      = 0x4
	_EPOLLERR      = 0x8
	_EPOLLHUP      = 0x10
	_EPOLLRDHUP    = 0x2000
	_EPOLLET       = 0x80000000
	_EPOLL_CLOEXEC = 0x80000
	_EPOLL_CTL_ADD = 0x1
	_EPOLL_CTL_DEL = 0x2
	_EPOLL_CTL_MOD = 0x3

	_AF_UNIX    = 0x1
	_SOCK_DGRAM = 0x2
)

type timespec struct {
	tv_sec  int32
	tv_nsec int32
}

//go:nosplit
func (ts *timespec) setNsec(ns int64) {
	ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec)
}

type stackt struct {
	ss_sp    *byte
	ss_flags int32
	ss_size  uintptr
}

type sigcontext struct {
	trap_no       uint32
	error_code    uint32
	oldmask       uint32
	r0            uint32
	r1            uint32
	r2            uint32
	r3            uint32
	r4            uint32
	r5            uint32
	r6            uint32
	r7            uint32
	r8            uint32
	r9            uint32
	r10           uint32
	fp            uint32
	ip            uint32
	sp            uint32
	lr            uint32
	pc            uint32
	cpsr          uint32
	fault_address uint32
}

type ucontext struct {
	uc_flags    uint32
	uc_link     *ucontext
	uc_stack    stackt
	uc_mcontext sigcontext
	uc_sigmask  uint32
	__unused    [31]int32
	uc_regspace [128]uint32
}

type timeval struct {
	tv_sec  int32
	tv_usec int32
}

func (tv *timeval) set_usec(x int32) {
	tv.tv_usec = x
}

type itimerspec struct {
	it_interval timespec
	it_value    timespec
}

type itimerval struct {
	it_interval timeval
	it_value    timeval
}

type sigevent struct {
	value  uintptr
	signo  int32
	notify int32
	// below here is a union; sigev_notify_thread_id is the only field we use
	sigev_notify_thread_id int32
}

type siginfo struct {
	si_signo int32
	si_errno int32
	si_code  int32
	// below here is a union; si_addr is the only field we use
	si_addr uint32
}

type sigactiont struct {
	sa_handler  uintptr
	sa_flags    uint32
	sa_restorer uintptr
	sa_mask     uint64
}

type epollevent struct {
	events uint32
	_pad   uint32
	data   [8]byte // to match amd64
}

type sockaddr_un struct {
	family uint16
	path   [108]byte
}
