/* 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.
 */

#ifndef SRC_FIRMWARE_LIB_ABR_INCLUDE_LIB_ABR_OPS_H_
#define SRC_FIRMWARE_LIB_ABR_INCLUDE_LIB_ABR_OPS_H_

#include "sysdeps.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Operations called by libabr that require platform-dependent implementation. */
typedef struct AbrOps {
  /* Available for use by the AbrOps implementation. This is passed by libabr to every AbrOps call,
   * but libabr does not use this value. If this is not used by an implementation, it can be safely
   * set to NULL.
   */
  void* context;

  /* Reads |size| bytes of A/B/R metadata from persistent storage into |buffer|.
   *
   * On success, populates |buffer| and returns true. This function must fail if fewer than |size|
   * bytes are read. Setting this function to NULL will cause libabr to return I/O errors.
   */
  bool (*read_abr_metadata)(void* context, size_t size, uint8_t* buffer);

  /* Writes |size| bytes of A/B/R metadata from |buffer| to persistent storage.
   *
   * Returns true on success. This function must fail if fewer than |size| bytes are written.
   * Setting this function to NULL is appropriate in environments where metadata is read-only.
   */
  bool (*write_abr_metadata)(void* context, const uint8_t* buffer, size_t size);
} AbrOps;

#ifdef __cplusplus
}
#endif

#endif  // SRC_FIRMWARE_LIB_ABR_INCLUDE_LIB_ABR_OPS_H_
