// 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;
};
