| # Copyright 2016 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # |
| # The syntax of each line is |
| # syscall <name> [attributes] ([args]) |
| # [returns (<type> [attributes] [args])]; |
| # |
| # with '[]' being optional and '<>' being required input. |
| # |
| # <name> is the syscall function name. It must be a valid C identifier. |
| # |
| # [attributes] can be empty or is a space separated list of words with |
| # meaning for a particular generator. |
| # |
| # [args] can be empty or is a comma separated list of |
| # '<aname>: <type> [attributes] [ctr]' |
| # |
| # <aname> is the argument name. It must be a valid C identifier. |
| # |
| # <type> is the argument type. It must be a valid C identifier with an optional |
| # array-spec which when present it must be "[number]" or "[aname]", with the |
| # number being an integer and aname the name of the argument that controls the |
| # array size. |
| # |
| # [ctr] can be empty or is an all-caps word to specify a argument constraint |
| # with valid values being one of: 'IN', 'OUT', 'INOUT' |
| # |
| # The 'returns (<type>)' is expected unless one of the attributes is 'noreturn'. |
| # |
| # See <https://fuchsia.googlesource.com/fuchsia/+/master/docs/development/api/system.md> |
| # for readability guidelines. |
| # |
| # To help the clang static analyzer identify handle related syscalls, 3 |
| # attributes are available to describe handle behaviors. Which are |
| # handle_acquire, handle_release and handle_release_always. |
| # |
| # handle_acquire The handle will be allocated when this call is |
| # successful. |
| # |
| # handle_release The handle will be released/destroyed when this |
| # call is successful. |
| # |
| # handle_release_always The handle will be released/destroyed; the only failure |
| # possible is for an invalid handle. |
| # |
| # |
| |
| # Time |
| |
| #^ Acquire the current time. |
| syscall clock_get |
| (clock_id: zx_clock_t) |
| returns (zx_time_t); |
| |
| #^ Acquire the current time. |
| syscall clock_get_new |
| (clock_id: zx_clock_t) |
| returns (zx_status_t, out: zx_time_t); |
| |
| #^ Acquire the current monotonic time. |
| syscall clock_get_monotonic |
| () |
| returns (zx_time_t); |
| |
| #^ High resolution sleep. |
| #! None. |
| syscall nanosleep blocking |
| (deadline: zx_time_t) |
| returns (zx_status_t); |
| |
| #^ Read the number of high-precision timer ticks since boot. |
| syscall ticks_get vdsocall |
| () |
| returns (zx_ticks_t); |
| |
| #^ Read the number of high-precision timer ticks in a second. |
| syscall ticks_per_second vdsocall const |
| () |
| returns (zx_ticks_t); |
| |
| #^ Convert a time relative to now to an absolute deadline. |
| syscall deadline_after vdsocall |
| (nanoseconds: zx_duration_t) |
| returns (zx_time_t); |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall clock_adjust |
| (handle: zx_handle_t, clock_id: zx_clock_t, offset: int64_t) |
| returns (zx_status_t); |
| |
| # System information |
| |
| syscall system_get_dcache_line_size vdsocall const |
| () |
| returns (uint32_t); |
| |
| #^ Get number of logical processors on the system. |
| syscall system_get_num_cpus vdsocall const |
| () |
| returns (uint32_t); |
| |
| #^ Get version string for system. |
| syscall system_get_version vdsocall |
| (version: char[version_size] OUT, version_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Get amount of physical memory on the system. |
| syscall system_get_physmem vdsocall |
| () |
| returns (uint64_t); |
| |
| #^ Get supported hardware capabilities. |
| syscall system_get_features vdsocall |
| (kind: uint32_t) |
| returns (zx_status_t, features: uint32_t features); |
| |
| # Abstraction of machine operations |
| |
| #^ Flush CPU data and/or instruction caches. |
| syscall cache_flush vdsocall |
| (addr: any[size] IN, size: size_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| # Generic handle operations |
| |
| #^ Close a handle. |
| #! None. |
| syscall handle_close |
| (handle: zx_handle_t handle_release_always) |
| returns (zx_status_t); |
| |
| #^ Close a number of handles. |
| #! None. |
| syscall handle_close_many |
| (handles: zx_handle_t[num_handles] IN, num_handles: size_t) |
| returns (zx_status_t); |
| |
| #^ Duplicate a handle. |
| #! handle must have ZX_RIGHT_DUPLICATE. |
| syscall handle_duplicate |
| (handle: zx_handle_t, rights: zx_rights_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Replace a handle. |
| #! None. |
| syscall handle_replace |
| (handle: zx_handle_t handle_release_always, rights: zx_rights_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| # Generic object operations |
| |
| #^ Wait for signals on an object. |
| #! handle must have ZX_RIGHT_WAIT. |
| syscall object_wait_one blocking |
| (handle: zx_handle_t, signals: zx_signals_t, deadline: zx_time_t) |
| returns (zx_status_t, observed: zx_signals_t optional); |
| |
| #^ Wait for signals on multiple objects. |
| #! Every entry of items must have a handle field with ZX_RIGHT_WAIT. |
| syscall object_wait_many blocking |
| (items: zx_wait_item_t[count] INOUT, count: size_t, deadline: zx_time_t) |
| returns (zx_status_t); |
| |
| #^ Subscribe for signals on an object. |
| #! handle must have ZX_RIGHT_WAIT. |
| #! port must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| syscall object_wait_async |
| (handle: zx_handle_t, port: zx_handle_t, key: uint64_t, |
| signals: zx_signals_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Signal an object. |
| #! handle must have ZX_RIGHT_SIGNAL. |
| syscall object_signal |
| (handle: zx_handle_t, clear_mask: uint32_t, set_mask: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Signal an object's peer. |
| #! handle must have ZX_RIGHT_SIGNAL_PEER. |
| syscall object_signal_peer |
| (handle: zx_handle_t, clear_mask: uint32_t, set_mask: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Ask for various properties of various kernel objects. |
| #! handle must have ZX_RIGHT_GET_PROPERTY. |
| #! If property is ZX_PROP_PROCESS_DEBUG_ADDR, handle must be of type ZX_OBJ_TYPE_PROCESS. |
| #! If property is ZX_PROP_PROCESS_VDSO_BASE_ADDRESS, handle must be of type ZX_OBJ_TYPE_PROCESS. |
| #! If property is ZX_PROP_SOCKET_RX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET. |
| #! If property is ZX_PROP_SOCKET_TX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET. |
| syscall object_get_property |
| (handle: zx_handle_t, property: uint32_t, value: any[value_size] OUT, value_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Set various properties of various kernel objects. |
| #! handle must have ZX_RIGHT_SET_PROPERTY. |
| #! If property is ZX_PROP_PROCESS_DEBUG_ADDR, handle must be of type ZX_OBJ_TYPE_PROCESS. |
| # TODO(ZX-2967): TODO(scottmg): Why is the above useful? |
| #! If property is ZX_PROP_SOCKET_RX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET. |
| #! If property is ZX_PROP_SOCKET_TX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET. |
| #! If property is ZX_PROP_JOB_KILL_ON_OOM, handle must be of type ZX_OBJ_TYPE_JOB. |
| syscall object_set_property |
| (handle: zx_handle_t, property: uint32_t, value: any[value_size] IN, value_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Set an object's cookie. |
| # TODO(ZX-2967): TODO(scottmg): None is OK? |
| syscall object_set_cookie |
| (handle: zx_handle_t, scope: zx_handle_t, cookie: uint64_t) |
| returns (zx_status_t); |
| |
| #^ Get an object's cookie. |
| # TODO(ZX-2967): TODO(scottmg): None is OK? |
| syscall object_get_cookie |
| (handle: zx_handle_t, scope: zx_handle_t) |
| returns (zx_status_t, cookie: uint64_t); |
| |
| #^ Query information about an object. |
| #! If topic is ZX_INFO_PROCESS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_PROCESS_THREADS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_ENUMERATE. |
| #! If topic is ZX_INFO_JOB_CHILDREN, handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_ENUMERATE. |
| #! If topic is ZX_INFO_JOB_PROCESSES, handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_ENUMERATE. |
| #! If topic is ZX_INFO_THREAD, handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_THREAD_EXCEPTION_REPORT, handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_THREAD_STATS, handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_TASK_STATS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_PROCESS_MAPS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_PROCESS_VMOS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_VMO, handle must be of type ZX_OBJ_TYPE_VMO. |
| # TODO(ZX-2967), Should this require INSPECT? |
| #! If topic is ZX_INFO_VMAR, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_CPU_STATS, handle must have resource kind ZX_RSRC_KIND_ROOT. |
| #! If topic is ZX_INFO_KMEM_STATS, handle must have resource kind ZX_RSRC_KIND_ROOT. |
| #! If topic is ZX_INFO_RESOURCE, handle must be of type ZX_OBJ_TYPE_RESOURCE and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_HANDLE_COUNT, handle must have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_BTI, handle must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_PROCESS_HANDLE_STATS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT. |
| #! If topic is ZX_INFO_SOCKET, handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_INSPECT. |
| syscall object_get_info |
| (handle: zx_handle_t, topic: uint32_t, buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t, actual: size_t optional, avail: size_t optional); |
| |
| #^ Given a kernel object with children objects, obtain a handle to the child specified by the provided kernel object id. |
| #! handle must have ZX_RIGHT_ENUMERATE. |
| # TODO(ZX-2399): handle rights must be the same or greater than |rights| |
| syscall object_get_child |
| (handle: zx_handle_t, koid: uint64_t, rights: zx_rights_t) |
| returns (zx_status_t, out: zx_handle_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_MANAGE_THREAD. |
| #! profile must be of type ZX_OBJ_TYPE_PROFILE and have ZX_RIGHT_APPLY_PROFILE. |
| syscall object_set_profile |
| (handle: zx_handle_t, profile: zx_handle_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| # IPC: Channels |
| |
| #^ Create a channel. |
| syscall channel_create |
| (options: uint32_t) |
| returns (zx_status_t, out0: zx_handle_t handle_acquire, |
| out1: zx_handle_t handle_acquire); |
| |
| #^ Read a message from a channel. |
| #! handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ. |
| syscall channel_read |
| (handle: zx_handle_t, options: uint32_t, |
| bytes: any[num_bytes] OUT, |
| handles: zx_handle_t[num_handles] OUT, |
| num_bytes: uint32_t, |
| num_handles: uint32_t) |
| returns (zx_status_t, actual_bytes: uint32_t optional, actual_handles: uint32_t optional); |
| |
| #^ Read a message from a channel. |
| #! handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ. |
| syscall channel_read_etc |
| (handle: zx_handle_t, options: uint32_t, |
| bytes: any[num_bytes] OUT, |
| handles: zx_handle_info_t[num_handles] OUT, |
| num_bytes: uint32_t, |
| num_handles: uint32_t) |
| returns (zx_status_t, actual_bytes: uint32_t optional, actual_handles: uint32_t optional); |
| |
| #^ Write a message to a channel. |
| #! handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_WRITE. |
| #! Every entry of handles must have ZX_RIGHT_TRANSFER. |
| syscall channel_write |
| (handle: zx_handle_t, options: uint32_t, |
| bytes: any[num_bytes] IN, num_bytes: uint32_t, |
| handles: zx_handle_t[num_handles] IN, num_handles: uint32_t) |
| returns (zx_status_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE. |
| #! All wr_handles of args must have ZX_RIGHT_TRANSFER. |
| syscall channel_call_noretry internal |
| (handle: zx_handle_t, options: uint32_t, deadline: zx_time_t, |
| args: zx_channel_call_args_t[1] IN) |
| returns (zx_status_t, actual_bytes: uint32_t, actual_handles: uint32_t); |
| |
| syscall channel_call_finish internal |
| (deadline: zx_time_t, args: zx_channel_call_args_t[1] IN) |
| returns (zx_status_t, actual_bytes: uint32_t, actual_handles: uint32_t); |
| |
| #^ Send a message to a channel and await a reply. |
| #! handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE. |
| #! All wr_handles of args must have ZX_RIGHT_TRANSFER. |
| syscall channel_call blocking vdsocall |
| (handle: zx_handle_t, options: uint32_t, deadline: zx_time_t, |
| args: zx_channel_call_args_t[1] IN) |
| returns (zx_status_t, actual_bytes: uint32_t, actual_handles: uint32_t); |
| |
| # IPC: Sockets |
| |
| #^ Create a socket. |
| syscall socket_create |
| (options: uint32_t) |
| returns (zx_status_t, out0: zx_handle_t handle_acquire, |
| out1: zx_handle_t handle_acquire); |
| |
| #^ Write data to a socket. |
| #! handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_WRITE. |
| syscall socket_write |
| (handle: zx_handle_t, options: uint32_t, buffer: any[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t, actual: size_t optional); |
| |
| #^ Read data from a socket. |
| #! handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_READ. |
| syscall socket_read |
| (handle: zx_handle_t, options: uint32_t, buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t, actual: size_t optional); |
| |
| #^ Send another socket object via a socket. |
| #! handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_WRITE. |
| #! socket_to_share must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_TRANSFER. |
| syscall socket_share |
| (handle: zx_handle_t, socket_to_share: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Receive another socket object via a socket. |
| #! handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_READ. |
| syscall socket_accept |
| (handle: zx_handle_t) |
| returns (zx_status_t, out_socket: zx_handle_t handle_acquire); |
| |
| #^ Prevent reading or writing. |
| #! handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_WRITE. |
| syscall socket_shutdown |
| (handle: zx_handle_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| # Threads |
| |
| #^ Terminate the current running thread. |
| syscall thread_exit noreturn (); |
| |
| #^ Create a thread. |
| #! process must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_MANAGE_THREAD. |
| syscall thread_create |
| (process: zx_handle_t, name: char[name_size] IN, name_size: size_t, options: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Start execution on a thread. |
| #! handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_MANAGE_THREAD. |
| syscall thread_start |
| (handle: zx_handle_t, thread_entry: zx_vaddr_t, |
| stack: zx_vaddr_t, arg1: uintptr_t, arg2: uintptr_t) |
| returns (zx_status_t); |
| |
| #^ Read one aspect of thread state. |
| #! handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_READ. |
| syscall thread_read_state |
| (handle: zx_handle_t, kind: uint32_t, buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Write one aspect of thread state. |
| #! handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_WRITE. |
| syscall thread_write_state |
| (handle: zx_handle_t, kind: uint32_t, buffer: any[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| # NOTE: thread_set_priority is an experimental syscall. |
| # Do not use it. It is going away very soon. Just don't do it. This is not |
| # the syscall you are looking for. See ZX-940 |
| syscall thread_set_priority |
| (prio: int32_t) |
| returns (zx_status_t); |
| |
| # Processes |
| |
| #^ Exits the currently running process. |
| syscall process_exit noreturn |
| (retcode: int64_t); |
| |
| #^ Create a new process. |
| #! job must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_MANAGE_PROCESS. |
| # TODO(ZX-2967): job with ZX_RIGHT_WRITE is also accepted. |
| syscall process_create |
| (job: zx_handle_t, name: char[name_size] IN, name_size: size_t, options: uint32_t) |
| returns (zx_status_t, proc_handle: zx_handle_t handle_acquire, |
| vmar_handle: zx_handle_t handle_acquire); |
| |
| #^ Start execution on a process. |
| #! handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE. |
| #! thread must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_WRITE. |
| #! arg1 must have ZX_RIGHT_TRANSFER. |
| syscall process_start |
| (handle: zx_handle_t, thread: zx_handle_t, entry: zx_vaddr_t, |
| stack: zx_vaddr_t, arg1: zx_handle_t handle_release_always, arg2: uintptr_t) |
| returns (zx_status_t); |
| |
| #^ Read from the given process's address space. |
| #! handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE. |
| syscall process_read_memory |
| (handle: zx_handle_t, vaddr: zx_vaddr_t, buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t, actual: size_t); |
| |
| #^ Write into the given process's address space. |
| #! handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE. |
| syscall process_write_memory |
| (handle: zx_handle_t, vaddr: zx_vaddr_t, buffer: any[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t, actual: size_t); |
| |
| # Jobs |
| |
| #^ Create a new job. |
| #! parent_job must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_MANAGE_JOB. |
| # TODO(ZX-2967): parent_job with ZX_RIGHT_WRITE is also accepted. |
| syscall job_create |
| (parent_job: zx_handle_t, options: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Set job security and resource policies. |
| #! handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_SET_POLICY. |
| syscall job_set_policy |
| (handle: zx_handle_t, options: uint32_t, topic: uint32_t, policy: any[count] IN, count: uint32_t) |
| returns (zx_status_t); |
| |
| # Tasks (shared between threads, processes, and jobs) |
| |
| #^ Bind to, or unbind from, the exception port corresponding to a given job, process, or thread. |
| #! port must be of type ZX_OBJ_TYPE_PORT. |
| # TODO(ZX-2967): No rights required on either? |
| syscall task_bind_exception_port |
| (handle: zx_handle_t, port: zx_handle_t, key: uint64_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Suspend the given task. Currently only thread or process handles may be suspended. |
| #! handle must be of type ZX_OBJ_TYPE_THREAD or ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE. |
| syscall task_suspend |
| (handle: zx_handle_t) |
| returns (zx_status_t, token: zx_handle_t handle_acquire); |
| |
| #^ Suspend the given task. Currently only thread or process handles may be suspended. |
| #! handle must be of type ZX_OBJ_TYPE_THREAD or ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE. |
| syscall task_suspend_token |
| (handle: zx_handle_t) |
| returns (zx_status_t, token: zx_handle_t handle_acquire); |
| |
| #^ Resume the given task after an exception has been reported. |
| #! handle must be of type ZX_OBJ_TYPE_THREAD. |
| #! port must be of type ZX_OBJ_TYPE_PORT. |
| # TODO(ZX-2967): No rights required on either? |
| syscall task_resume_from_exception |
| (handle: zx_handle_t, port: zx_handle_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Kill the provided task (job, process, or thread). |
| #! handle must have ZX_RIGHT_DESTROY. |
| syscall task_kill |
| (handle: zx_handle_t) |
| returns (zx_status_t); |
| |
| # Synchronization |
| |
| #^ Create an event. |
| syscall event_create |
| (options: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Create an event pair. |
| syscall eventpair_create |
| (options: uint32_t) |
| returns (zx_status_t, |
| out0: zx_handle_t handle_acquire, out1: zx_handle_t handle_acquire); |
| |
| #^ Wait on a futex. |
| #! None. |
| syscall futex_wait blocking |
| (value_ptr: zx_futex_t[1] IN, current_value: zx_futex_t, new_futex_owner: zx_handle_t, |
| deadline: zx_time_t) |
| returns (zx_status_t); |
| |
| #^ Wake some number of threads waiting on a futex, optionally transferring ownership to the thread which was woken in the process. |
| #! None. |
| syscall futex_wake |
| (value_ptr: zx_futex_t[1] IN, wake_count: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Wake some number of threads waiting on a futex, and move more waiters to another wait queue. |
| #! None. |
| syscall futex_requeue |
| (value_ptr: zx_futex_t[1] IN, wake_count: uint32_t, current_value: zx_futex_t, |
| requeue_ptr: zx_futex_t[1] IN, requeue_count: uint32_t, new_requeue_owner: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Wake some number of threads waiting on a futex, optionally transferring ownership to the thread which was woken in the process. |
| #! None. |
| syscall futex_wake_single_owner |
| (value_ptr: zx_futex_t[1] IN) |
| returns (zx_status_t); |
| |
| #^ Wake some number of threads waiting on a futex, and move more waiters to another wait queue. |
| #! None. |
| syscall futex_requeue_single_owner |
| (value_ptr: zx_futex_t[1] IN, current_value: zx_futex_t, |
| requeue_ptr: zx_futex_t[1] IN, requeue_count: uint32_t, new_requeue_owner: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Fetch the koid current owner of a futex, if any. |
| #! None. |
| syscall futex_get_owner |
| (value_ptr: zx_futex_t[1] IN, koid: zx_koid_t[1] OUT) |
| returns (zx_status_t); |
| |
| #! None. |
| syscall futex_wait_deprecated blocking |
| (value_ptr: zx_futex_t[1] IN, current_value: int32_t, deadline: zx_time_t) |
| returns (zx_status_t); |
| |
| #! None. |
| syscall futex_requeue_deprecated |
| (wake_ptr: zx_futex_t[1] IN, wake_count: uint32_t, current_value: int32_t, |
| requeue_ptr: zx_futex_t[1] IN, requeue_count: uint32_t) |
| returns (zx_status_t); |
| |
| # Ports |
| |
| #^ Create an IO port. |
| syscall port_create |
| (options: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Queue a packet to an port. |
| #! handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| syscall port_queue |
| (handle: zx_handle_t, packet: zx_port_packet_t[1] IN) |
| returns (zx_status_t); |
| |
| #^ Wait for a packet arrival in a port. |
| #! handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_READ. |
| syscall port_wait blocking |
| (handle: zx_handle_t, deadline: zx_time_t, packet: zx_port_packet_t[1] OUT) |
| returns (zx_status_t); |
| |
| #^ Cancels async port notifications on an object. |
| #! handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| syscall port_cancel |
| (handle: zx_handle_t, source: zx_handle_t, key: uint64_t) |
| returns (zx_status_t); |
| |
| # Timers |
| |
| #^ Create a timer. |
| syscall timer_create |
| (options: uint32_t, clock_id: zx_clock_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Start a timer. |
| #! handle must be of type ZX_OBJ_TYPE_TIMER and have ZX_RIGHT_WRITE. |
| syscall timer_set |
| (handle: zx_handle_t, deadline: zx_time_t, slack: zx_duration_t) |
| returns (zx_status_t); |
| |
| #^ Cancel a timer. |
| #! handle must be of type ZX_OBJ_TYPE_TIMER and have ZX_RIGHT_WRITE. |
| syscall timer_cancel |
| (handle: zx_handle_t) |
| returns (zx_status_t); |
| |
| # Memory management |
| |
| #^ Create a VM object. |
| syscall vmo_create |
| (size: uint64_t, options: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Read bytes from the VMO. |
| #! handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| syscall vmo_read |
| (handle: zx_handle_t, buffer: any[buffer_size] OUT, offset: uint64_t, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Write bytes to the VMO. |
| #! handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE. |
| syscall vmo_write |
| (handle: zx_handle_t, buffer: any[buffer_size] IN, offset: uint64_t, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Read the current size of a VMO object. |
| # TODO(ZX-2967): No rights required? |
| syscall vmo_get_size |
| (handle: zx_handle_t) |
| returns (zx_status_t, size: uint64_t); |
| |
| #^ Resize a VMO object. |
| #! handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE. |
| syscall vmo_set_size |
| (handle: zx_handle_t, size: uint64_t) |
| returns (zx_status_t); |
| |
| #^ Perform an operation on a range of a VMO. |
| #! If op is ZX_VMO_OP_COMMIT, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE. |
| #! If op is ZX_VMO_OP_DECOMMIT, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE. |
| #! If op is ZX_VMO_OP_CACHE_SYNC, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| #! If op is ZX_VMO_OP_CACHE_INVALIDATE, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE. |
| #! If op is ZX_VMO_OP_CACHE_CLEAN, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| #! If op is ZX_VMO_OP_CACHE_CLEAN_INVALIDATE, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| syscall vmo_op_range |
| (handle: zx_handle_t, op: uint32_t, offset: uint64_t, size: uint64_t, |
| buffer: any[buffer_size] INOUT, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Create a clone of a VM Object. |
| #! handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_DUPLICATE and have ZX_RIGHT_READ. |
| syscall vmo_clone |
| (handle: zx_handle_t, options: uint32_t, offset: uint64_t, size: uint64_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Set the caching policy for pages held by a VMO. |
| #! handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_MAP. |
| syscall vmo_set_cache_policy |
| (handle: zx_handle_t, cache_policy: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Add execute rights to a VMO. |
| #! handle must be of type ZX_OBJ_TYPE_VMO. |
| # TODO(ZX-2967): handle: No rights required, ZX_RIGHT_EXECUTE added to dup out |
| #! vmex must have resource kind ZX_RSRC_KIND_VMEX. |
| # TODO(ZX-2967): vmex == ZX_HANDLE_INVALID also accepted. |
| syscall vmo_replace_as_executable |
| (handle: zx_handle_t handle_release_always, vmex: zx_handle_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| # Address space management |
| |
| # TODO(davemoore): Updating vmar apis: zx-2264. Remove when no calls remain. |
| # TODO(ZX-2967): Remove? |
| syscall vmar_allocate_old |
| (parent_vmar: zx_handle_t, offset: uint64_t, size: uint64_t, map_flags: uint32_t) |
| returns (zx_status_t, |
| child_vmar: zx_handle_t handle_acquire, child_addr: zx_vaddr_t); |
| |
| # TODO(ZX-2967): Remove? |
| syscall vmar_map_old |
| (handle: zx_handle_t, vmar_offset: uint64_t, |
| vmo: zx_handle_t, vmo_offset: uint64_t, |
| len: uint64_t, map_flags: uint32_t) |
| returns (zx_status_t, mapped_addr: zx_vaddr_t); |
| |
| # TODO(ZX-2967): Remove? |
| syscall vmar_protect_old |
| (handle: zx_handle_t, addr: zx_vaddr_t, len: uint64_t, prot_flags: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Allocate a new subregion. |
| #! If options & ZX_VM_CAN_MAP_READ, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_READ. |
| #! If options & ZX_VM_CAN_MAP_WRITE, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_WRITE. |
| #! If options & ZX_VM_CAN_MAP_EXECUTE, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_EXECUTE. |
| syscall vmar_allocate |
| (parent_vmar: zx_handle_t, options: zx_vm_option_t, offset: uint64_t, size: uint64_t) |
| returns (zx_status_t, |
| child_vmar: zx_handle_t handle_acquire, child_addr: zx_vaddr_t); |
| |
| #^ Destroy a virtual memory address region. |
| # TODO(ZX-2967): handle No rights required? |
| syscall vmar_destroy |
| (handle: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Add a memory mapping. |
| #! handle must be of type ZX_OBJ_TYPE_VMAR. |
| #! vmo must be of type ZX_OBJ_TYPE_VMO. |
| # TODO(ZX-2399): TODO handle and vmo and options must all match, and options can't specify them. |
| syscall vmar_map |
| (handle: zx_handle_t, options: zx_vm_option_t, vmar_offset: uint64_t, |
| vmo: zx_handle_t, vmo_offset: uint64_t, |
| len: uint64_t) |
| returns (zx_status_t, mapped_addr: zx_vaddr_t); |
| |
| #^ Unmap virtual memory pages. |
| # TODO(ZX-2967): handle No rights required? |
| syscall vmar_unmap |
| (handle: zx_handle_t, addr: zx_vaddr_t, len: uint64_t) |
| returns (zx_status_t); |
| |
| #^ Set protection of virtual memory pages. |
| #! If options & ZX_VM_PERM_READ, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_READ. |
| #! If options & ZX_VM_PERM_WRITE, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_WRITE. |
| #! If options & ZX_VM_PERM_EXECUTE, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_EXECUTE. |
| syscall vmar_protect |
| (handle: zx_handle_t, options: zx_vm_option_t, addr: zx_vaddr_t, len: uint64_t) |
| returns (zx_status_t); |
| |
| # Random Number generator |
| |
| syscall cprng_draw_once internal |
| (buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Draw from the kernel's CPRNG. |
| syscall cprng_draw vdsocall |
| (buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (); |
| |
| #^ Add entropy to the kernel CPRNG. |
| syscall cprng_add_entropy |
| (buffer: any[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| # IPC: Fifos |
| |
| #^ Create a fifo. |
| syscall fifo_create |
| (elem_count: size_t, elem_size: size_t, options: uint32_t) |
| returns (zx_status_t, |
| out0: zx_handle_t handle_acquire, out1: zx_handle_t handle_acquire); |
| |
| #^ Read data from a fifo. |
| #! handle must be of type ZX_OBJ_TYPE_FIFO and have ZX_RIGHT_READ. |
| syscall fifo_read |
| (handle: zx_handle_t, elem_size: size_t, data: any[count * elem_size] OUT, count: size_t) |
| returns (zx_status_t, actual_count: size_t optional); |
| |
| #^ Write data to a fifo. |
| #! handle must be of type ZX_OBJ_TYPE_FIFO and have ZX_RIGHT_WRITE. |
| syscall fifo_write |
| (handle: zx_handle_t, elem_size: size_t, data: any[count * elem_size] IN, count: size_t) |
| returns (zx_status_t, actual_count: size_t optional); |
| |
| # Profiles |
| |
| #! root_job must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_MANAGE_PROCESS. |
| syscall profile_create |
| (root_job: zx_handle_t, profile: zx_profile_info_t[1] IN) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| # Multi-function |
| |
| #^ Unmap memory, close handle, exit. |
| # TODO(ZX-2399): ??? |
| syscall vmar_unmap_handle_close_thread_exit vdsocall |
| (vmar_handle: zx_handle_t, addr: zx_vaddr_t, size: size_t, close_handle: zx_handle_t handle_release) |
| returns (zx_status_t); |
| |
| #^ Write to futex, wake futex, close handle, exit. |
| # TODO(ZX-2399): ??? |
| syscall futex_wake_handle_close_thread_exit vdsocall noreturn |
| (value_ptr: zx_futex_t[1] IN, wake_count: uint32_t, new_value: int32_t, |
| close_handle: zx_handle_t handle_release); |
| |
| # Logging |
| |
| # TODO(ZX-2967): handle == ZX_HANDLE_INVALID accepted. |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall debuglog_create |
| (resource: zx_handle_t, options: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #! handle must be of type ZX_OBJ_TYPE_LOG and have ZX_RIGHT_WRITE. |
| syscall debuglog_write |
| (handle: zx_handle_t, options: uint32_t, buffer: any[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_LOG and have ZX_RIGHT_READ. |
| syscall debuglog_read |
| (handle: zx_handle_t, options: uint32_t, buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| # Tracing |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall ktrace_read |
| (handle: zx_handle_t, data: any[data_size] OUT, offset: uint32_t, data_size: size_t) |
| returns (zx_status_t, actual: size_t); |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall ktrace_control |
| (handle: zx_handle_t, action: uint32_t, options: uint32_t, ptr: any[action] INOUT) |
| returns (zx_status_t); |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall ktrace_write |
| (handle: zx_handle_t, id: uint32_t, arg0: uint32_t, arg1: uint32_t) |
| returns (zx_status_t); |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall mtrace_control |
| (handle: zx_handle_t, |
| kind: uint32_t, action: uint32_t, options: uint32_t, |
| ptr: any[ptr_size] INOUT, ptr_size: size_t) |
| returns (zx_status_t); |
| |
| # Legacy LK debug syscalls |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall debug_read |
| (handle: zx_handle_t, buffer: char[buffer_size] OUT, buffer_size: size_t[1] INOUT) |
| returns (zx_status_t); |
| |
| syscall debug_write |
| (buffer: char[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall debug_send_command |
| (resource: zx_handle_t, buffer: char[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| # DDK Syscalls: Interrupts |
| |
| #^ Create an interrupt object. |
| #! src_obj must have resource kind ZX_RSRC_KIND_IRQ. |
| syscall interrupt_create |
| (src_obj: zx_handle_t, src_num: uint32_t, options: uint32_t) |
| returns (zx_status_t, out_handle: zx_handle_t); |
| |
| #^ Bind an interrupt object to a port. |
| #! handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_READ. |
| #! port_handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| syscall interrupt_bind |
| (handle: zx_handle_t, port_handle: zx_handle_t, key: uint64_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Wait for an interrupt. |
| #! handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_WAIT. |
| syscall interrupt_wait blocking |
| (handle: zx_handle_t) |
| returns (zx_status_t, out_timestamp: zx_time_t optional); |
| |
| #^ Destroys an interrupt object. |
| # TODO(ZX-2967): No DESTROY rights here. |
| syscall interrupt_destroy |
| (handle: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Acknowledge an interrupt and re-arm it. |
| #! handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_WRITE. |
| syscall interrupt_ack |
| (handle: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Triggers a virtual interrupt object. |
| #! handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_SIGNAL. |
| syscall interrupt_trigger |
| (handle: zx_handle_t, options: uint32_t, timestamp: zx_time_t) |
| returns (zx_status_t); |
| |
| #^ Bind an interrupt object to a VCPU. |
| #! handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_READ. |
| #! vcpu must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_WRITE. |
| syscall interrupt_bind_vcpu |
| (handle: zx_handle_t, vcpu: zx_handle_t, options: uint32_t) |
| returns (zx_status_t); |
| |
| # DDK Syscalls: MMIO and IoPorts |
| |
| #! resource must have resource kind ZX_RSRC_KIND_IOPORT. |
| syscall ioports_request |
| (resource: zx_handle_t, io_addr: uint16_t, len: uint32_t) |
| returns (zx_status_t); |
| |
| #! bti must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_MAP. |
| syscall vmo_create_contiguous |
| (bti: zx_handle_t, size: size_t, alignment_log2: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Create a VM object referring to a specific contiguous range of physical memory. |
| #! resource must have resource kind ZX_RSRC_KIND_MMIO. |
| syscall vmo_create_physical |
| (resource: zx_handle_t, paddr: zx_paddr_t, size: size_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| # DDK Syscalls: Device Memory Access |
| |
| #^ Create a new IOMMU object in the kernel. |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall iommu_create |
| (resource: zx_handle_t, type: uint32_t, desc: any[desc_size] IN, desc_size: size_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Create a new bus transaction initiator. |
| #! iommu must be of type ZX_OBJ_TYPE_IOMMU and have ZX_RIGHT_NONE. |
| # TODO(ZX-2967): This is unusual. |
| syscall bti_create |
| (iommu: zx_handle_t, options: uint32_t, bti_id: uint64_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Pin pages and grant devices access to them. |
| #! handle must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_MAP. |
| #! vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_MAP. |
| #! If options & ZX_BTI_PERM_READ, vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| #! If options & ZX_BTI_PERM_WRITE, vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE. |
| # READ is intentional in the following EXECUTE condition. |
| #! If options & ZX_BTI_PERM_EXECUTE, vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| syscall bti_pin |
| (handle: zx_handle_t, options: uint32_t, vmo: zx_handle_t, offset: uint64_t, size: uint64_t, |
| addrs: zx_paddr_t[addrs_count] OUT, addrs_count: size_t) |
| returns (zx_status_t, pmt: zx_handle_t handle_acquire); |
| |
| #^ Releases all quarantined PMTs. |
| #! handle must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_WRITE. |
| syscall bti_release_quarantine |
| (handle: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Unpin pages and revoke device access to them. |
| # TODO(ZX-2967): handle ZX_OBJ_TYPE_PMT; No rights required? |
| syscall pmt_unpin |
| (handle: zx_handle_t handle_release_always) |
| returns (zx_status_t); |
| |
| # DDK Syscalls: Misc Info |
| |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall framebuffer_get_info |
| (resource: zx_handle_t) |
| returns (zx_status_t, format: uint32_t, width: uint32_t, height: uint32_t, stride: uint32_t); |
| |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| # TODO(ZX-2967): vmo ZX_OBJ_TYPE_VMO; No rights required? |
| syscall framebuffer_set_range |
| (resource: zx_handle_t, vmo: zx_handle_t, len: uint32_t, format: uint32_t, |
| width: uint32_t, height: uint32_t, stride: uint32_t) |
| returns (zx_status_t); |
| |
| # DDK Syscalls: PCI |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall pci_get_nth_device |
| (handle: zx_handle_t, index: uint32_t) |
| returns (zx_status_t, out_info: zx_pcie_device_info_t, out_handle: zx_handle_t handle_acquire); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_WRITE. |
| syscall pci_enable_bus_master |
| (handle: zx_handle_t, enable: bool) |
| returns (zx_status_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_WRITE. |
| syscall pci_reset_device |
| (handle: zx_handle_t) |
| returns (zx_status_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE. |
| syscall pci_config_read |
| (handle: zx_handle_t, offset: uint16_t, width: size_t, out_val: uint32_t[1] OUT) |
| returns (zx_status_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE. |
| syscall pci_config_write |
| (handle: zx_handle_t, offset: uint16_t, width: size_t, val: uint32_t) |
| returns (zx_status_t); |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall pci_cfg_pio_rw |
| (handle: zx_handle_t, bus: uint8_t, dev: uint8_t, func: uint8_t, offset: uint8_t, |
| val: uint32_t[1] INOUT, width: size_t, write: bool) |
| returns (zx_status_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE. |
| syscall pci_get_bar |
| (handle: zx_handle_t, bar_num: uint32_t, out_bar: zx_pci_bar_t[1] OUT) |
| returns (zx_status_t, out_handle: zx_handle_t handle_acquire); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ. |
| syscall pci_map_interrupt |
| (handle: zx_handle_t, which_irq: int32_t) |
| returns (zx_status_t, out_handle: zx_handle_t handle_acquire); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ. |
| syscall pci_query_irq_mode |
| (handle: zx_handle_t, mode: uint32_t) |
| returns (zx_status_t, out_max_irqs: uint32_t); |
| |
| #! handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_WRITE. |
| syscall pci_set_irq_mode |
| (handle: zx_handle_t, mode: uint32_t, requested_irq_count: uint32_t) |
| returns (zx_status_t); |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall pci_init |
| (handle: zx_handle_t, init_buf: zx_pci_init_arg_t[len] IN, len: uint32_t) |
| returns (zx_status_t); |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall pci_add_subtract_io_range |
| (handle: zx_handle_t, mmio: bool, base: uint64_t, len: uint64_t, add: bool) |
| returns (zx_status_t); |
| |
| # DDK Syscalls: ACPI Glue |
| |
| #! handle must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall pc_firmware_tables |
| (handle: zx_handle_t) |
| returns (zx_status_t, acpi_rsdp: zx_paddr_t, smbios: zx_paddr_t); |
| |
| # DDK Syscalls: SMC Calls |
| |
| #^ Make Secure Monitor Call (SMC) from user space. |
| # TODO(ZX-2967): handle No rights required? |
| syscall smc_call |
| (handle: zx_handle_t, parameters: zx_smc_parameters_t[1] IN) |
| returns (zx_status_t, out_smc_result: zx_smc_result_t OUT); |
| |
| # Resources |
| |
| #^ Create a resource object. |
| #! parent_rsrc must be of type ZX_OBJ_TYPE_RESOURCE and have ZX_RIGHT_WRITE. |
| syscall resource_create |
| (parent_rsrc: zx_handle_t, options: uint32_t, base: uint64_t, size: size_t, |
| name: char[name_size] IN, name_size: size_t) |
| returns (zx_status_t, resource_out: zx_handle_t handle_acquire); |
| |
| # Hypervisor |
| |
| #^ Create a guest. |
| #! resource must have resource kind ZX_RSRC_KIND_HYPERVISOR. |
| syscall guest_create |
| (resource: zx_handle_t, options: uint32_t) |
| returns (zx_status_t, guest_handle: zx_handle_t handle_acquire, |
| vmar_handle: zx_handle_t handle_acquire); |
| |
| #^ Sets a trap within a guest. |
| #! handle must be of type ZX_OBJ_TYPE_GUEST and have ZX_RIGHT_WRITE. |
| #! port_handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| syscall guest_set_trap |
| (handle: zx_handle_t, kind: uint32_t, addr: zx_vaddr_t, size: size_t, port_handle: zx_handle_t, |
| key: uint64_t) |
| returns (zx_status_t); |
| |
| #^ Create a VCPU. |
| #! guest must be of type ZX_OBJ_TYPE_GUEST and have ZX_RIGHT_MANAGE_PROCESS. |
| syscall vcpu_create |
| (guest: zx_handle_t, options: uint32_t, entry: zx_vaddr_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Resume execution of a VCPU. |
| #! handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_EXECUTE. |
| syscall vcpu_resume blocking |
| (handle: zx_handle_t) |
| returns (zx_status_t, packet: zx_port_packet_t OUT); |
| |
| #^ Raise an interrupt on a VCPU. |
| #! handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_SIGNAL. |
| syscall vcpu_interrupt |
| (handle: zx_handle_t, vector: uint32_t) |
| returns (zx_status_t); |
| |
| #^ Read the state of a VCPU. |
| #! handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_READ. |
| syscall vcpu_read_state |
| (handle: zx_handle_t, kind: uint32_t, buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #^ Write the state of a VCPU. |
| #! handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_WRITE. |
| syscall vcpu_write_state |
| (handle: zx_handle_t, kind: uint32_t, buffer: any[buffer_size] IN, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| # System Control |
| |
| #^ Soft reboot the system with a new kernel and bootimage. |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| #! kernel_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| #! bootimage_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ. |
| syscall system_mexec |
| (resource: zx_handle_t, kernel_vmo: zx_handle_t, bootimage_vmo: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Return a ZBI containing ZBI entries necessary to boot this system. |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall system_mexec_payload_get |
| (resource: zx_handle_t, buffer: any[buffer_size] OUT, buffer_size: size_t) |
| returns (zx_status_t); |
| |
| #! resource must have resource kind ZX_RSRC_KIND_ROOT. |
| syscall system_powerctl |
| (resource: zx_handle_t, cmd: uint32_t, arg: zx_system_powerctl_arg_t[1] IN) |
| returns (zx_status_t); |
| |
| # User pager |
| |
| #^ Create a new pager object. |
| #! None. |
| syscall pager_create |
| (options: uint32_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Create a pager owned vmo. |
| #! pager must be of type ZX_OBJ_TYPE_PAGER. |
| #! port must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| syscall pager_create_vmo |
| (pager: zx_handle_t, options: uint32_t, port: zx_handle_t, key: uint64_t, size: uint64_t) |
| returns (zx_status_t, out: zx_handle_t handle_acquire); |
| |
| #^ Detaches a vmo from a pager. |
| #! pager must be of type ZX_OBJ_TYPE_PAGER. |
| #! vmo must be of type ZX_OBJ_TYPE_VMO. |
| syscall pager_detach_vmo |
| (pager: zx_handle_t, vmo: zx_handle_t) |
| returns (zx_status_t); |
| |
| #^ Supply pages into a pager owned vmo. |
| #! pager must be of type ZX_OBJ_TYPE_PAGER. |
| #! pager_vmo must be of type ZX_OBJ_TYPE_VMO. |
| #! aux_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE. |
| syscall pager_supply_pages |
| (pager: zx_handle_t, pager_vmo: zx_handle_t, offset: uint64_t, length: uint64_t, aux_vmo: zx_handle_t, aux_offset : uint64_t) |
| returns (zx_status_t); |
| |
| # Test syscalls (keep at the end) |
| |
| syscall syscall_test_0() returns (zx_status_t); |
| syscall syscall_test_1 test_category1 (a:int) returns (zx_status_t); |
| syscall syscall_test_2 test_category1 (a:int, b:int) returns (zx_status_t); |
| syscall syscall_test_3 test_category2 (a:int, b:int, c:int) returns (zx_status_t); |
| syscall syscall_test_4(a:int, b:int, c:int, d:int) returns (zx_status_t); |
| syscall syscall_test_5(a:int, b:int, c:int, d:int, e:int) returns (zx_status_t); |
| syscall syscall_test_6(a:int, b:int, c:int, d:int, e:int, f:int) returns (zx_status_t); |
| syscall syscall_test_7(a:int, b:int, c:int, d:int, e:int, f:int, g:int) returns (zx_status_t); |
| syscall syscall_test_8(a:int, b:int, c:int, d:int, e:int, f:int, g:int, h:int) returns (zx_status_t); |
| syscall syscall_test_wrapper(a:int, b:int, c:int) returns (zx_status_t); |