Skip to content

Commit

Permalink
Merge "refactor(measurement): move measurements from core to measurem…
Browse files Browse the repository at this point in the history
…ent lib" into integration
  • Loading branch information
soby-mathew authored and TrustedFirmware Code Review committed Sep 22, 2023
2 parents ade9811 + c769831 commit fa5dee3
Show file tree
Hide file tree
Showing 6 changed files with 214 additions and 134 deletions.
4 changes: 3 additions & 1 deletion lib/measurement/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ target_include_directories(rmm-lib-measurement
PUBLIC "include")

target_sources(rmm-lib-measurement
PRIVATE "src/measurement.c")
PRIVATE
"src/measurement.c"
"src/rim.c")
55 changes: 55 additions & 0 deletions lib/measurement/include/measurement.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,59 @@ static inline size_t measurement_get_size(const enum hash_algo algorithm)
return ret;
}

/*
* Measure a data granule
*
* Arguments:
* - rim_measurement: The buffer where the RIM to be updated is found.
* - algorithm: Algorithm to use for measurement.
* - data: Content of the granule.
* - ipa: IPA of the data granule.
* - flags: Flags according to the specification.
*/
void measurement_data_granule_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
void *data,
unsigned long ipa,
unsigned long flags);

/*
* Measure realm params
*
* Arguments:
* - rim_measurement: The buffer where the RIM to be updated is found.
* - algorithm: Algorithm to use for measurement.
* - realm_params: The parameters of the realm.
*/
void measurement_realm_params_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
struct rmi_realm_params *realm_params);

/*
* Measure REC params
*
* Arguments:
* - rim_measurement: The buffer where the RIM to be updated is found.
* - algorithm: Algorithm to use for measurement.
* - rec_params: The rec params to measure.
*/
void measurement_rec_params_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
struct rmi_rec_params *rec_params);


/*
* Measure a RIPAS granule
*
* Arguments:
* - rim_measurement: The buffer where the RIM to be updated is found.
* - algorithm: Algorithm to use for measurement.
* - ipa: IPA of the data granule.
* - level: Level of the RTT.
*/
void measurement_init_ripas_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
unsigned long ipa,
unsigned long level);

#endif /* MEASUREMENT_H */
140 changes: 140 additions & 0 deletions lib/measurement/src/rim.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
/*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/

#include <cpuid.h>
#include <measurement.h>
#include <sizes.h>
#include <string.h>

/*
* Allocate a dummy rec_params for copying relevant parameters for measurement
*/
static struct rmi_rec_params rec_params_per_cpu[MAX_CPUS];

void measurement_data_granule_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
void *data,
unsigned long ipa,
unsigned long flags)
{
struct measurement_desc_data measure_desc = {0};

/* Initialize the measurement descriptior structure */
measure_desc.desc_type = MEASURE_DESC_TYPE_DATA;
measure_desc.len = sizeof(struct measurement_desc_data);
measure_desc.ipa = ipa;
measure_desc.flags = flags;
(void)memcpy(measure_desc.rim, rim_measurement,
measurement_get_size(algorithm));

if (flags == RMI_MEASURE_CONTENT) {
/*
* Hashing the data granules and store the result in the
* measurement descriptor structure.
*/
measurement_hash_compute(algorithm,
data,
GRANULE_SIZE,
measure_desc.content);
}

/*
* Hashing the measurement descriptor structure; the result is the
* updated RIM.
*/
measurement_hash_compute(algorithm,
&measure_desc,
sizeof(measure_desc),
rim_measurement);
}

void measurement_realm_params_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
struct rmi_realm_params *realm_params)
{
/* By specification realm_params is 4KB */
unsigned char buffer[SZ_4K] = {0};
struct rmi_realm_params *realm_params_measured =
(struct rmi_realm_params *)&buffer[0];

realm_params_measured->algorithm = realm_params->algorithm;
/* TODO: Add later */
/* realm_params_measured->features_0 = realm_params->features_0; */

/* Measure relevant realm params this will be the init value of RIM */
measurement_hash_compute(algorithm,
buffer,
sizeof(buffer),
rim_measurement);
}

void measurement_rec_params_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
struct rmi_rec_params *rec_params)
{
struct measurement_desc_rec measure_desc = {0};
struct rmi_rec_params *rec_params_measured =
&(rec_params_per_cpu[my_cpuid()]);

(void)memset(rec_params_measured, 0, sizeof(*rec_params_measured));

/* Copy the relevant parts of the rmi_rec_params structure to be
* measured
*/
rec_params_measured->pc = rec_params->pc;
rec_params_measured->flags = rec_params->flags;
(void)memcpy(rec_params_measured->gprs, rec_params->gprs,
sizeof(rec_params->gprs));

/* Initialize the measurement descriptior structure */
measure_desc.desc_type = MEASURE_DESC_TYPE_REC;
measure_desc.len = sizeof(struct measurement_desc_rec);
(void)memcpy(measure_desc.rim, rim_measurement,
measurement_get_size(algorithm));

/*
* Hashing the REC params structure and store the result in the
* measurement descriptor structure.
*/
measurement_hash_compute(algorithm,
rec_params_measured,
sizeof(*rec_params_measured),
measure_desc.content);

/*
* Hashing the measurement descriptor structure; the result is the
* updated RIM.
*/
measurement_hash_compute(algorithm,
&measure_desc,
sizeof(measure_desc),
rim_measurement);
}

void measurement_init_ripas_measure(unsigned char rim_measurement[],
enum hash_algo algorithm,
unsigned long base,
unsigned long top)
{
struct measurement_desc_ripas measure_desc = {0};

/* Initialize the measurement descriptior structure */
measure_desc.desc_type = MEASURE_DESC_TYPE_RIPAS;
measure_desc.len = sizeof(struct measurement_desc_ripas);
measure_desc.base = base;
measure_desc.top = top;
(void)memcpy(measure_desc.rim,
rim_measurement,
measurement_get_size(algorithm));

/*
* Hashing the measurement descriptor structure; the result is the
* updated RIM.
*/
measurement_hash_compute(algorithm,
&measure_desc,
sizeof(measure_desc),
rim_measurement);
}
26 changes: 3 additions & 23 deletions runtime/rmi/realm.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,28 +259,6 @@ static bool validate_realm_params(struct rmi_realm_params *p)
return vmid_reserve((unsigned int)p->vmid);
}

/*
* Update the realm measurement with the realm parameters.
*/
static void realm_params_measure(struct rd *rd,
struct rmi_realm_params *realm_params)
{
/* By specification realm_params is 4KB */
unsigned char buffer[SZ_4K] = {0};
struct rmi_realm_params *realm_params_measured =
(struct rmi_realm_params *)&buffer[0];

realm_params_measured->algorithm = realm_params->algorithm;
/* TODO: Add later */
/* realm_params_measured->features_0 = realm_params->features_0; */

/* Measure relevant realm params this will be the init value of RIM */
measurement_hash_compute(rd->algorithm,
buffer,
sizeof(buffer),
rd->measurement[RIM_MEASUREMENT_SLOT]);
}

static void free_sl_rtts(struct granule *g_rtt, unsigned int num_rtts)
{
unsigned int i;
Expand Down Expand Up @@ -415,7 +393,9 @@ unsigned long smc_realm_create(unsigned long rd_addr,
rd->pmu_enabled = EXTRACT(RMI_REALM_FLAGS_PMU, p.flags) != 0UL;
rd->pmu_num_ctrs = p.pmu_num_ctrs;

realm_params_measure(rd, &p);
measurement_realm_params_measure(rd->measurement[RIM_MEASUREMENT_SLOT],
rd->algorithm,
&p);

init_s2_starting_level(rd);

Expand Down
51 changes: 3 additions & 48 deletions runtime/rmi/rec.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
#include <arch_features.h>
#include <attestation.h>
#include <buffer.h>
#include <cpuid.h>
#include <debug.h>
#include <gic.h>
#include <granule.h>
Expand All @@ -24,52 +23,6 @@
#include <stddef.h>
#include <string.h>

/*
* Allocate a dummy rec_params for copying relevant parameters for measurement
*/
static struct rmi_rec_params rec_params_per_cpu[MAX_CPUS];

static void rec_params_measure(struct rd *rd, struct rmi_rec_params *rec_params)
{
struct measurement_desc_rec measure_desc = {0};
struct rmi_rec_params *rec_params_measured =
&(rec_params_per_cpu[my_cpuid()]);

(void)memset(rec_params_measured, 0, sizeof(*rec_params_measured));

/* Copy the relevant parts of the rmi_rec_params structure to be
* measured
*/
rec_params_measured->pc = rec_params->pc;
rec_params_measured->flags = rec_params->flags;
(void)memcpy(rec_params_measured->gprs, rec_params->gprs,
sizeof(rec_params->gprs));

/* Initialize the measurement descriptior structure */
measure_desc.desc_type = MEASURE_DESC_TYPE_REC;
measure_desc.len = sizeof(struct measurement_desc_rec);
(void)memcpy(measure_desc.rim, &rd->measurement[RIM_MEASUREMENT_SLOT],
measurement_get_size(rd->algorithm));

/*
* Hashing the REC params structure and store the result in the
* measurement descriptor structure.
*/
measurement_hash_compute(rd->algorithm,
rec_params_measured,
sizeof(*rec_params_measured),
measure_desc.content);

/*
* Hashing the measurement descriptor structure; the result is the
* updated RIM.
*/
measurement_hash_compute(rd->algorithm,
&measure_desc,
sizeof(measure_desc),
rd->measurement[RIM_MEASUREMENT_SLOT]);
}

static void init_rec_sysregs(struct rec *rec, unsigned long mpidr)
{
/* Set non-zero values only */
Expand Down Expand Up @@ -367,7 +320,9 @@ unsigned long smc_rec_create(unsigned long rd_addr,
rec->realm_info.sve_enabled = rd->sve_enabled;
rec->realm_info.sve_vq = rd->sve_vq;

rec_params_measure(rd, &rec_params);
measurement_rec_params_measure(rd->measurement[RIM_MEASUREMENT_SLOT],
rd->algorithm,
&rec_params);

/*
* RD has a lock-free access from RMI_REC_DESTROY, hence increment
Expand Down

0 comments on commit fa5dee3

Please sign in to comment.