|  | # zx_object_get_property | 
|  |  | 
|  | ## NAME | 
|  |  | 
|  | <!-- Contents of this heading updated by update-docs-from-fidl, do not edit. --> | 
|  |  | 
|  | Ask for various properties of various kernel objects. | 
|  |  | 
|  | ## SYNOPSIS | 
|  |  | 
|  | <!-- Contents of this heading updated by update-docs-from-fidl, do not edit. --> | 
|  |  | 
|  | ```c | 
|  | #include <zircon/syscalls.h> | 
|  |  | 
|  | zx_status_t zx_object_get_property(zx_handle_t handle, | 
|  | uint32_t property, | 
|  | void* value, | 
|  | size_t value_size); | 
|  | ``` | 
|  |  | 
|  | ## DESCRIPTION | 
|  |  | 
|  | `zx_object_get_property()` requests the value of a kernel object's property. | 
|  | Getting a property requires **ZX_RIGHT_GET_PROPERTY** rights on the handle. | 
|  |  | 
|  | The *handle* parameter indicates the target kernel object. Different properties | 
|  | only work on certain types of kernel objects, as described below. | 
|  |  | 
|  | The *property* parameter indicates which property to get/set. Property values | 
|  | have the prefix **ZX_PROP_**, and are described below. | 
|  |  | 
|  | The *value* parameter holds the property value, and must be a pointer to a | 
|  | buffer of *value_size* bytes. Different properties expect different value | 
|  | types/sizes as described below. | 
|  |  | 
|  | ## PROPERTIES | 
|  |  | 
|  | Property values have the prefix **ZX_PROP_**, and are defined in | 
|  |  | 
|  | ``` | 
|  | #include <zircon/syscalls/object.h> | 
|  | ``` | 
|  |  | 
|  | ### ZX_PROP_NAME | 
|  |  | 
|  | *handle* type: **(Most types)** | 
|  |  | 
|  | *value* type: `char[ZX_MAX_NAME_LEN]` | 
|  |  | 
|  | Allowed operations: **get**, **set** | 
|  |  | 
|  | The name of the object, as a NUL-terminated string. | 
|  |  | 
|  | ### ZX_PROP_REGISTER_FS and ZX_PROP_REGISTER_GS | 
|  |  | 
|  | *handle* type: **Thread** | 
|  |  | 
|  | *value* type: `uintptr_t` | 
|  |  | 
|  | Allowed operations: **set** | 
|  |  | 
|  | The value of the x86 FS or GS segment register. `value` must be a | 
|  | canonical address, and must be a userspace address. | 
|  |  | 
|  | Only defined for x86-64. | 
|  |  | 
|  | ### ZX_PROP_PROCESS_DEBUG_ADDR | 
|  |  | 
|  | *handle* type: **Process** | 
|  |  | 
|  | *value* type: `uintptr_t` | 
|  |  | 
|  | Allowed operations: **get**, **set** | 
|  |  | 
|  | The value of ld.so's `_dl_debug_addr`. This can be used by debuggers to | 
|  | interrogate the state of the dynamic loader. | 
|  |  | 
|  | If this value is set to `ZX_PROCESS_DEBUG_ADDR_BREAK_ON_SET` on process | 
|  | creation, the loader will manually issue a debug breakpoint when the property | 
|  | has been set to its correct value. This gives an opportunity to read or modify | 
|  | the initial state of the program. | 
|  |  | 
|  | ### ZX_PROP_PROCESS_BREAK_ON_LOAD | 
|  |  | 
|  | *handle* type: **Process** | 
|  |  | 
|  | *value* type: `uintptr_t` | 
|  |  | 
|  | Allowed operations: **get**, **set** | 
|  |  | 
|  | Determines whether the dynamic loader will issue a debug trap on every load of a | 
|  | shared library. If set before the first thread of a process runs, it will also | 
|  | trigger a debug trap for the initial load. | 
|  |  | 
|  | The dynamic loader sets the expected value of `ZX_PROP_PROCESS_DEBUG_ADDR` before | 
|  | triggering this debug trap. Exception handlers can use this property to query the | 
|  | dynamic loader's state. | 
|  |  | 
|  | When the dynamic loader issues the debug trap, it sets the value of the `r_brk_on_load` | 
|  | member on the `r_debug` struct exposed by the dynamic loader. The address of this | 
|  | struct can be obtained by the `ZX_PROP_PROCESS_DEBUG_ADDR` property. | 
|  |  | 
|  | Any non-zero value is considered to activate this feature. Setting this property to | 
|  | zero will disable it. | 
|  |  | 
|  | Note: Depending on the architecture, the address reported by the exception might be | 
|  | different that the one reported by this property. For example, an x64 platform reports | 
|  | the instruction pointer *after* it executes the instruction.  This means that an x64 | 
|  | platform reports an instruction pointer one byte higher than this property. | 
|  |  | 
|  | ### ZX_PROP_PROCESS_VDSO_BASE_ADDRESS | 
|  |  | 
|  | *handle* type: **Process** | 
|  |  | 
|  | *value* type: `uintptr_t` | 
|  |  | 
|  | Allowed operations: **get** | 
|  |  | 
|  | The base address of the vDSO mapping, or zero. | 
|  |  | 
|  | ### ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID | 
|  |  | 
|  | *handle* type: **Process** | 
|  |  | 
|  | *value* type: `uintptr_t` | 
|  |  | 
|  | Allowed operations: **get** | 
|  |  | 
|  | The context ID distinguishes different processes in hardware instruction tracing. | 
|  | On Intel X86-64 this is the value of register CR3. | 
|  |  | 
|  | To obtain `ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID`, you must specify | 
|  | `kernel.enable-debugging-syscalls=true` on the kernel command line. Otherwise, | 
|  | the function returns **ZX_ERR_NOT_SUPPORTED**. | 
|  |  | 
|  | Currently only defined for X86. | 
|  |  | 
|  | ### ZX_PROP_SOCKET_RX_THRESHOLD | 
|  |  | 
|  | *handle* type: **Socket** | 
|  |  | 
|  | *value* type: `size_t` | 
|  |  | 
|  | Allowed operations: **get**, **set** | 
|  |  | 
|  | The size of the read threshold of a socket, in bytes. Setting this will | 
|  | assert ZX_SOCKET_READ_THRESHOLD if the amount of data that can be read | 
|  | is greater than or equal to the threshold. Setting this property to zero | 
|  | will result in the deasserting of ZX_SOCKET_READ_THRESHOLD. | 
|  |  | 
|  | ### ZX_PROP_SOCKET_TX_THRESHOLD | 
|  |  | 
|  | *handle* type: **Socket** | 
|  |  | 
|  | *value* type: `size_t` | 
|  |  | 
|  | Allowed operations: **get**, **set** | 
|  |  | 
|  | The size of the write threshold of a socket, in bytes. Setting this will | 
|  | assert ZX_SOCKET_WRITE_THRESHOLD if the amount of space available for writing | 
|  | is greater than or equal to the threshold. Setting this property to zero | 
|  | will result in the deasserting of ZX_SOCKET_WRITE_THRESHOLD. Setting the | 
|  | write threshold after the peer has closed is an error, and results in a | 
|  | ZX_ERR_PEER_CLOSED error being returned. | 
|  |  | 
|  | ### ZX_PROP_JOB_KILL_ON_OOM | 
|  |  | 
|  | *handle* type: **Job** | 
|  |  | 
|  | *value* type: `size_t` | 
|  |  | 
|  | Allowed operations: **set** | 
|  |  | 
|  | The value of 1 means the Job and its children will be terminated if the | 
|  | system finds itself in a system-wide low memory situation. Called with 0 | 
|  | (which is the default) opts out the job from being terminated in this | 
|  | scenario. | 
|  |  | 
|  | ### ZX_PROP_EXCEPTION_STATE | 
|  |  | 
|  | *handle* type: **Exception** | 
|  |  | 
|  | *value* type: `uint32_t` | 
|  |  | 
|  | Allowed operations: **get**, **set** | 
|  |  | 
|  | When set to `ZX_EXCEPTION_STATE_HANDLED`, closing the exception handle will | 
|  | finish exception processing and resume the underlying thread. | 
|  | When set to `ZX_EXCEPTION_STATE_TRY_NEXT`, closing the exception handle will | 
|  | continue exception processing by trying the next handler in order. | 
|  | When set to `ZX_EXCEPTION_STATE_THREAD_EXIT`, closing the exception handle will | 
|  | cause the thread that generated the exception to exit. | 
|  |  | 
|  | ### ZX_PROP_EXCEPTION_STRATEGY | 
|  |  | 
|  | *handle* type: **Exception** | 
|  |  | 
|  | *value* type: `uint32_t` | 
|  |  | 
|  | Allowed operations: **get**, **set** | 
|  |  | 
|  | If `ZX_EXCEPTION_STRATEGY_SECOND_CHANCE` is set, then the debugger gets a 'second | 
|  | chance' at handling the exception if the process-level handler fails to do so. | 
|  |  | 
|  | This property can only be set when the handle corresponds to a debugger process | 
|  | exception channel. Attempting to set this property when the exception channel | 
|  | is any other type will result in ZX_ERR_BAD_STATE. | 
|  |  | 
|  | ## RIGHTS | 
|  |  | 
|  | <!-- Contents of this heading updated by update-docs-from-fidl, do not edit. --> | 
|  |  | 
|  | *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_BREAK_ON_LOAD**, *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**. | 
|  |  | 
|  | ## RETURN VALUE | 
|  |  | 
|  | `zx_object_get_property()` returns **ZX_OK** on success. In the event of | 
|  | failure, a negative error value is returned. | 
|  |  | 
|  | ## ERRORS | 
|  |  | 
|  | **ZX_ERR_BAD_HANDLE**: *handle* is not a valid handle | 
|  |  | 
|  | **ZX_ERR_WRONG_TYPE**: *handle* is not an appropriate type for *property* | 
|  |  | 
|  | **ZX_ERR_ACCESS_DENIED**: *handle* does not have the necessary rights for the | 
|  | operation | 
|  |  | 
|  | **ZX_ERR_INVALID_ARGS**: *value* is an invalid pointer | 
|  |  | 
|  | **ZX_ERR_NO_MEMORY**  Failure due to lack of memory. | 
|  | There is no good way for userspace to handle this (unlikely) error. | 
|  | In a future build this error will no longer occur. | 
|  |  | 
|  | **ZX_ERR_BUFFER_TOO_SMALL**: *value_size* is too small for *property* | 
|  |  | 
|  | **ZX_ERR_NOT_SUPPORTED**: *property* does not exist | 
|  |  | 
|  | ## SEE ALSO | 
|  |  | 
|  | - [`zx_object_set_property()`] | 
|  |  | 
|  | <!-- References updated by update-docs-from-fidl, do not edit. --> | 
|  |  | 
|  | [`zx_object_set_property()`]: object_set_property.md |