[Skiboot] [PATCH v9 21/30] pel: endian conversion

Nicholas Piggin npiggin at gmail.com
Sun Dec 8 22:17:04 AEDT 2019


Vasant Hegde's on December 5, 2019 3:18 am:
> 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.

As we talked about offline, setrefcode itself should be okay because
it prints the reason code into an ascii hex string. readon_code itself
is in native endian, so all good I think.

>>   	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().

I added a patch to annotate and fix the errorlog bits, which includes
these. Good catch.

Thanks,
Nick


More information about the Skiboot mailing list