diff options
Diffstat (limited to 'pldm/libpldm/msgbuf')
-rw-r--r-- | pldm/libpldm/msgbuf/platform.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/pldm/libpldm/msgbuf/platform.h b/pldm/libpldm/msgbuf/platform.h new file mode 100644 index 0000000..bc296b8 --- /dev/null +++ b/pldm/libpldm/msgbuf/platform.h @@ -0,0 +1,127 @@ +#ifndef PLDM_MSGBUF_PLATFORM_H +#define PLDM_MSGBUF_PLATFORM_H + +#include "../msgbuf.h" +#include <libpldm/base.h> +#include <libpldm/platform.h> + +static inline int +pldm_msgbuf_extract_value_pdr_hdr(struct pldm_msgbuf *ctx, + struct pldm_value_pdr_hdr *hdr) +{ + pldm_msgbuf_extract(ctx, &hdr->record_handle); + pldm_msgbuf_extract(ctx, &hdr->version); + pldm_msgbuf_extract(ctx, &hdr->type); + pldm_msgbuf_extract(ctx, &hdr->record_change_num); + pldm_msgbuf_extract(ctx, &hdr->length); + + return pldm_msgbuf_validate(ctx); +} + +/* + * We use __attribute__((always_inline)) below so the compiler has visibility of + * the switch() at the call site. It is often the case that the size of multiple + * fields depends on the tag. Inlining thus gives the compiler visibility to + * hoist one tag-based code-path condition to cover all invocations. + */ + +__attribute__((always_inline)) static inline int +pldm_msgbuf_extract_sensor_data(struct pldm_msgbuf *ctx, + enum pldm_sensor_readings_data_type tag, + union_sensor_data_size *dst) +{ + switch (tag) { + case PLDM_SENSOR_DATA_SIZE_UINT8: + return pldm_msgbuf_extract(ctx, &dst->value_u8); + case PLDM_SENSOR_DATA_SIZE_SINT8: + return pldm_msgbuf_extract(ctx, &dst->value_s8); + case PLDM_SENSOR_DATA_SIZE_UINT16: + return pldm_msgbuf_extract(ctx, &dst->value_u16); + case PLDM_SENSOR_DATA_SIZE_SINT16: + return pldm_msgbuf_extract(ctx, &dst->value_s16); + case PLDM_SENSOR_DATA_SIZE_UINT32: + return pldm_msgbuf_extract(ctx, &dst->value_u32); + case PLDM_SENSOR_DATA_SIZE_SINT32: + return pldm_msgbuf_extract(ctx, &dst->value_s32); + } + + return -PLDM_ERROR_INVALID_DATA; +} + +/* + * This API is bad, but it's because the caller's APIs are also bad. They should + * have used the approach used by callers of pldm_msgbuf_extract_sensor_data() + * above + */ +__attribute__((always_inline)) static inline int +pldm_msgbuf_extract_sensor_value(struct pldm_msgbuf *ctx, + enum pldm_effecter_data_size tag, uint8_t *val) +{ + switch (tag) { + case PLDM_SENSOR_DATA_SIZE_UINT8: + return pldm_msgbuf_extract_uint8(ctx, (uint8_t *)val); + case PLDM_SENSOR_DATA_SIZE_SINT8: + return pldm_msgbuf_extract_int8(ctx, (int8_t *)val); + case PLDM_SENSOR_DATA_SIZE_UINT16: + return pldm_msgbuf_extract_uint16(ctx, (uint16_t *)val); + case PLDM_SENSOR_DATA_SIZE_SINT16: + return pldm_msgbuf_extract_int16(ctx, (int16_t *)val); + case PLDM_SENSOR_DATA_SIZE_UINT32: + return pldm_msgbuf_extract_uint32(ctx, (uint32_t *)val); + case PLDM_SENSOR_DATA_SIZE_SINT32: + return pldm_msgbuf_extract_int32(ctx, (int32_t *)val); + } + + return -PLDM_ERROR_INVALID_DATA; +} + +__attribute__((always_inline)) static inline int +pldm_msgbuf_extract_range_field_format(struct pldm_msgbuf *ctx, + enum pldm_range_field_format tag, + union_range_field_format *dst) +{ + switch (tag) { + case PLDM_RANGE_FIELD_FORMAT_UINT8: + return pldm_msgbuf_extract(ctx, &dst->value_u8); + case PLDM_RANGE_FIELD_FORMAT_SINT8: + return pldm_msgbuf_extract(ctx, &dst->value_s8); + case PLDM_RANGE_FIELD_FORMAT_UINT16: + return pldm_msgbuf_extract(ctx, &dst->value_u16); + case PLDM_RANGE_FIELD_FORMAT_SINT16: + return pldm_msgbuf_extract(ctx, &dst->value_s16); + case PLDM_RANGE_FIELD_FORMAT_UINT32: + return pldm_msgbuf_extract(ctx, &dst->value_u32); + case PLDM_RANGE_FIELD_FORMAT_SINT32: + return pldm_msgbuf_extract(ctx, &dst->value_s32); + case PLDM_RANGE_FIELD_FORMAT_REAL32: + return pldm_msgbuf_extract(ctx, &dst->value_f32); + } + + return -PLDM_ERROR_INVALID_DATA; +} + +/* This API is bad, but it's because the caller's APIs are also bad */ +__attribute__((always_inline)) static inline int +pldm_msgbuf_extract_effecter_value(struct pldm_msgbuf *ctx, + enum pldm_effecter_data_size tag, + uint8_t *val) +{ + switch (tag) { + case PLDM_EFFECTER_DATA_SIZE_UINT8: + return pldm_msgbuf_extract_uint8(ctx, (uint8_t *)val); + case PLDM_EFFECTER_DATA_SIZE_SINT8: + return pldm_msgbuf_extract_int8(ctx, (int8_t *)val); + case PLDM_EFFECTER_DATA_SIZE_UINT16: + return pldm_msgbuf_extract_uint16(ctx, (uint16_t *)val); + case PLDM_EFFECTER_DATA_SIZE_SINT16: + return pldm_msgbuf_extract_int16(ctx, (int16_t *)val); + case PLDM_EFFECTER_DATA_SIZE_UINT32: + return pldm_msgbuf_extract_uint32(ctx, (uint32_t *)val); + case PLDM_EFFECTER_DATA_SIZE_SINT32: + return pldm_msgbuf_extract_int32(ctx, (int32_t *)val); + } + + return -PLDM_ERROR_INVALID_DATA; +} + +#endif |