// Copyright 2016 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.

//go:generate stringer -type=Status -output=types_string.go

package zx

import "unsafe"

type Status int32      // zx_status_t
type Handle uint32     // zx_handle_t
type Clock uint32      // zx_clock_t,
type Time int64        // zx_time_t, nanoseconds
type Duration int64    // zx_duration_t, nanoseconds
type Signals uint32    // zx_signals_t
type Rights uint32     // zx_rights_t
type Paddr uintptr     // zx_paddr_t
type Vaddr uintptr     // zx_vaddr_t
type ObjectType uint32 // zx_obj_type_t
type HandleOp uint32   // zx_handle_op_t;

func (r Rights) Subtract(targetRights Rights) Rights {
	if r == RightSameRights || targetRights == RightSameRights {
		panic("subtraction doesn't make sense for zx.RightSameRights")
	}
	return r &^ targetRights
}

func (r Rights) StrictSupersetOf(targetRights Rights) bool {
	return r.Subtract(targetRights) != 0 && targetRights.Subtract(r) == 0
}

func (r Rights) SupersetOf(targetRights Rights) bool {
	return r.StrictSupersetOf(targetRights) || r == targetRights
}

func (r Rights) SubsetOf(targetRights Rights) bool {
	return targetRights.SupersetOf(r)
}

func (r Rights) StrictSubsetOf(targetRights Rights) bool {
	return targetRights.StrictSupersetOf(r)
}

type WaitItem struct {
	Handle  Handle
	WaitFor Signals
	Pending Signals
} // zx_wait_item_t

const HandleInvalid = Handle(0)

// deprecated name
const HANDLE_INVALID = Handle(0)

const HandleSize = uint64(unsafe.Sizeof(Handle(0)))

const ZX_MAX_NAME_LEN = 32

const (
	ZX_RREC_DELETED = 0
	ZX_RREC_SELF    = 1
	ZX_RREC_DATA    = 2
	ZX_RREC_IRQ     = 3
	ZX_RREC_MMIO    = 4
	ZX_RREC_IOPORT  = 5
)

const (
	ZX_RACT_ENABLE  = 1
	ZX_RACT_DISABLE = 2
)

const (
	ZX_RREC_SELF_GENERIC = 0
	ZX_RREC_SELF_ROOT    = 1
)

const (
	ZX_CACHE_POLICY_CACHED          = 0
	ZX_CACHE_POLICY_UNCACHED        = 1
	ZX_CACHE_POLICY_UNCACHED_DEVICE = 2
	ZX_CACHE_POLICY_WRITE_COMBINING = 3
	ZX_CACHE_POLICY_MASK            = 3
)

const (
	ZX_INFO_VMO_TYPE_PAGED    = 1 << 0
	ZX_INFO_VMO_TYPE_PHYSICAL = 0 << 0
	ZX_INFO_VMO_RESIZABLE     = 1 << 1
	ZX_INFO_VMO_IS_COW_CLONE  = 1 << 2
	ZX_INFO_VMO_VIA_HANDLE    = 1 << 3
	ZX_INFO_VMO_VIA_MAPPING   = 1 << 4
	ZX_INFO_VMO_PAGER_BACKED  = 1 << 5
	ZX_INFO_VMO_CONTIGUOUS    = 1 << 6
	ZX_INFO_VMO_DISCARDABLE   = 1 << 7
	ZX_INFO_VMO_IMMUTABLE     = 1 << 8
)

type InfoHandleBasic struct {
	Koid        uint64
	Rights      Rights
	Type        ObjectType
	RelatedKoid uint64
	Props       uint32
} // zx_info_handle_basic_t

type InfoSocket struct {
	Options        uint32
	RXBufMax       int
	RXBufSize      int
	RXBufAvailable int
	TXBufMax       int
	TXBufSize      int
} // zx_info_socket_t

type InfoVmo struct {
	Koid                  uint64
	Name                  [ZX_MAX_NAME_LEN]uint8
	SizeBytes             uint64
	ParentKoid            uint64
	NumChildren           uint
	NumMappings           uint
	ShareCount            uint
	Flags                 uint32
	_                     [4]uint8
	CommittedBytes        uint64
	HandleRights          Rights
	CachePolicy           uint32
	MetadataBytes         uint64
	CommittedChangeEvents uint64
} // zx_info_vmo_t

type RrecSelf struct {
	Type        uint16 // ZX_RREC_SELF
	Subtype     uint16
	Options     uint32
	Koid        uint64
	RecordCount uint32
	ChildCount  uint32
	_           [2]uint32
	Name        [ZX_MAX_NAME_LEN]uint8
} // zx_rrec_self_t

type RrecMMIO struct {
	Type     uint16 // ZX_RREC_MMIO
	Subtype  uint16
	Options  uint32
	PhysBase uint64
	PhysSize uint64
	_        [10]uint32
} // zx_rrec_mmio_t

type RrecIRQ struct {
	Type     uint16 // ZX_RREC_IRQ
	Subtype  uint16
	Options  uint32
	IRQBase  uint32
	IRQCount uint32
	_        [12]uint32
} // zx_rrec_irq_t

type RrecIOPort struct {
	Type      uint16 // ZX_RREC_IOPORT
	Subtype   uint16
	Options   uint32
	PortBase  uint32
	PortCount uint32
	_         [12]uint32
} // zx_rrec_ioport_t

type RrecData struct {
	Type    uint16
	Subtype uint16
	Options uint32 // low 4 bits are count
	Data    [56]uint8
} // zx_rrec_data_t

type Rrec struct {
	typ uint16
	_   [62]uint8
} // zx_rrec_t

func (r *Rrec) Box() RrecValue {
	switch r.typ {
	case ZX_RREC_DELETED:
		return nil
	case ZX_RREC_SELF:
		return (*RrecSelf)(unsafe.Pointer(r))
	case ZX_RREC_DATA:
		return (*RrecData)(unsafe.Pointer(r))
	case ZX_RREC_IRQ:
		return (*RrecIRQ)(unsafe.Pointer(r))
	case ZX_RREC_MMIO:
		return (*RrecMMIO)(unsafe.Pointer(r))
	case ZX_RREC_IOPORT:
		return (*RrecIOPort)(unsafe.Pointer(r))
	default:
		return nil
	}
}

type RrecValue interface {
	rrec()
}

func (*RrecSelf) rrec()   {}
func (*RrecData) rrec()   {}
func (*RrecIRQ) rrec()    {}
func (*RrecMMIO) rrec()   {}
func (*RrecIOPort) rrec() {}

type ChannelCallArgs struct {
	WriteBytes      unsafe.Pointer
	WriteHandles    *Handle
	ReadBytes       unsafe.Pointer
	ReadHandles     *Handle
	WriteNumBytes   uint32
	WriteNumHandles uint32
	ReadNumBytes    uint32
	ReadNumHandles  uint32
}

type ChannelCallEtcArgs struct {
	WriteBytes      unsafe.Pointer
	WriteHandles    *HandleDisposition
	ReadBytes       unsafe.Pointer
	ReadHandles     *HandleInfo
	WriteNumBytes   uint32
	WriteNumHandles uint32
	ReadNumBytes    uint32
	ReadNumHandles  uint32
}

type FIFOState struct {
	head, tail uint64
}

type SMCParameters struct {
	funcID                             uint32
	arg1, arg2, arg3, arg4, arg5, arg6 uint64
	clientId, secureOSID               uint16
}

type SMCResult struct {
	arg0, arg1, arg2, arg3 uint64
}

type HandleDisposition struct {
	Operation HandleOp
	Handle    Handle
	Type      ObjectType
	Rights    Rights
	Result    Status
}

type HandleInfo struct {
	Handle Handle
	Type   ObjectType
	Rights Rights
	Unused uint32
}

// Status codes. See zircon/system/public/zircon/errors.h
const (
	ErrOk Status = -iota
	ErrInternal
	ErrNotSupported
	ErrNoResources
	ErrNoMemory
	ErrCallFailed
	ErrInterruptedRetry
	_ // -7
	_ // -8
	_ // -9
	ErrInvalidArgs
	ErrBadHandle
	ErrWrongType
	ErrBadSyscall
	ErrOutOfRange
	ErrBufferTooSmall
	_ // -16
	_ // -17
	_ // -18
	_ // -19
	ErrBadState
	ErrTimedOut
	ErrShouldWait
	ErrCanceled
	ErrPeerClosed
	ErrNotFound
	ErrAlreadyExists
	ErrAlreadyBound
	ErrUnavailable
	_ // -29
	ErrAccessDenied
	_ // -31
	_ // -32
	_ // -33
	_ // -34
	_ // -35
	_ // -36
	_ // -37
	_ // -38
	_ // -39
	ErrIO
	ErrIORefused
	ErrIODataIntegrity
	ErrIODataLoss
	ErrIONotPresent
	_ // -45
	_ // -46
	_ // -47
	_ // -48
	_ // -49
	ErrBadPath
	ErrNotDir
	ErrNotFile
	ErrFileBig
	ErrNoSpace
	ErrNotEmpty
	_ // -56
	_ // -57
	_ // -58
	_ // -59
	ErrStop
	ErrNext
	_ // -62
	_ // -63
	_ // -64
	_ // -65
	_ // -66
	_ // -67
	_ // -68
	_ // -69
	ErrProtocolNotSupported
	ErrAddressUnreachable
	ErrAddressInUse
	ErrNotConnected
	ErrConnectionRefused
	ErrConnectionReset
	ErrConnectionAborted

	// deprecated
	ErrHandleClosed = ErrCanceled
	ErrRemoteClosed = ErrPeerClosed
)

const (
	SignalObject0 = 1 << iota
	SignalObject1
	SignalObject2
	SignalObject3
	SignalObject4
	SignalObject5
	SignalObject6
	SignalObject7
	SignalObject8
	SignalObject9
	SignalObject10
	SignalObject11
	SignalObject12
	SignalObject13
	SignalObject14
	SignalObject15
	SignalObject16
	SignalObject17
	SignalObject18
	SignalObject19
	SignalObject20
	SignalObject21
	SignalObject22
	SignalObject23

	SignalUser0
	SignalUser1
	SignalUser2
	SignalUser3
	SignalUser4
	SignalUser5
	SignalUser6
	SignalUser7

	// Aliases
	SignalHandleClosed = SignalObject23

	// Event
	SignalEventSignaled = SignalObject3
	SignalEventMask     = SignalUserAll | SignalEventSignaled

	// EventPair
	SignalEpairSignaled   = SignalObject3
	SignalEpairPeerClosed = SignalObject2

	// Channel
	SignalChannelReadable   = SignalObject0
	SignalChannelWritable   = SignalObject1
	SignalChannelPeerClosed = SignalObject2

	// Socket
	SignalSocketReadable          = SignalObject0
	SignalSocketWritable          = SignalObject1
	SignalSocketPeerClosed        = SignalObject2
	SignalSocketPeerWriteDisabled = SignalObject4
	SignalSocketWriteDisabled     = SignalObject5
	SignalSocketReadThreshold     = SignalObject10
	SignalSocketWriteThreshold    = SignalObject11

	// Port
	SignalPortReadable   = SignalObject0
	SignalPortPeerClosed = SignalObject2
	SignalPortSignaled   = SignalObject3

	// Resource
	SignalResourceReadable   = SignalObject0
	SignalResourceWritable   = SignalObject1
	SignalResourceChildAdded = SignalObject2

	// Fifo
	SignalFIFOReadable   = SignalObject0
	SignalFIFOWritable   = SignalObject1
	SignalFIFOPeerClosed = SignalObject2
	SignalFIFOSignalMask = SignalFIFOReadable | SignalFIFOWritable | SignalFIFOPeerClosed

	// Task signals (process, thread, job)
	SignalTaskTerminated = SignalObject3
	SignalTaskSignalMask = SignalObject3

	// Job
	SignalJobSignaled = SignalObject3

	// Process
	SignalProccessSignaled = SignalObject3

	// Thread
	SignalThreadSignaled = SignalObject3

	SignalObjectAll = (0xfffff)
	SignalUserAll   = Signals(15 << 4)
	SignalNone      = Signals(0)
)

const (
	RightDuplicate Rights = 1 << iota
	RightTransfer
	RightRead
	RightWrite
	RightExecute
	RightMap
	RightGetProperty
	RightSetProperty
	RightEnumerate
	RightDestroy
	RightGetPolicy
	RightSetPolicy
	RightSignal
	RightSignalPeer
	RightWait
	RightInspect
	RightManageJob
	RightManageProcess
	RightManageThread
	RightApplyPolicy
	RightManageSocket
	RightSameRights = Rights(1 << 31)
	RightNone       = Rights(0)
)

const (
	RightsBasic    = RightTransfer | RightDuplicate | RightWait | RightInspect
	RightsIO       = RightRead | RightWrite
	RightsProperty = RightGetProperty | RightSetProperty
	RightsPolicy   = RightGetPolicy | RightSetPolicy
)

// Topics for object_get_info
const (
	ObjectInfoHandleNone            = 0
	ObjectInfoHandleValid           = 1
	ObjectInfoHandleBasic           = 2
	ObjectInfoProcess               = 3 | (1 << 28)
	ObjectInfoProcessThreads        = 4
	ObjectInfoResourceChildren      = 5
	ObjectInfoResourceRecords       = 6
	ObjectInfoVMAR                  = 7
	ObjectInfoJobChildren           = 8
	ObjectInfoJobProcesses          = 9
	ObjectInfoThread                = 10
	ObjectInfoThreadExceptionReport = 11
	ObjectInfoTaskStats             = 12
	ObjectInfoProcessMaps           = 13
	ObjectInfoProcessVMOs_V1        = 14 | (0 << 28)
	ObjectInfoProcessVMOs           = 14 | (1 << 28)
	ObjectInfoThreadStats           = 15
	ObjectInfoCpUStats              = 16
	ObjectInfoKMemStats             = 17
	ObjectInfoResource              = 18
	ObjectInfoHandleCount           = 19
	ObjectInfoBTI                   = 20
	ObjectInfoProcessHandleStats    = 21
	ObjectInfoSocket                = 22
	ObjectInfoVMO_V1                = 23 | (0 << 28)
	ObjectInfoVMO                   = 23 | (1 << 28)
)

const (
	ProcessInfoFlagStarted          uint32 = 1 << 0 // ZX_INFO_PROCESS_FLAG_STARTED
	ProcessInfoFlagExited                  = 1 << 1 // ZX_INFO_PROCESS_FLAG_EXITED
	ProcessInfoFlagDebuggerAttached        = 1 << 2 // ZX_INFO_PROCESS_FLAG_DEBUGGER_ATTACHED
)

const (
	ObjectTypeNone ObjectType = iota
	ObjectTypeProcess
	ObjectTypeThread
	ObjectTypeVmo
	ObjectTypeChannel
	ObjectTypeEvent
	ObjectTypePort
	_ // 7
	_ // 8
	ObjectTypeInterrupt
	_ // 10
	ObjectTypePciDevice
	ObjectTypeLog
	_ // 13
	ObjectTypeSocket
	ObjectTypeResource
	ObjectTypeEventPair
	ObjectTypeJob
	ObjectTypeVmar
	ObjectTypeFifo
	ObjectTypeGuest
	ObjectTypeVcpu
	ObjectTypeTimer
	ObjectTypeIommu
	ObjectTypeBti
	ObjectTypeProfile
	ObjectTypePmt
	ObjectTypeSuspendToken
	ObjectTypePager
)

const (
	HandleOpMove      HandleOp = iota // ZX_HANDLE_OP_MOVE
	HandleOpDuplicate                 // ZX_HANDLE_OP_DUPLICATE
)

// Options for socket_create
const (
	SocketStream = iota
	SocketDatagram
)

// Options for socket_read
const (
	SocketPeek = 1 << 3
)

// Options for socket_set_disposition
const (
	_                              = iota // 0
	SocketDispositionWriteDisabled        // ZX_SOCKET_DISPOSITION_WRITE_DISABLED
	SocketDispositionWriteEnabled         // ZX_SOCKET_DISPOSITION_WRITE_ENABLED
)

const (
	_                           = iota // 0
	_                                  // 1
	PropRegisterGS                     // ZX_PROP_REGISTER_GS
	PropName                           // ZX_PROP_NAME
	PropRegisterFS                     // ZX_PROP_REGISTER_FS
	PropProcessDebugAddr               // ZX_PROP_PROCESS_DEBUG_ADDR
	PropProcessVDSOBaseAddress         // ZX_PROP_PROCESS_VDSO_BASE_ADDRESS
	PropProcessBreakOnLoad             // ZX_PROP_PROCESS_BREAK_ON_LOAD
	PropProcessHwTraceContextId        // ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID
	_                                  // 9
	_                                  // 10
	_                                  // 11
	PropSocketRXThreshold              // ZX_PROP_SOCKET_RX_THRESHOLD
	PropSocketTXThreshold              // ZX_PROP_SOCKET_TX_THRESHOLD
	_                                  // 14
	PropJobKillOnOom                   // ZX_PROP_JOB_KILL_ON_OOM
	PropExceptionState                 // ZX_PROP_EXCEPTION_STATE
	PropVmoContentSize                 // ZX_PROP_VMO_CONTENT_SIZE
	PropJobMaxHeight                   // ZX_PROP_JOB_MAX_HEIGHT
)

const (
	TimensecInfinite = Time(0x7FFFFFFFFFFFFFFF)
)

// EOF is used like io.EOF.
//
// When package io is linked in, at initialization this value is
// rewritten to be equivalent to io.EOF, so that the io.Readers
// and io.Writers in this package meet their specs.
var EOF error = eof{}

type eof struct{}

func (eof) Error() string { return "zx.EOF" }

// EPIPE is used like syscall.EPIPE

// When package syscall is linked in, at initialization this value is
// rewritten to be equivalent to syscall.EPIPE.

var EPIPE error = epipe{}

type epipe struct{}

func (epipe) Error() string { return "errno(32)" }

type VMOOption int

const (
	VMOOptionResizable VMOOption = 1 << 1 // ZX_VMO_RESIZABLE
)

type VMOChildOption uint32

const (
	// zx_vmo_create_child requires exactly 1 of the following 3 flags:
	VMOChildOptionSnapshot               VMOChildOption = 1 << 0 // ZX_VMO_CHILD_SNAPSHOT
	VMOChildOptionSlice                                 = 1 << 3 // ZX_VMO_CHILD_SLICE
	VMOChildOptionSnapshotAtLeastOnWrite                = 1 << 4 // ZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE

	// optional flags
	VMOChildOptionResizable = 1 << 2 // ZX_VMO_CHILD_RESIZABLE
	VMOChildOptionNoWrite   = 1 << 5 // ZX_VMO_CHILD_NO_WRITE
)

type VMFlag uint32

const (
	VMFlagPermRead          VMFlag = 1 << 0 // ZX_VM_PERM_READ
	VMFlagPermWrite         VMFlag = 1 << 1 // ZX_VM_PERM_WRITE
	VMFlagPermExecute       VMFlag = 1 << 2 // ZX_VM_PERM_EXECUTE
	VMFlagCompact           VMFlag = 1 << 3 // ZX_VM_COMPACT
	VMFlagSpecific          VMFlag = 1 << 4 // ZX_VM_SPECIFIC
	VMFlagSpecificOverwrite VMFlag = 1 << 5 // ZX_VM_SPECIFIC_OVERWRITE
	VMFlagCanMapSpecific    VMFlag = 1 << 6 // ZX_VM_CAN_MAP_SPECIFIC
	VMFlagCanMapRead        VMFlag = 1 << 7 // ZX_VM_CAN_MAP_READ
	VMFlagCanMapWrite       VMFlag = 1 << 8 // ZX_VM_CAN_MAP_WRITE
	VMFlagCanMapExecute     VMFlag = 1 << 9 // ZX_VM_CAN_MAP_EXECUTE
)
