core/manifest/pfm/pfm_manager.h (44 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
#ifndef PFM_MANAGER_H_
#define PFM_MANAGER_H_
#include <stddef.h>
#include <stdint.h>
#include "platform_api.h"
#include "common/observable.h"
#include "manifest/manifest_manager.h"
#include "manifest/pfm/pfm.h"
#include "manifest/pfm/pfm_observer.h"
/**
* Variable context for managing a single PFM.
*/
struct pfm_manager_state {
struct observable observable; /**< The manager for PFM observers. */
};
/**
* API for managing the PFM for a single set of protected flash.
*/
struct pfm_manager {
struct manifest_manager base; /**< Manifest manager interface */
/**
* Get the active PFM for the protected flash. The PFM instance must be released with the
* manager.
*
* @param manager The PFM manager to query.
*
* @return The active PFM or null if there is no active PFM.
*/
const struct pfm* (*get_active_pfm) (const struct pfm_manager *manager);
/**
* Get the PFM that is waiting to be activated. The PFM instance must be released with the
* manager.
*
* @param manager The PFM manager to query.
*
* @return The pending PFM or null if there is no pending PFM.
*/
const struct pfm* (*get_pending_pfm) (const struct pfm_manager *manager);
/**
* Release a PFM instance retrieved from the manager. PFM instances must only be released by
* the manager that allocated them.
*
* @param manager The PFM manager that allocated the PFM instance.
* @param pfm The PFM to release.
*/
void (*free_pfm) (const struct pfm_manager *manager, const struct pfm *pfm);
struct pfm_manager_state *state; /**< Variable context for PFM management. */
};
int pfm_manager_add_observer (const struct pfm_manager *manager,
const struct pfm_observer *observer);
int pfm_manager_remove_observer (const struct pfm_manager *manager,
const struct pfm_observer *observer);
int pfm_manager_get_id_measured_data (const struct pfm_manager *manager, size_t offset,
uint8_t *buffer, size_t length, uint32_t *total_len);
int pfm_manager_hash_id_measured_data (const struct pfm_manager *manager,
const struct hash_engine *hash);
int pfm_manager_get_platform_id_measured_data (const struct pfm_manager *manager, size_t offset,
uint8_t *buffer, size_t length, uint32_t *total_len);
int pfm_manager_hash_platform_id_measured_data (const struct pfm_manager *manager,
const struct hash_engine *hash);
int pfm_manager_get_pfm_measured_data (const struct pfm_manager *manager, size_t offset,
uint8_t *buffer, size_t length, uint32_t *total_len);
int pfm_manager_hash_pfm_measured_data (const struct pfm_manager *manager,
const struct hash_engine *hash);
/* Internal functions for use by derived types. */
int pfm_manager_init (struct pfm_manager *manager, struct pfm_manager_state *state,
const struct hash_engine *hash, int port);
int pfm_manager_init_state (const struct pfm_manager *manager);
void pfm_manager_release (const struct pfm_manager *manager);
void pfm_manager_on_pfm_verified (const struct pfm_manager *manager);
void pfm_manager_on_pfm_activated (const struct pfm_manager *manager);
void pfm_manager_on_clear_active (const struct pfm_manager *manager);
void pfm_manager_on_pfm_activation_request (const struct pfm_manager *manager);
#endif /* PFM_MANAGER_H_ */