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

// +build fuchsia

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;

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
)

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 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 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
}

// 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
	_ // -44
	_ // -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

	// 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
	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 (
	_ = iota
	ObjectInfoHandleValid
	ObjectInfoHandleBasic
	ObjectInfoProcess
	ObjectInfoProcessThreads
	ObjectInfoResourceChildren
	ObjectInfoResourceRecords
	ObjectInfoVMAR
	ObjectInfoJobChildren
	ObjectInfoJobProcesses
	ObjectInfoThread
	ObjectInfoThreadExceptionReport
	ObjectInfoTaskStats
	ObjectInfoProcessMaps
	ObjectInfoProcessVMOs
	ObjectInfoThreadStats
	ObjectInfoCpUStats
	ObjectInfoKMemStats
	ObjectInfoResource
	ObjectInfoHandleCount
	ObjectInfoBTI
	ObjectInfoProcessHandleStats
	ObjectInfoSocket
)

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) // 0
	HandleOpDuplicate                  // 1
)

// Options for socket_create
const (
	SocketStream   = iota            // 0
	SocketDatagram = 1 << (iota - 1) // 1
)

// Options for socket_write
const (
	_                   = iota // 0
	SocketShutdownWrite        // 1
	SocketShutdownRead         // 2
)

const (
	_                          = iota // 0
	_                                 // 1
	PropNumStateKinds                 // ZX_PROP_NUM_STATE_KINDS
	PropName                          // ZX_PROP_NAME
	PropRegisterFS                    // ZX_PROP_REGISTER_FS
	PropProcessDebugAddr              // ZX_PROP_PROCESS_DEBUG_ADDR
	PropProcessVDSOBaseAddress        // ZX_PROP_PROCESS_VDSO_BASE_ADDRESS
	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:
	VMOChildOptionCopyOnWrite      VMOChildOption = 1 << 0 // ZX_VMO_CHILD_COPY_ON_WRITE
	VMOChildOptionSlice                           = 1 << 3 // ZX_VMO_CHILD_SLICE
	VMOChildOptionPrivatePagerCopy                = 1 << 4 // ZX_VMO_CHILD_PRIVATE_PAGER_COPY

	// optional flags
	VMOChildOptionResizable = 1 << 2 // ZX_VMO_CHILD_RESIZABLE
)

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
)
