blob: 7501bae5522e13de0be11751fbd3810cb415d9bd [file] [view]
<!--
Copyright 2023 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_system_suspend_enter
# Summary
TODO(https://fxbug.dev/42182545): Document exact behavior and interface as it iterates.
## Declaration
```c
#include <zircon/syscalls-next.h>
zx_status_t zx_system_suspend_enter(zx_handle_t resource,
zx_instant_boot_t resume_deadline,
uint64_t options,
zx_wake_source_report_header_t* out_header,
zx_wake_source_report_entry_t* out_entries,
uint32_t num_entries,
uint32_t* actual_entries);
```
## Description
`zx_system_suspend_enter` suspends task execution on all online processors until the
absolute time given by *resume_deadline*. Task execution is resumed on all online processors
and the call to `zx_system_suspend_enter` returns when the resume deadline expires. Offline
processor states are not affected.
### Wake Source Reports
#### Requesting reports.
In order to better understand the specific reasons why the system eventually left the
suspended state, the user may request a "wake source report". A wake source report consists
of two pieces, a header and a vector of wake source report entries. To request a report,
users must pass (at least) a pointer to a `zx_wake_source_report_header_t`. However
practically speaking, in order to be useful, they should also pass a buffer for receiving
report entries as well. In addition to a pointer to an array of
`zx_wake_source_report_entry_t`s, users must specify the length of the array using the
`num_entries` field, and also pass a pointer to a uint32_t (`actual_entries`) which will be
used to communicate the actual number of entries in the user's buffer that the kernel wrote
to.
#### The life-cycle of a report entry.
After a wake source in the system first becomes signaled, it will be reported to users the
next time `zx_system_suspend_enter` is called and a report is requested (and there is
sufficient space in the user provided entry buffer). Subsequent calls to
`zx_system_suspend_enter` will continue to report this same entry, but with the
`ZX_SYSTEM_WAKE_REPORT_ENTRY_FLAG_PREVIOUSLY_REPORTED` flag set, until the wake source
finally becomes acknowledged. Once signaled, wake sources will always be reported to users
at least once, even if they are acknowledged and re-signaled multiple times. Fields in the
entry structure will inform the user of:
* The time at which the wake source was first signaled.
* The time at which the wake source was most recently signaled.
* The time at which the wake source was most recently acknowledged (if any).
* The number of times the wake source became signaled since the last report.
The wake source will continue to be present in requested reports until it has finally been
both reported, and acknowledged.
#### Requesting a report without suspending.
Users who wish to obtain a wake source report, but do not actually wish to enter suspend,
may pass the `ZX_SYSTEM_SUSPEND_OPTION_REPORT_ONLY` flag in the options for the syscall.
The call will behave as it normally does, however it will make no attempt to suspend.
Instead, it will simply unwind from that point, generating a report on the way out.
#### Discarding acknowledged events.
Users who are not interested in receiving wake report entries for sources which
had been signaled, but already acknowledged before the call to
`zx_system_suspend_enter`, may pass the `ZX_SYSTEM_SUSPEND_OPTION_DISCARD` bit in
the options field when calling `zx_system_suspend_enter`. At the start of the
suspend operation, any wake report entry for a wake source which has not been
reported, but is currently not signaled (i.e. acknowledged) will be discarded as
if it had already been reported.
#### Reporting the Deadline Wake Source.
When a call to `zx_system_suspend_enter` is made with a `resume_deadline` in the
future, and the system enters suspend only to be woken by the deadline timer,
this will be reported to the user in the form of a special wake report entry.
This entry's `koid` field will contain the value `ZX_KOID_KERNEL`. This wake
source is automatically acknowledged by the kernel; no special user-mode actions
need to be taken to manage the deadline wake source.
#### Destruction of wake sources.
When a wake source created by user-mode is destroyed, it is implicitly
acknowledged so that it cannot prevent the system from entering suspend.
Additionally, if there is a wake report entry waiting to be reported for the
destroyed wake source, it will immediately be removed from the set of wake
report entries waiting to be reported.
## Return value
`ZX_OK` when *resume_deadline* expires and the system resumes.
## Errors
`ZX_ERR_BAD_HANDLE` *resource* is not a valid handle.
`ZX_ERR_WRONG_TYPE` *resource* is not resource kind `ZX_RSRC_KIND_SYSTEM`.
`ZX_ERR_OUT_OF_RANGE` *resource* is not in the range [`ZX_RSRC_SYSTEM_CPU_BASE`,
`ZX_RSRC_SYSTEM_CPU_BASE`+1).
options uint64;