[Skiboot] [PATCH v9 21/30] pel: endian conversion
Vasant Hegde
hegdevasant at linux.vnet.ibm.com
Thu Dec 5 04:18:50 AEDT 2019
On 11/29/19 11:48 AM, Nicholas Piggin wrote:
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
> core/pel.c | 74 +++++++++++++++++++++++++------------------------
> include/pel.h | 76 +++++++++++++++++++++++++--------------------------
> 2 files changed, 77 insertions(+), 73 deletions(-)
>
> diff --git a/core/pel.c b/core/pel.c
> index b07ba0efc..4b3c705d1 100644
> --- a/core/pel.c
> +++ b/core/pel.c
> @@ -21,11 +21,11 @@ static void create_mtms_section(struct errorlog *elog_data,
> struct opal_mtms_section *mtms = (struct opal_mtms_section *)
> (pel_buffer + *pel_offset);
>
> - mtms->v6header.id = ELOG_SID_MACHINE_TYPE;
> - mtms->v6header.length = MTMS_SECTION_SIZE;
> + mtms->v6header.id = cpu_to_be16(ELOG_SID_MACHINE_TYPE);
> + mtms->v6header.length = cpu_to_be16(MTMS_SECTION_SIZE);
> mtms->v6header.version = OPAL_EXT_HRD_VER;
> mtms->v6header.subtype = 0;
> - mtms->v6header.component_id = elog_data->component_id;
> + mtms->v6header.component_id = cpu_to_be16(elog_data->component_id);
>
> memset(mtms->model, 0x00, sizeof(mtms->model));
> memcpy(mtms->model, dt_prop_get(dt_root, "model"), OPAL_SYS_MODEL_LEN);
> @@ -47,16 +47,17 @@ static void create_extended_header_section(struct errorlog *elog_data,
> const char *opalmodel = NULL;
> const struct dt_property *p;
> uint64_t extd_time;
> + uint32_t extd_date;
>
> struct opal_extended_header_section *extdhdr =
> (struct opal_extended_header_section *)
> (pel_buffer + *pel_offset);
>
> - extdhdr->v6header.id = ELOG_SID_EXTENDED_HEADER;
> - extdhdr->v6header.length = EXTENDED_HEADER_SECTION_SIZE;
> + extdhdr->v6header.id = cpu_to_be16(ELOG_SID_EXTENDED_HEADER);
> + extdhdr->v6header.length = cpu_to_be16(EXTENDED_HEADER_SECTION_SIZE);
> extdhdr->v6header.version = OPAL_EXT_HRD_VER;
> extdhdr->v6header.subtype = 0;
> - extdhdr->v6header.component_id = elog_data->component_id;
> + extdhdr->v6header.component_id = cpu_to_be16(elog_data->component_id);
>
> memset(extdhdr->model, 0x00, sizeof(extdhdr->model));
> opalmodel = dt_prop_get(dt_root, "model");
> @@ -74,8 +75,9 @@ static void create_extended_header_section(struct errorlog *elog_data,
> memset(extdhdr->opal_subsys_version, 0x00,
> sizeof(extdhdr->opal_subsys_version));
>
> - rtc_cache_get_datetime(&extdhdr->extended_header_date, &extd_time);
> - extdhdr->extended_header_time = extd_time >> 32;
> + rtc_cache_get_datetime(&extd_date, &extd_time);
> + extdhdr->extended_header_date = cpu_to_be32(extd_date);
> + extdhdr->extended_header_time = cpu_to_be32(extd_time >> 32);
> extdhdr->opal_symid_len = 0;
>
> *pel_offset += EXTENDED_HEADER_SECTION_SIZE;
> @@ -112,25 +114,25 @@ static void create_src_section(struct errorlog *elog_data,
> struct opal_src_section *src = (struct opal_src_section *)
> (pel_buffer + *pel_offset);
>
> - src->v6header.id = ELOG_SID_PRIMARY_SRC;
> - src->v6header.length = SRC_SECTION_SIZE;
> + src->v6header.id = cpu_to_be16(ELOG_SID_PRIMARY_SRC);
> + src->v6header.length = cpu_to_be16(SRC_SECTION_SIZE);
> src->v6header.version = OPAL_ELOG_VERSION;
> src->v6header.subtype = OPAL_ELOG_SST;
> - src->v6header.component_id = elog_data->component_id;
> + src->v6header.component_id = cpu_to_be16(elog_data->component_id);
>
> src->version = OPAL_SRC_SEC_VER;
> src->flags = 0;
> src->wordcount = OPAL_SRC_MAX_WORD_COUNT;
> - src->srclength = SRC_LENGTH;
> + src->srclength = cpu_to_be16(SRC_LENGTH);
> settype(src, OPAL_SRC_TYPE_ERROR);
> setsubsys(src, OPAL_FAILING_SUBSYSTEM);
> setrefcode(src, elog_data->reason_code);
I think setrefcode() needs to be fixed.
> memset(src->hexwords, 0 , (8 * 4));
> - src->hexwords[0] = OPAL_SRC_FORMAT;
> - src->hexwords[4] = elog_data->additional_info[0];
> - src->hexwords[5] = elog_data->additional_info[1];
> - src->hexwords[6] = elog_data->additional_info[2];
> - src->hexwords[7] = elog_data->additional_info[3];
> + src->hexwords[0] = cpu_to_be32(OPAL_SRC_FORMAT);
> + src->hexwords[4] = cpu_to_be32(elog_data->additional_info[0]);
> + src->hexwords[5] = cpu_to_be32(elog_data->additional_info[1]);
> + src->hexwords[6] = cpu_to_be32(elog_data->additional_info[2]);
> + src->hexwords[7] = cpu_to_be32(elog_data->additional_info[3]);
> *pel_offset += SRC_SECTION_SIZE;
> }
>
> @@ -142,11 +144,11 @@ static void create_user_header_section(struct errorlog *elog_data,
> (struct opal_user_header_section *)
> (pel_buffer + *pel_offset);
>
> - usrhdr->v6header.id = ELOG_SID_USER_HEADER;
> - usrhdr->v6header.length = USER_HEADER_SECTION_SIZE;
> + usrhdr->v6header.id = cpu_to_be16(ELOG_SID_USER_HEADER);
> + usrhdr->v6header.length = cpu_to_be16(USER_HEADER_SECTION_SIZE);
> usrhdr->v6header.version = OPAL_ELOG_VERSION;
> usrhdr->v6header.subtype = OPAL_ELOG_SST;
> - usrhdr->v6header.component_id = elog_data->component_id;
> + usrhdr->v6header.component_id = cpu_to_be16(elog_data->component_id);
>
> usrhdr->subsystem_id = elog_data->subsystem_id;
> usrhdr->event_scope = 0;
> @@ -154,9 +156,9 @@ static void create_user_header_section(struct errorlog *elog_data,
> usrhdr->event_type = elog_data->event_subtype;
>
> if (elog_data->elog_origin == ORG_SAPPHIRE)
> - usrhdr->action_flags = ERRL_ACTION_REPORT;
> + usrhdr->action_flags = cpu_to_be16(ERRL_ACTION_REPORT);
> else
> - usrhdr->action_flags = ERRL_ACTION_NONE;
> + usrhdr->action_flags = cpu_to_be16(ERRL_ACTION_NONE);
>
> *pel_offset += USER_HEADER_SECTION_SIZE;
> }
> @@ -166,19 +168,21 @@ static void create_private_header_section(struct errorlog *elog_data,
> char *pel_buffer, int *pel_offset)
> {
> uint64_t ctime;
> + uint32_t cdate;
> struct opal_private_header_section *privhdr =
> (struct opal_private_header_section *)
> pel_buffer;
>
> - privhdr->v6header.id = ELOG_SID_PRIVATE_HEADER;
> - privhdr->v6header.length = PRIVATE_HEADER_SECTION_SIZE;
> + privhdr->v6header.id = cpu_to_be16(ELOG_SID_PRIVATE_HEADER);
> + privhdr->v6header.length = cpu_to_be16(PRIVATE_HEADER_SECTION_SIZE);
> privhdr->v6header.version = OPAL_ELOG_VERSION;
> privhdr->v6header.subtype = OPAL_ELOG_SST;
> - privhdr->v6header.component_id = elog_data->component_id;
> - privhdr->plid = elog_data->plid;
> + privhdr->v6header.component_id = cpu_to_be16(elog_data->component_id);
> + privhdr->plid = cpu_to_be32(elog_data->plid);
>
> - rtc_cache_get_datetime(&privhdr->create_date, &ctime);
> - privhdr->create_time = ctime >> 32;
> + rtc_cache_get_datetime(&cdate, &ctime);
> + privhdr->create_date = cpu_to_be32(cdate);
> + privhdr->create_time = cpu_to_be32(ctime >> 32);
> privhdr->section_count = 5;
>
> privhdr->creator_subid_hi = 0x00;
> @@ -189,7 +193,7 @@ static void create_private_header_section(struct errorlog *elog_data,
> else
> privhdr->creator_id = OPAL_CID_POWERNV;
>
> - privhdr->log_entry_id = elog_data->plid; /*entry id is updated by FSP*/
> + privhdr->log_entry_id = cpu_to_be32(elog_data->plid); /*entry id is updated by FSP*/
>
> *pel_offset += PRIVATE_HEADER_SECTION_SIZE;
> }
> @@ -210,16 +214,16 @@ static void create_user_defined_section(struct errorlog *elog_data,
> usrhdr = (struct opal_user_section *)dump;
> opal_usr_data = (struct elog_user_data_section *)opal_buf;
>
> - usrhdr->v6header.id = ELOG_SID_USER_DEFINED;
> + usrhdr->v6header.id = cpu_to_be16(ELOG_SID_USER_DEFINED);
> + usrhdr->v6header.length = cpu_to_be16(sizeof(struct opal_v6_header) +
> + opal_usr_data->size);
> usrhdr->v6header.version = OPAL_ELOG_VERSION;
> - usrhdr->v6header.length = sizeof(struct opal_v6_header) +
> - opal_usr_data->size;
> usrhdr->v6header.subtype = OPAL_ELOG_SST;
> - usrhdr->v6header.component_id = elog_data->component_id;
> + usrhdr->v6header.component_id = cpu_to_be16(elog_data->component_id);
>
> memcpy(usrhdr->dump, opal_buf, opal_usr_data->size);
I think log_add_section() should convert elog_user_data_section->[tag/size] to BE
and then use BE value of size here.
Also we have to fix pel_user_section_size().
-Vasant
More information about the Skiboot
mailing list