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