# zx_restricted_kick

## Summary

Kick a thread out of restricted mode.

## Declaration

    #include <zircon/syscalls-next.h>

    zx_status_t zx_restricted_kick(zx_handle_t thread, uint32_t options);

## Description

Kicks a thread out of restricted mode if it is currently running in restricted
mode or saves a pending kick if it is not. If the target thread is running in
restricted mode, it will exit to normal mode through the entry point provided to
`zx_restricted_enter` with a reason code set to `ZX_RESTRICTED_REASON_KICK`.
Otherwise the next call to `zx_restricted_enter` will not enter restricted mode
and will instead dispatch to the provided entry point with reason
code `ZX_RESTRICTED_REASON_KICK`.

Multiple kicks on the same thread object are collapsed together. Thus if
multiple threads call `zx_restricted_kick` on the same target while it is
running or entering restricted mode, at least one but possibly multiple
`ZX_RESTRICTED_REASON_KICK` returns will be observed. The recommended way to use
this syscall is to first record a reason for kicking in a synchronized data
structure and then call `zx_restricted_kick`. The thread calling
`zx_restricted_enter` should consult this data structure whenever it observes
`ZX_RESTRICTED_REASON_KICK` and process any pending state before reentering
restricted mode.

*options* must be zero.

## Rights

`ZX_RIGHT_MANAGE_THREAD` is required on *thread*.

## Errors

`ZX_ERR_INVALID_ARGS` *options* is any value other than 0.
`ZX_ERR_WRONG_TYPE` *thread* is not a thread.
`ZX_ERR_ACCESS_DENIED` *thread* does not have ZX_RIGHT_MANAGE_THREAD.
`ZX_ERR_BAD_STATE` *thread* is dead.