| // Copyright 2019 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. |
| |
| library syscalls; |
| |
| using zx; |
| |
| // |
| // |
| // TODO(banjo): [extern] struct is a temporary situation; eventually the |
| // canonical location will be here. These are currently defined amongst various |
| // handwritten Zircon .h files. |
| // |
| // |
| |
| [extern] |
| struct zx_wait_item_t {}; |
| |
| [extern] |
| struct zx_handle_disposition_t {}; |
| |
| [extern] |
| struct zx_handle_info_t {}; |
| |
| [extern] |
| struct zx_channel_call_args_t {}; |
| |
| [extern] |
| struct zx_port_packet_t {}; |
| |
| [extern] |
| struct zx_profile_scheduler_t {}; |
| |
| [extern] |
| struct zx_profile_info_t {}; |
| |
| [extern] |
| struct zx_pcie_device_info_t {}; |
| |
| [extern] |
| struct zx_pci_bar_t {}; |
| |
| [extern] |
| struct zx_pci_init_arg_t {}; |
| |
| [extern] |
| struct zx_smc_parameters_t {}; |
| |
| [extern] |
| struct zx_smc_result_t {}; |
| |
| [extern] |
| struct zx_system_powerctl_arg_t {}; |
| |
| // TODO(banjo): These are here to make the front end happy, but the abigen |
| // backend special cases them to keep their original name, and make them just |
| // passed "by value" as basic types. |
| [extern] struct uintptr_t {}; |
| [extern] struct zx_futex_t {}; |
| |
| protocol Api { |
| |
| // |
| // |
| // Time |
| // |
| // |
| |
| /// Acquire the current time. |
| clock_get(zx.clock clock_id) -> (zx.time time); |
| |
| /// Acquire the current time. |
| clock_get_new(zx.clock clock_id) -> (zx.status status, zx.time out); |
| |
| /// Acquire the current monotonic time. |
| clock_get_monotonic() -> (zx.time time); |
| |
| /// High resolution sleep. |
| [rights="None.", |
| blocking] |
| nanosleep(zx.time deadline) -> (zx.status status); |
| |
| /// Read the number of high-precision timer ticks since boot. |
| [vdsocall] |
| ticks_get() -> (zx.ticks ticks); |
| |
| /// Read the number of high-precision timer ticks in a second. |
| [vdsocall, |
| const] |
| ticks_per_second() -> (zx.ticks ticks); |
| |
| /// Convert a time relative to now to an absolute deadline. |
| [vdsocall] |
| deadline_after(zx.duration nanoseconds) -> (zx.time time); |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT."] |
| clock_adjust(handle<resource> handle, zx.clock clock_id, int64 offset) -> (zx.status status); |
| |
| // |
| // |
| // System information |
| // |
| // |
| |
| [vdsocall, |
| const] |
| system_get_dcache_line_size() -> (uint32 size); |
| |
| /// Get number of logical processors on the system. |
| [vdsocall, |
| const] |
| system_get_num_cpus() -> (uint32 count); |
| |
| /// Get version string for system. |
| [vdsocall, |
| argtype="version OUT"] |
| system_get_version(string:version_size version, usize version_size) -> |
| (zx.status status); |
| |
| /// Get amount of physical memory on the system. |
| [vdsocall] |
| system_get_physmem() -> (uint64 physmem); |
| |
| /// Get supported hardware capabilities. |
| [vdsocall, |
| argtype="features features"] |
| system_get_features(uint32 kind) -> (zx.status status, uint32 features); |
| |
| // |
| // |
| // Abstraction of machine operations |
| // |
| // |
| |
| /// Flush CPU data and/or instruction caches. |
| [vdsocall, |
| argtype="addr IN"] |
| cache_flush(array<voidptr>:size addr, usize size, uint32 options) -> (zx.status status); |
| |
| // |
| // |
| // Generic handle operations |
| // |
| // |
| |
| /// Close a handle. |
| [rights="None.", |
| argtype="handle handle_release_always"] |
| handle_close(handle handle) -> (zx.status status); |
| |
| /// Close a number of handles. |
| [rights="None.", |
| argtype="handles IN"] |
| handle_close_many(array<handle>:num_handles handles, usize num_handles) -> (zx.status status); |
| |
| /// Duplicate a handle. |
| [rights="handle must have ZX_RIGHT_DUPLICATE.", |
| argtype="out handle_acquire"] |
| handle_duplicate(handle handle, zx.rights rights) -> (zx.status status, handle out); |
| |
| /// Replace a handle. |
| [rights="None.", |
| argtype="handle handle_release_always", |
| argtype="out handle_acquire"] |
| handle_replace(handle handle, zx.rights rights) -> (zx.status status, handle out); |
| |
| // |
| // |
| // Generic object operations |
| // |
| // |
| /// Wait for signals on an object. |
| [rights="handle must have ZX_RIGHT_WAIT.", |
| blocking, |
| argtype="observed optional"] |
| object_wait_one(handle handle, zx.signals signals, zx.time deadline) -> |
| (zx.status status, zx.signals observed); |
| |
| /// Wait for signals on multiple objects. |
| [rights="Every entry of items must have a handle field with ZX_RIGHT_WAIT.", |
| blocking, |
| argtype="items INOUT"] |
| object_wait_many(array<zx_wait_item_t>:count items, usize count, zx.time deadline) -> |
| (zx.status status); |
| |
| /// Subscribe for signals on an object. |
| [rights="handle must have ZX_RIGHT_WAIT.", |
| rights="port must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE."] |
| object_wait_async(handle handle, handle<port> port, uint64 key, |
| zx.signals signals, uint32 options) -> |
| (zx.status status); |
| |
| /// Signal an object. |
| [rights="handle must have ZX_RIGHT_SIGNAL."] |
| object_signal(handle handle, uint32 clear_mask, uint32 set_mask) -> (zx.status status); |
| |
| /// Signal an object's peer. |
| [rights="handle must have ZX_RIGHT_SIGNAL_PEER."] |
| object_signal_peer(handle handle, uint32 clear_mask, uint32 set_mask) -> (zx.status status); |
| |
| /// Ask for various properties of various kernel objects. |
| [rights="handle must have ZX_RIGHT_GET_PROPERTY.", |
| rights="If property is ZX_PROP_PROCESS_DEBUG_ADDR, handle must be of type ZX_OBJ_TYPE_PROCESS.", |
| rights="If property is ZX_PROP_PROCESS_VDSO_BASE_ADDRESS, handle must be of type ZX_OBJ_TYPE_PROCESS.", |
| rights="If property is ZX_PROP_SOCKET_RX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET.", |
| rights="If property is ZX_PROP_SOCKET_TX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET.", |
| argtype="value OUT"] |
| object_get_property(handle handle, uint32 property, |
| array<voidptr>:value_size value, usize value_size) -> |
| (zx.status status); |
| |
| /// Set various properties of various kernel objects. |
| [rights="handle must have ZX_RIGHT_SET_PROPERTY.", |
| rights="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? |
| rights="If property is ZX_PROP_SOCKET_RX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET.", |
| rights="If property is ZX_PROP_SOCKET_TX_THRESHOLD, handle must be of type ZX_OBJ_TYPE_SOCKET.", |
| rights="If property is ZX_PROP_JOB_KILL_ON_OOM, handle must be of type ZX_OBJ_TYPE_JOB.", |
| argtype="value IN"] |
| object_set_property(handle handle, uint32 property, |
| array<voidptr>:value_size value, usize value_size) -> |
| (zx.status status); |
| |
| /// Query information about an object. |
| [rights="If topic is ZX_INFO_PROCESS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_JOB, handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_PROCESS_THREADS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_ENUMERATE.", |
| rights="If topic is ZX_INFO_JOB_CHILDREN, handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_ENUMERATE.", |
| rights="If topic is ZX_INFO_JOB_PROCESSES, handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_ENUMERATE.", |
| rights="If topic is ZX_INFO_THREAD, handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_THREAD_EXCEPTION_REPORT, handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_THREAD_STATS, handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_TASK_STATS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_PROCESS_MAPS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_PROCESS_VMOS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_VMO, handle must be of type ZX_OBJ_TYPE_VMO.", |
| // TODO(ZX-2967), Should this require INSPECT? |
| rights="If topic is ZX_INFO_VMAR, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_CPU_STATS, handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| rights="If topic is ZX_INFO_KMEM_STATS, handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| rights="If topic is ZX_INFO_RESOURCE, handle must be of type ZX_OBJ_TYPE_RESOURCE and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_HANDLE_COUNT, handle must have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_BTI, handle must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_PROCESS_HANDLE_STATS, handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_INSPECT.", |
| rights="If topic is ZX_INFO_SOCKET, handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_INSPECT.", |
| argtype="buffer OUT", |
| argtype="actual optional", |
| argtype="avail optional"] |
| object_get_info(handle handle, uint32 topic, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status, usize actual, usize avail); |
| |
| /// Given a kernel object with children objects, obtain a handle to the child specified by the provided kernel object id. |
| [rights="handle must have ZX_RIGHT_ENUMERATE."] |
| // TODO(ZX-2399): handle rights must be the same or greater than |rights| |
| object_get_child(handle handle, uint64 koid, zx.rights rights) -> |
| (zx.status status, handle out); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_MANAGE_THREAD.", |
| rights="profile must be of type ZX_OBJ_TYPE_PROFILE and have ZX_RIGHT_APPLY_PROFILE."] |
| object_set_profile(handle handle, handle profile, uint32 options) -> (zx.status status); |
| |
| // |
| // |
| // IPC: Channels |
| // |
| // |
| |
| /// Create a channel. |
| [argtype="out0 handle_acquire", |
| argtype="out1 handle_acquire"] |
| channel_create(uint32 options) -> (zx.status status, handle out0, handle out1); |
| |
| /// Read a message from a channel. |
| [rights="handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ.", |
| argtype="bytes OUT", |
| argtype="handles OUT", |
| argtype="actual_bytes optional", |
| argtype="actual_handles optional"] |
| channel_read(handle handle, uint32 options, |
| array<voidptr>:num_bytes bytes, |
| array<handle>:num_handles handles, |
| uint32 num_bytes, |
| uint32 num_handles) -> |
| (zx.status status, uint32 actual_bytes, uint32 actual_handles); |
| |
| /// Read a message from a channel. |
| [rights="handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ.", |
| argtype="bytes OUT", |
| argtype="handles OUT", |
| argtype="actual_bytes optional", |
| argtype="actual_handles optional"] |
| channel_read_etc(handle handle, uint32 options, |
| array<voidptr>:num_bytes bytes, |
| array<zx_handle_info_t>:num_handles handles, |
| uint32 num_bytes, |
| uint32 num_handles) -> |
| (zx.status status, uint32 actual_bytes, uint32 actual_handles); |
| |
| /// Write a message to a channel. |
| [rights="handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_WRITE.", |
| rights="Every entry of handles must have ZX_RIGHT_TRANSFER.", |
| argtype="bytes IN", |
| argtype="handles IN"] |
| channel_write(handle handle, uint32 options, |
| array<voidptr>:num_bytes bytes, uint32 num_bytes, |
| array<handle>:num_handles handles, uint32 num_handles) -> |
| (zx.status status); |
| |
| /// Write a message to a channel. |
| [rights="handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_WRITE.", |
| rights="Every entry of handles must have ZX_RIGHT_TRANSFER.", |
| argtype="bytes IN", |
| argtype="handles INOUT"] |
| channel_write_etc(handle handle, uint32 options, |
| array<voidptr>:num_bytes bytes, uint32 num_bytes, |
| array<zx_handle_disposition_t>:num_handles handles, uint32 num_handles) -> |
| (zx.status status); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.", |
| rights="All wr_handles of args must have ZX_RIGHT_TRANSFER.", |
| internal, |
| argtype="args IN"] |
| channel_call_noretry(handle handle, uint32 options, zx.time deadline, |
| array<zx_channel_call_args_t>:1 args) -> |
| (zx.status status, uint32 actual_bytes, uint32 actual_handles); |
| |
| [internal, |
| argtype="args IN"] |
| channel_call_finish(zx.time deadline, array<zx_channel_call_args_t>:1 args) -> |
| (zx.status status, uint32 actual_bytes, uint32 actual_handles); |
| |
| /// Send a message to a channel and await a reply. |
| [rights="handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.", |
| rights="All wr_handles of args must have ZX_RIGHT_TRANSFER.", |
| blocking, |
| vdsocall, |
| argtype="args IN"] |
| channel_call(handle handle, uint32 options, zx.time deadline, |
| array<zx_channel_call_args_t>:1 args) -> |
| (zx.status status, uint32 actual_bytes, uint32 actual_handles); |
| |
| // |
| // |
| // IPC: Sockets |
| // |
| // |
| |
| /// Create a socket. |
| [argtype="out0 handle_acquire", |
| argtype="out1 handle_acquire"] |
| socket_create(uint32 options) -> (zx.status status, handle out0, handle out1); |
| |
| /// Write data to a socket. |
| [rights="handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_WRITE.", |
| argtype="buffer IN", |
| argtype="actual optional"] |
| socket_write(handle<socket> handle, uint32 options, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status, usize actual); |
| |
| /// Read data from a socket. |
| [rights="handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_READ.", |
| argtype="buffer OUT", |
| argtype="actual optional"] |
| socket_read(handle<socket> handle, uint32 options, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status, usize actual); |
| |
| /// Send another socket object via a socket. |
| [rights="handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_WRITE.", |
| rights="socket_to_share must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_TRANSFER."] |
| socket_share(handle<socket> handle, handle<socket> socket_to_share) -> (zx.status status); |
| |
| /// Receive another socket object via a socket. |
| [rights="handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_READ.", |
| argtype="out_socket handle_acquire"] |
| socket_accept(handle<socket> handle) -> (zx.status status, handle<socket> out_socket); |
| |
| /// Prevent reading or writing. |
| [rights="handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_WRITE."] |
| socket_shutdown(handle<socket> handle, uint32 options) -> (zx.status status); |
| |
| // |
| // |
| // Threads |
| // |
| // |
| |
| /// Terminate the current running thread. |
| [noreturn] |
| thread_exit(); |
| |
| /// Create a thread. |
| [rights="process must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_MANAGE_THREAD.", |
| argtype="name IN", |
| argtype="out handle_acquire"] |
| thread_create(handle<process> process, |
| string:name_size name, |
| usize name_size, |
| uint32 options) -> |
| (zx.status status, handle<thread> out); |
| |
| /// Start execution on a thread. |
| [rights="handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_MANAGE_THREAD."] |
| thread_start(handle<thread> handle, zx.vaddr thread_entry, zx.vaddr stack, |
| uintptr_t arg1, uintptr_t arg2) -> |
| (zx.status status); |
| |
| /// Read one aspect of thread state. |
| [rights="handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_READ.", |
| argtype="buffer OUT"] |
| thread_read_state(handle<thread> handle, uint32 kind, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| /// Write one aspect of thread state. |
| [rights="handle must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_WRITE.", |
| argtype="buffer IN"] |
| thread_write_state(handle<thread> handle, uint32 kind, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| // |
| // |
| // Processes |
| // |
| // |
| |
| /// Exits the currently running process. |
| [noreturn] |
| process_exit(int64 retcode); |
| |
| /// Create a new process. |
| [rights="job must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_MANAGE_PROCESS.", |
| argtype="name IN", |
| argtype="proc_handle handle_acquire", |
| argtype="vmar_handle handle_acquire"] |
| // TODO(ZX-2967): job with ZX_RIGHT_WRITE is also accepted. |
| process_create(handle<job> job, string:name_size name, usize name_size, uint32 options) -> |
| (zx.status status, handle<process> proc_handle, handle<vmar> vmar_handle); |
| |
| /// Start execution on a process. |
| [rights="handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE.", |
| rights="thread must be of type ZX_OBJ_TYPE_THREAD and have ZX_RIGHT_WRITE.", |
| rights="arg1 must have ZX_RIGHT_TRANSFER.", |
| argtype="arg1 handle_release_always"] |
| process_start(handle<process> handle, handle<thread> thread, |
| zx.vaddr entry, zx.vaddr stack, |
| handle arg1, uintptr_t arg2) -> |
| (zx.status status); |
| |
| /// Read from the given process's address space. |
| [rights="handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.", |
| argtype="buffer OUT"] |
| process_read_memory(handle<process> handle, zx.vaddr vaddr, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status, usize actual); |
| |
| /// Write into the given process's address space. |
| [rights="handle must be of type ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE.", |
| argtype="buffer IN"] |
| process_write_memory(handle<process> handle, zx.vaddr vaddr, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status, usize actual); |
| |
| |
| // |
| // |
| // Jobs |
| // |
| // |
| |
| /// Create a new job. |
| [rights="parent_job must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_MANAGE_JOB.", |
| argtype="out handle_acquire"] |
| // TODO(ZX-2967): parent_job with ZX_RIGHT_WRITE is also accepted. |
| job_create(handle<job> parent_job, uint32 options) -> (zx.status status, handle<job> out); |
| |
| /// Set job security and resource policies. |
| [rights="handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_SET_POLICY.", |
| argtype="policy IN"] |
| job_set_policy(handle<job>handle, uint32 options, uint32 topic, |
| array<voidptr>:count policy, uint32 count) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // Tasks (shared between threads, processes, and jobs) |
| // |
| // |
| |
| /// Bind to, or unbind from, the exception port corresponding to a given job, process, or thread. |
| [rights="port must be of type ZX_OBJ_TYPE_PORT."] |
| // TODO(ZX-2967): No rights required on either? |
| // TODO(banjo): handle<task>? |
| task_bind_exception_port(handle handle, handle<port> port, uint64 key, uint32 options) -> |
| (zx.status status); |
| |
| /// Suspend the given task. Currently only thread or process handles may be suspended. |
| [rights="handle must be of type ZX_OBJ_TYPE_THREAD or ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE.", |
| argtype="token handle_acquire"] |
| // TODO(banjo): handle<task>? |
| task_suspend(handle handle) -> (zx.status status, handle token); |
| |
| /// Suspend the given task. Currently only thread or process handles may be suspended. |
| [rights="handle must be of type ZX_OBJ_TYPE_THREAD or ZX_OBJ_TYPE_PROCESS and have ZX_RIGHT_WRITE.", |
| argtype="token handle_acquire"] |
| // TODO(banjo): handle<task>? |
| task_suspend_token(handle handle) -> (zx.status status, handle token); |
| |
| /// Resume the given task after an exception has been reported. |
| [rights="handle must be of type ZX_OBJ_TYPE_THREAD.", |
| rights="port must be of type ZX_OBJ_TYPE_PORT."] |
| // TODO(ZX-2967): No rights required on either? |
| // TODO(banjo): handle<task>? |
| task_resume_from_exception(handle handle, handle<port> port, uint32 options) -> |
| (zx.status status); |
| |
| /// Create an exception channel for a given job, process, or thread. |
| [rights="handle must have ZX_RIGHT_INSPECT and have ZX_RIGHT_DUPLICATE and have ZX_RIGHT_TRANSFER and have ZX_RIGHT_MANAGE_THREAD.", |
| rights="If handle is of type ZX_OBJ_TYPE_JOB or ZX_OBJ_TYPE_PROCESS, it must have ZX_RIGHT_ENUMERATE.", |
| argtype="out handle_acquire"] |
| // TODO(banjo): handle<task>? |
| // TODO(banjo): is out a real handle<channel> or just something similar? |
| task_create_exception_channel(handle handle, uint32 options) -> |
| (zx.status status, handle<channel> out); |
| |
| /// Kill the provided task (job, process, or thread). |
| [rights="handle must have ZX_RIGHT_DESTROY."] |
| // TODO(banjo): handle<task>? |
| task_kill(handle handle) -> (zx.status status); |
| |
| // |
| // |
| // Exceptions |
| // |
| // |
| |
| /// Create a handle for the exception's thread. |
| [rights="handle must be of type ZX_OBJ_TYPE_EXCEPTION.", |
| argtype="out handle_acquire"] |
| // TODO(banjo): handle as handle<exception> |
| exception_get_thread(handle handle) -> (zx.status status, handle<thread> out); |
| |
| /// Create a handle for the exception's process. |
| [rights="handle must be of type ZX_OBJ_TYPE_EXCEPTION.", |
| argtype="out handle_acquire"] |
| // TODO(banjo): handle as handle<exception> |
| exception_get_process(handle handle) -> (zx.status status, handle<process> out); |
| |
| // |
| // |
| // Synchronization |
| // |
| // |
| |
| /// Create an event. |
| [argtype="out handle_acquire"] |
| event_create(uint32 options) -> (zx.status status, handle<event> out); |
| |
| /// Create an event pair. |
| [argtype="out0 handle_acquire", |
| argtype="out1 handle_acquire"] |
| eventpair_create(uint32 options) -> |
| (zx.status status, handle<eventpair> out0, handle<eventpair> out1); |
| |
| /// Wait on a futex. |
| [rights="None.", |
| blocking, |
| argtype="value_ptr IN"] |
| futex_wait(array<zx_futex_t>:1 value_ptr, zx_futex_t current_value, |
| handle new_futex_owner, zx.time deadline) -> |
| (zx.status status); |
| |
| /// Wake some number of threads waiting on a futex, optionally transferring ownership to the thread which was woken in the process. |
| [rights="None.", |
| argtype="value_ptr IN"] |
| futex_wake(array<zx_futex_t>:1 value_ptr, uint32 wake_count) -> (zx.status status); |
| |
| /// Wake some number of threads waiting on a futex, and move more waiters to another wait queue. |
| [rights="None.", |
| argtype="value_ptr IN", |
| argtype="requeue_ptr IN"] |
| futex_requeue(array<zx_futex_t>:1 value_ptr, |
| uint32 wake_count, |
| zx_futex_t current_value, |
| array<zx_futex_t>:1 requeue_ptr, uint32 requeue_count, |
| handle new_requeue_owner) -> |
| (zx.status status); |
| |
| /// Wake some number of threads waiting on a futex, optionally transferring ownership to the thread which was woken in the process. |
| [rights="None.", |
| argtype="value_ptr IN"] |
| futex_wake_single_owner(array<zx_futex_t>:1 value_ptr) -> (zx.status status); |
| |
| /// Wake some number of threads waiting on a futex, and move more waiters to another wait queue. |
| [rights="None.", |
| argtype="value_ptr IN", |
| argtype="requeue_ptr IN"] |
| futex_requeue_single_owner(array<zx_futex_t>:1 value_ptr, |
| zx_futex_t current_value, |
| array<zx_futex_t>:1 requeue_ptr, uint32 requeue_count, |
| handle new_requeue_owner) -> |
| (zx.status status); |
| |
| /// Fetch the koid current owner of a futex, if any. |
| [rights="None.", |
| argtype="value_ptr IN", |
| argtype="koid OUT"] |
| futex_get_owner(array<zx_futex_t>:1 value_ptr, array<zx.koid>:1 koid) -> (zx.status status); |
| |
| |
| // |
| // |
| // Ports |
| // |
| // |
| |
| /// Create an IO port. |
| [argtype="out handle_acquire"] |
| port_create(uint32 options) -> (zx.status status, handle<port> out); |
| |
| /// Queue a packet to a port. |
| [rights="handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE.", |
| argtype="packet IN"] |
| port_queue(handle<port> handle, array<zx_port_packet_t>:1 packet) -> (zx.status status); |
| |
| /// Wait for a packet arrival in a port. |
| [rights="handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_READ.", |
| blocking, |
| argtype="packet OUT"] |
| port_wait(handle<port> handle, zx.time deadline, array<zx_port_packet_t>:1 packet) -> |
| (zx.status status); |
| |
| /// Cancels async port notifications on an object. |
| [rights="handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE."] |
| port_cancel(handle<port> handle, handle source, uint64 key) -> (zx.status status); |
| |
| |
| // |
| // |
| // Timers |
| // |
| // |
| |
| /// Create a timer. |
| [argtype="out handle_acquire"] |
| timer_create(uint32 options, zx.clock clock_id) -> (zx.status status, handle<timer> out); |
| |
| /// Start a timer. |
| [rights="handle must be of type ZX_OBJ_TYPE_TIMER and have ZX_RIGHT_WRITE."] |
| timer_set(handle<timer> handle, zx.time deadline, zx.duration slack) -> (zx.status status); |
| |
| /// Cancel a timer. |
| [rights="handle must be of type ZX_OBJ_TYPE_TIMER and have ZX_RIGHT_WRITE."] |
| timer_cancel(handle<timer> handle) -> (zx.status status); |
| |
| // |
| // |
| // Memory management |
| // |
| // |
| |
| /// Create a VM object. |
| [argtype="out handle_acquire"] |
| vmo_create(uint64 size, uint32 options) -> (zx.status status, handle<vmo> out); |
| |
| /// Read bytes from the VMO. |
| [rights="handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.", |
| blocking, |
| argtype="buffer OUT"] |
| vmo_read(handle<vmo> handle, |
| array<voidptr>:buffer_size buffer, |
| uint64 offset, |
| usize buffer_size) -> |
| (zx.status status); |
| |
| /// Write bytes to the VMO. |
| [rights="handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE.", |
| blocking, |
| argtype="buffer IN"] |
| vmo_write(handle<vmo> handle, |
| array<voidptr>:buffer_size buffer, |
| uint64 offset, |
| usize buffer_size) |
| -> (zx.status status); |
| |
| /// Read the current size of a VMO object. |
| // TODO(ZX-2967): No rights required? |
| vmo_get_size(handle<vmo> handle) -> (zx.status status, uint64 size); |
| |
| /// Resize a VMO object. |
| [rights="handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE."] |
| vmo_set_size(handle<vmo> handle, uint64 size) -> (zx.status status); |
| |
| /// Perform an operation on a range of a VMO. |
| [rights="If op is ZX_VMO_OP_COMMIT, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE.", |
| rights="If op is ZX_VMO_OP_DECOMMIT, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE.", |
| rights="If op is ZX_VMO_OP_CACHE_SYNC, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.", |
| rights="If op is ZX_VMO_OP_CACHE_INVALIDATE, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_WRITE.", |
| rights="If op is ZX_VMO_OP_CACHE_CLEAN, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.", |
| rights="If op is ZX_VMO_OP_CACHE_CLEAN_INVALIDATE, handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.", |
| blocking, |
| argtype="buffer INOUT"] |
| vmo_op_range(handle<vmo> handle, uint32 op, uint64 offset, uint64 size, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| /// Shim for vmo_create_child |
| [rights="handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_DUPLICATE and have ZX_RIGHT_READ.", |
| argtype="out handle_acquire", |
| vdsocall] |
| vmo_clone(handle<vmo> handle, uint32 options, uint64 offset, uint64 size) -> |
| (zx.status status, handle<vmo> out); |
| |
| /// Create a child of a VM Object. |
| [rights="handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_DUPLICATE and have ZX_RIGHT_READ.", |
| argtype="out handle_acquire"] |
| vmo_create_child(handle<vmo> handle, uint32 options, uint64 offset, uint64 size) -> |
| (zx.status status, handle<vmo> out); |
| |
| /// Set the caching policy for pages held by a VMO. |
| [rights="handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_MAP."] |
| vmo_set_cache_policy(handle<vmo> handle, uint32 cache_policy) -> (zx.status status); |
| |
| /// Add execute rights to a VMO. |
| [rights="handle must be of type ZX_OBJ_TYPE_VMO.", |
| rights="vmex must have resource kind ZX_RSRC_KIND_VMEX.", |
| argtype="handle handle_release_always", |
| argtype="out handle_acquire"] |
| // TODO(ZX-2967): handle: No rights required, ZX_RIGHT_EXECUTE added to dup out |
| // TODO(ZX-2967): vmex == ZX_HANDLE_INVALID also accepted. |
| vmo_replace_as_executable(handle<vmo> handle, handle<resource> vmex) -> |
| (zx.status status, handle<vmo> out); |
| |
| |
| // |
| // |
| // Address space management |
| // |
| // |
| |
| /// Allocate a new subregion. |
| [rights="If options & ZX_VM_CAN_MAP_READ, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_READ.", |
| rights="If options & ZX_VM_CAN_MAP_WRITE, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_WRITE.", |
| rights="If options & ZX_VM_CAN_MAP_EXECUTE, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_EXECUTE.", |
| argtype="child_vmar handle_acquire"] |
| vmar_allocate(handle<vmar> parent_vmar, zx.vm_option options, uint64 offset, uint64 size) -> |
| (zx.status status, handle<vmar> child_vmar, zx.vaddr child_addr); |
| |
| /// Destroy a virtual memory address region. |
| // TODO(ZX-2967): handle No rights required? |
| vmar_destroy(handle<vmar> handle) -> (zx.status status); |
| |
| /// Add a memory mapping. |
| [rights="handle must be of type ZX_OBJ_TYPE_VMAR.", |
| rights="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. |
| vmar_map(handle<vmar> handle, zx.vm_option options, uint64 vmar_offset, |
| handle<vmo> vmo, uint64 vmo_offset, |
| uint64 len) -> |
| (zx.status status, zx.vaddr mapped_addr); |
| |
| /// Unmap virtual memory pages. |
| // TODO(ZX-2967): handle No rights required? |
| vmar_unmap(handle<vmo> handle, zx.vaddr addr, uint64 len) -> (zx.status status); |
| |
| /// Set protection of virtual memory pages. |
| [rights="If options & ZX_VM_PERM_READ, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_READ.", |
| rights="If options & ZX_VM_PERM_WRITE, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_WRITE.", |
| rights="If options & ZX_VM_PERM_EXECUTE, handle must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_EXECUTE."] |
| vmar_protect(handle<vmo> handle, zx.vm_option options, zx.vaddr addr, uint64 len) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // Random Number generator |
| // |
| // |
| |
| [internal, |
| argtype="buffer OUT"] |
| cprng_draw_once(array<voidptr>:buffer_size buffer, usize buffer_size) -> (zx.status status); |
| |
| /// Draw from the kernel's CPRNG. |
| [vdsocall, |
| argtype="buffer OUT"] |
| cprng_draw(array<voidptr>:buffer_size buffer, usize buffer_size) -> (); |
| |
| /// Add entropy to the kernel CPRNG. |
| [argtype="buffer IN"] |
| cprng_add_entropy(array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // IPC: Fifos |
| // |
| // |
| |
| /// Create a fifo. |
| [argtype="out0 handle_acquire", |
| argtype="out1 handle_acquire"] |
| fifo_create(usize elem_count, usize elem_size, uint32 options) -> |
| (zx.status status, handle<fifo> out0, handle<fifo> out1); |
| |
| /// Read data from a fifo. |
| [rights="handle must be of type ZX_OBJ_TYPE_FIFO and have ZX_RIGHT_READ.", |
| argtype="data OUT", |
| argtype="actual_count optional", |
| arraysize="data count*elem_size"] |
| fifo_read(handle<fifo> handle, usize elem_size, array<voidptr>:N data, usize count) -> |
| (zx.status status, usize actual_count); |
| |
| /// Write data to a fifo. |
| [rights="handle must be of type ZX_OBJ_TYPE_FIFO and have ZX_RIGHT_WRITE.", |
| argtype="data IN", |
| argtype="actual_count optional", |
| arraysize="data count*elem_size"] |
| fifo_write(handle<fifo> handle, usize elem_size, array<voidptr>:N data, usize count) -> |
| (zx.status status, usize actual_count); |
| |
| |
| // |
| // |
| // Profiles |
| // |
| // |
| |
| [rights="root_job must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_MANAGE_PROCESS.", |
| argtype="profile IN", |
| argtype="out handle_acquire"] |
| profile_create(handle<job> root_job, array<zx_profile_info_t>:1 profile) -> |
| (zx.status status, handle<profile> out); |
| |
| |
| // |
| // |
| // Multi-function |
| // |
| // |
| |
| /// Unmap memory, close handle, exit. |
| [vdsocall, |
| argtype="close_handle handle_release"] |
| // TODO(ZX-2399): ??? |
| vmar_unmap_handle_close_thread_exit(handle<vmar> vmar_handle, |
| zx.vaddr addr, usize size, |
| handle close_handle) -> |
| (zx.status status); |
| |
| /// Write to futex, wake futex, close handle, exit. |
| [vdsocall, |
| noreturn, |
| argtype="value_ptr IN", |
| argtype="close_handle handle_release"] |
| futex_wake_handle_close_thread_exit(array<zx_futex_t>:1 value_ptr, |
| uint32 wake_count, |
| int32 new_value, |
| handle close_handle); |
| |
| |
| // |
| // |
| // Logging |
| // |
| // |
| |
| // TODO(ZX-2967): handle == ZX_HANDLE_INVALID accepted. |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="out handle_acquire"] |
| debuglog_create(handle<resource> resource, uint32 options) -> |
| (zx.status status, handle<debuglog> out); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_LOG and have ZX_RIGHT_WRITE.", |
| argtype="buffer IN"] |
| debuglog_write(handle<debuglog> handle, uint32 options, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_LOG and have ZX_RIGHT_READ.", |
| argtype="buffer OUT"] |
| debuglog_read(handle<debuglog> handle, uint32 options, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // Tracing |
| // |
| // |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="data OUT"] |
| ktrace_read(handle<resource> handle, |
| array<voidptr>:data_size data, |
| uint32 offset, |
| usize data_size) -> |
| (zx.status status, usize actual); |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="ptr INOUT"] |
| ktrace_control(handle<resource> handle, uint32 action, uint32 options, |
| array<voidptr>:action ptr) -> |
| (zx.status status); |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT."] |
| ktrace_write(handle<resource> handle, uint32 id, uint32 arg0, uint32 arg1) -> |
| (zx.status status); |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="ptr INOUT"] |
| mtrace_control(handle<resource> handle, uint32 kind, uint32 action, uint32 options, |
| array<voidptr>:ptr_size ptr, usize ptr_size) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // Legacy LK debug syscalls |
| // |
| // |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="buffer OUT", |
| argtype="buffer_size INOUT"] |
| // TODO(banjo): size of buffer being buffer_size sems odd, but that's what |
| // that abigen says, maybe it's special cased to dereference. |
| debug_read(handle<resource> handle, string:buffer_size buffer, array<usize>:1 buffer_size) -> |
| (zx.status status); |
| |
| [argtype="buffer IN"] |
| debug_write(string:buffer_size buffer, usize buffer_size) -> (zx.status status); |
| |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="buffer IN"] |
| debug_send_command(handle<resource> resource, string:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // DDK Syscalls: Interrupts |
| // |
| // |
| |
| /// Create an interrupt object. |
| [rights="src_obj must have resource kind ZX_RSRC_KIND_IRQ."] |
| interrupt_create(handle<resource> src_obj, uint32 src_num, uint32 options) -> |
| (zx.status status, handle<interrupt> out_handle); |
| |
| /// Bind an interrupt object to a port. |
| [rights="handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_READ.", |
| rights="port_handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE."] |
| interrupt_bind(handle<interrupt> handle, handle<port> port_handle, |
| uint64 key, uint32 options) -> |
| (zx.status status); |
| |
| /// Wait for an interrupt. |
| [rights="handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_WAIT.", |
| blocking, |
| argtype="out_timestamp optional"] |
| interrupt_wait(handle<interrupt> handle) -> (zx.status status, zx.time out_timestamp); |
| |
| /// Destroys an interrupt object. |
| // TODO(ZX-2967): No DESTROY rights here. |
| interrupt_destroy(handle<interrupt> handle) -> (zx.status status); |
| |
| /// Acknowledge an interrupt and re-arm it. |
| [rights="handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_WRITE."] |
| interrupt_ack(handle<interrupt> handle) -> (zx.status status); |
| |
| /// Triggers a virtual interrupt object. |
| [rights="handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_SIGNAL."] |
| interrupt_trigger(handle<interrupt> handle, uint32 options, zx.time timestamp) -> |
| (zx.status status); |
| |
| /// Bind an interrupt object to a VCPU. |
| [rights="handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_READ.", |
| rights="vcpu must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_WRITE."] |
| interrupt_bind_vcpu(handle<interrupt> handle, handle<vcpu> vcpu, uint32 options) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // DDK Syscalls: MMIO and IoPorts |
| // |
| // |
| |
| [rights="resource must have resource kind ZX_RSRC_KIND_IOPORT."] |
| ioports_request(handle<resource> resource, uint16 io_addr, uint32 len) -> (zx.status status); |
| |
| [rights="bti must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_MAP.", |
| argtype="out handle_acquire"] |
| vmo_create_contiguous(handle<bti> bti, usize size, uint32 alignment_log2) -> |
| (zx.status status, handle<vmo> out); |
| |
| /// Create a VM object referring to a specific contiguous range of physical memory. |
| [rights="resource must have resource kind ZX_RSRC_KIND_MMIO.", |
| argtype="out handle_acquire"] |
| vmo_create_physical(handle<vmo> resource, zx.paddr paddr, usize size) -> |
| (zx.status status, handle<vmo> out); |
| |
| |
| |
| // |
| // |
| // DDK Syscalls: Device Memory Access |
| // |
| // |
| |
| /// Create a new IOMMU object in the kernel. |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="desc IN", |
| argtype="out handle_acquire"] |
| iommu_create(handle<resource> resource, uint32 type, |
| array<voidptr>:desc_size desc, usize desc_size) -> |
| (zx.status status, handle<iommu> out); |
| |
| /// Create a new bus transaction initiator. |
| [rights="iommu must be of type ZX_OBJ_TYPE_IOMMU and have ZX_RIGHT_NONE.", |
| argtype="out handle_acquire"] |
| // TODO(ZX-2967): This is unusual. |
| bti_create(handle<iommu> iommu, uint32 options, uint64 bti_id) -> |
| (zx.status status, handle<bti> out); |
| |
| /// Pin pages and grant devices access to them. |
| [rights="handle must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_MAP.", |
| rights="vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_MAP.", |
| rights="If options & ZX_BTI_PERM_READ, vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.", |
| rights="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. |
| rights="If options & ZX_BTI_PERM_EXECUTE, vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.", |
| argtype="addrs OUT", |
| argtype="pmt handle_acquire"] |
| bti_pin(handle<bti> handle, uint32 options, handle<vmo> vmo, uint64 offset, uint64 size, |
| array<zx.paddr>:addrs_count addrs, usize addrs_count) -> |
| (zx.status status, handle<pmt> pmt); |
| |
| /// Releases all quarantined PMTs. |
| [rights="handle must be of type ZX_OBJ_TYPE_BTI and have ZX_RIGHT_WRITE."] |
| bti_release_quarantine(handle<bti> handle) -> (zx.status status); |
| |
| /// Unpin pages and revoke device access to them. |
| [argtype="handle handle_release_always"] |
| // TODO(ZX-2967): handle ZX_OBJ_TYPE_PMT; No rights required? |
| pmt_unpin(handle<pmt> handle) -> (zx.status status); |
| |
| |
| // |
| // |
| // DDK Syscalls: Misc Info |
| // |
| // |
| |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT."] |
| framebuffer_get_info(handle<resource> resource) -> |
| (zx.status status, uint32 format, uint32 width, uint32 height, uint32 stride); |
| |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT."] |
| // TODO(ZX-2967): vmo ZX_OBJ_TYPE_VMO; No rights required? |
| framebuffer_set_range(handle<resource> resource, |
| handle<vmo> vmo, uint32 len, uint32 format, |
| uint32 width, uint32 height, uint32 stride) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // DDK Syscalls: PCI |
| // |
| // |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="out_handle handle_acquire"] |
| // TODO(banjo): out_handle as handle<device> |
| pci_get_nth_device(handle<resource> handle, uint32 index) -> |
| (zx.status status, zx_pcie_device_info_t out_info, handle out_handle); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_WRITE."] |
| // TODO(banjo): handle as handle<device> |
| pci_enable_bus_master(handle handle, bool enable) -> (zx.status status); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_WRITE."] |
| // TODO(banjo): handle as handle<device> |
| pci_reset_device(handle handle) -> (zx.status status); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.", |
| argtype="out_val OUT"] |
| // TODO(banjo): handle as handle<device> |
| pci_config_read(handle handle, uint16 offset, usize width, array<uint32>:1 out_val) -> |
| (zx.status status); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE."] |
| // TODO(banjo): handle as handle<device> |
| pci_config_write(handle handle, uint16 offset, usize width, uint32 val) -> (zx.status status); |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="val INOUT"] |
| pci_cfg_pio_rw(handle<resource> handle, uint8 bus, uint8 dev, uint8 func, uint8 offset, |
| array<uint32>:1 val, usize width, bool write) -> |
| (zx.status status); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.", |
| argtype="out_bar OUT", |
| argtype="out_handle handle_acquire"] |
| // TODO(banjo): handle as handle<device> |
| // TODO(banjo): type of out_handle? |
| pci_get_bar(handle handle, uint32 bar_num, array<zx_pci_bar_t>:1 out_bar) -> |
| (zx.status status, handle out_handle); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ.", |
| argtype="out_handle handle_acquire"] |
| // TODO(banjo): handle as handle<device> |
| pci_map_interrupt(handle handle, int32 which_irq) -> (zx.status status, handle out_handle); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_READ."] |
| // TODO(banjo): handle as handle<device> |
| pci_query_irq_mode(handle handle, uint32 mode) -> (zx.status status, uint32 out_max_irqs); |
| |
| [rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_WRITE."] |
| // TODO(banjo): handle as handle<device> |
| pci_set_irq_mode(handle handle, uint32 mode, uint32 requested_irq_count) -> (zx.status status); |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="init_buf IN"] |
| pci_init(handle<resource> handle, array<zx_pci_init_arg_t>:len init_buf, uint32 len) -> |
| (zx.status status); |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT."] |
| pci_add_subtract_io_range(handle<resource> handle, bool mmio, |
| uint64 base, uint64 len, bool add) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // DDK Syscalls: ACPI Glue |
| // |
| // |
| |
| [rights="handle must have resource kind ZX_RSRC_KIND_ROOT."] |
| pc_firmware_tables(handle<resource> handle) -> |
| (zx.status status, zx.paddr acpi_rsdp, zx.paddr smbios); |
| |
| |
| // |
| // |
| // DDK Syscalls: SMC Calls |
| // |
| // |
| |
| /// Make Secure Monitor Call (SMC) from user space. |
| [argtype="parameters IN", |
| argtype="out_smc_result OUT"] |
| // TODO(ZX-2967): handle No rights required? |
| smc_call(handle handle, array<zx_smc_parameters_t>:1 parameters) -> |
| (zx.status status, zx_smc_result_t out_smc_result); |
| |
| |
| // |
| // |
| // Resources |
| // |
| // |
| |
| /// Create a resource object. |
| [rights="parent_rsrc must be of type ZX_OBJ_TYPE_RESOURCE and have ZX_RIGHT_WRITE.", |
| argtype="name IN", |
| argtype="resource_out handle_acquire"] |
| resource_create(handle<resource> parent_rsrc, uint32 options, uint64 base, usize size, |
| string:name_size name, usize name_size) -> |
| (zx.status status, handle<resource> resource_out); |
| |
| |
| // |
| // |
| // Hypervisor |
| // |
| // |
| |
| /// Create a guest. |
| [rights="resource must have resource kind ZX_RSRC_KIND_HYPERVISOR.", |
| argtype="guest_handle handle_acquire", |
| argtype="vmar_handle handle_acquire"] |
| guest_create(handle<resource> resource, uint32 options) -> |
| (zx.status status, handle<guest> guest_handle, handle<vmar> vmar_handle); |
| |
| /// Sets a trap within a guest. |
| [rights="handle must be of type ZX_OBJ_TYPE_GUEST and have ZX_RIGHT_WRITE.", |
| rights="port_handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE."] |
| guest_set_trap(handle<guest> handle, uint32 kind, zx.vaddr addr, usize size, |
| handle<port> port_handle, uint64 key) -> |
| (zx.status status); |
| |
| /// Create a VCPU. |
| [rights="guest must be of type ZX_OBJ_TYPE_GUEST and have ZX_RIGHT_MANAGE_PROCESS.", |
| argtype="out handle_acquire"] |
| vcpu_create(handle<guest> guest, uint32 options, zx.vaddr entry) -> |
| (zx.status status, handle<vcpu> out); |
| |
| /// Resume execution of a VCPU. |
| [rights="handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_EXECUTE.", |
| blocking, |
| argtype="packet OUT"] |
| vcpu_resume(handle<vcpu> handle) -> (zx.status status, zx_port_packet_t packet); |
| |
| /// Raise an interrupt on a VCPU. |
| [rights="handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_SIGNAL."] |
| vcpu_interrupt(handle<vcpu> handle, uint32 vector) -> (zx.status status); |
| |
| /// Read the state of a VCPU. |
| [rights="handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_READ.", |
| argtype="buffer OUT"] |
| // TODO(banjo): handle as vcpu |
| vcpu_read_state(handle handle, uint32 kind, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| /// Write the state of a VCPU. |
| [rights="handle must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_WRITE.", |
| argtype="buffer IN"] |
| // TODO(banjo): handle as vcpu |
| vcpu_write_state(handle handle, uint32 kind, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // System Control |
| // |
| // |
| |
| /// Soft reboot the system with a new kernel and bootimage. |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT.", |
| rights="kernel_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.", |
| rights="bootimage_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ."] |
| system_mexec(handle<resource> resource, handle<vmo> kernel_vmo, handle<vmo> bootimage_vmo) -> |
| (zx.status status); |
| |
| /// Return a ZBI containing ZBI entries necessary to boot this system. |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="buffer OUT"] |
| system_mexec_payload_get(handle<resource> resource, |
| array<voidptr>:buffer_size buffer, usize buffer_size) -> |
| (zx.status status); |
| |
| [rights="resource must have resource kind ZX_RSRC_KIND_ROOT.", |
| argtype="arg IN"] |
| system_powerctl(handle<resource> resource, uint32 cmd, array<zx_system_powerctl_arg_t>:1 arg) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // User pager |
| // |
| // |
| |
| /// Create a new pager object. |
| [rights="None.", |
| argtype="out handle_acquire"] |
| pager_create(uint32 options) -> (zx.status status, handle<pager> out); |
| |
| /// Create a pager owned vmo. |
| [rights="pager must be of type ZX_OBJ_TYPE_PAGER.", |
| rights="port must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE.", |
| argtype="out handle_acquire"] |
| pager_create_vmo(handle<pager> pager, uint32 options, |
| handle<port> port, uint64 key, uint64 size) -> |
| (zx.status status, handle<vmo> out); |
| |
| /// Detaches a vmo from a pager. |
| [rights="pager must be of type ZX_OBJ_TYPE_PAGER.", |
| rights="vmo must be of type ZX_OBJ_TYPE_VMO."] |
| pager_detach_vmo(handle<pager> pager, handle<vmo> vmo) -> (zx.status status); |
| |
| /// Supply pages into a pager owned vmo. |
| [rights="pager must be of type ZX_OBJ_TYPE_PAGER.", |
| rights="pager_vmo must be of type ZX_OBJ_TYPE_VMO.", |
| rights="aux_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE."] |
| pager_supply_pages(handle<pager> pager, handle<vmo> pager_vmo, uint64 offset, uint64 length, |
| handle<vmo> aux_vmo, uint64 aux_offset) -> |
| (zx.status status); |
| |
| |
| // |
| // |
| // Test syscalls (keep at the end) |
| // |
| // |
| |
| syscall_test_0() -> (zx.status status); |
| |
| [test_category1] |
| syscall_test_1 (int32 a) -> (zx.status status); |
| |
| [test_category1] |
| syscall_test_2 (int32 a, int32 b) -> (zx.status status); |
| |
| [test_category2] |
| syscall_test_3 (int32 a, int32 b, int32 c) -> (zx.status status); |
| |
| syscall_test_4(int32 a, int32 b, int32 c, int32 d) -> (zx.status status); |
| |
| syscall_test_5(int32 a, int32 b, int32 c, int32 d, int32 e) -> (zx.status status); |
| |
| syscall_test_6(int32 a, int32 b, int32 c, int32 d, int32 e, int32 f) -> (zx.status status); |
| |
| syscall_test_7(int32 a, int32 b, int32 c, int32 d, int32 e, int32 f, int32 g) -> |
| (zx.status status); |
| |
| syscall_test_8(int32 a, int32 b, int32 c, int32 d, int32 e, int32 f, int32 g, int32 h) -> |
| (zx.status status); |
| |
| syscall_test_wrapper(int32 a, int32 b, int32 c) -> (zx.status status); |
| }; |
| |
| // vim: set ft=fidl: |