blob: c5c8061e2c75f141d031b06becfcc941ba0426d4 [file] [log] [blame] [view]
<!--
Copyright 2022 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.
DO NOT EDIT. Generated from FIDL library zx by zither, a Fuchsia platform tool.
See //docs/reference/syscalls/README.md#documentation-generation for
regeneration instructions.
-->
# zx_restricted_enter
## Summary
Enter restricted mode
## Declaration
```c
#include <zircon/syscalls-next.h>
zx_status_t zx_restricted_enter(uint32_t options,
uintptr_t vector_table_ptr,
uintptr_t context);
```
## Description
Enters restricted mode from normal thread state. If successful, the current
thread will return to normal mode via an entry point passed in
*vector_table_ptr*.
*vector_table_ptr* must be within the current user address space.
*context* may be any value. It is used as a value to pass back to normal
mode when returning from restricted mode.
*options* must be zero.
Arguments to the function at *vector_table_ptr* are architecturally specific:
On x64, *context* is placed in *rdi* and an exception code is played in *rsi*.
All other registers are currently undefined, including the stack pointer.
ARM64 support is currently unimplemented.
Currently, the *exception code* passed back to normal mode is always 0.
### Shared process
Processes created with the `ZX_PROCESS_SHARED` option, or via `zx_process_create_shared()`
have two distinct [address spaces]. One is shared between multiple processes, while the other
is restricted to the specific process. When a thread that is entering restrcited mode
belongs to such a process, the active address space for the thread is updated as follows:
- When entering restricted mode the active address space for the thread is set to the
restricted address space of the process.
- When exiting restricted mode the active address space for the thread is set to the
shared address space of the process.
## Rights
None (currently)
## Return value
No return value on success, since the current thread indirectly returns via
*vector_table_ptr*. In the event of failure, a negative error value is returned.
## Errors
**ZX_ERR_INVALID_ARGS** *vector_table_ptr* is not a valid user address or *options*
is non-zero.
**ZX_ERR_BAD_STATE** restricted mode register state is invalid. See
[`zx_restricted_write_state()`] for details.
## See also
- [`zx_restricted_write_state()`]
- [`zx_restricted_read_state()`]
- [`zx_process_create_shared()`]
[`zx_restricted_write_state()`]: restricted_write_state.md
[`zx_restricted_read_state()`]: restricted_read_state.md
[`zx_process_create_shared()`]: process_create_shared.md
[address spaces]: /docs/concepts/memory/address_spaces.md