blob: 2a802cab762aaa7edd73df6ced875d69298914d1 [file] [log] [blame]
// 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 zx;
@transport("Syscall")
closed protocol Cache {
/// ## Summary
///
/// Flush CPU data and/or instruction caches.
///
/// ## Declaration
///
/// ```c
/// #include <zircon/syscalls.h>
///
/// zx_status_t zx_cache_flush(const void* addr, size_t size, uint32_t options);
/// ```
///
/// ## Description
///
/// `zx_cache_flush()` flushes CPU caches covering memory in the given
/// virtual address range. If that range of memory is not readable, then
/// the thread may fault as it would for a data read.
///
/// *options* is a bitwise OR of:
///
/// * `ZX_CACHE_FLUSH_DATA`
///
/// Clean (write back) data caches, so previous writes on this CPU are
/// visible in main memory.
///
/// * `ZX_CACHE_FLUSH_INVALIDATE`
/// (valid only when combined with `ZX_CACHE_FLUSH_DATA`)
///
/// Clean (write back) data caches and then invalidate data caches, so
/// previous writes on this CPU are visible in main memory and future
/// reads on this CPU see external changes to main memory.
///
/// * `ZX_CACHE_FLUSH_INSN`
///
/// Synchronize instruction caches with data caches, so previous writes
/// on this CPU are visible to instruction fetches. If this is combined
/// with `ZX_CACHE_FLUSH_DATA`, then previous writes will be visible to
/// main memory as well as to instruction fetches.
///
/// At least one of `ZX_CACHE_FLUSH_DATA` and `ZX_CACHE_FLUSH_INSN`
/// must be included in *options*.
///
/// ## Rights
///
/// TODO(https://fxbug.dev/42107318)
///
/// ## Return value
///
/// `zx_cache_flush()` returns `ZX_OK` on success, or an error code on failure.
///
/// ## Errors
///
/// `ZX_ERR_INVALID_ARGS` *options* is invalid.
@vdsocall
strict Flush(struct {
@voidptr
addr experimental_pointer<byte>;
size usize64;
options uint32;
}) -> () error Status;
};