[Skiboot] [PATCH v7 21/26] opal-dump: MPIPL endan conversions

Vasant Hegde hegdevasant at linux.vnet.ibm.com
Wed Nov 13 16:01:33 AEDT 2019


On 11/13/19 8:17 AM, Nicholas Piggin wrote:
> Vasant Hegde's on November 13, 2019 2:08 am:
>> On 11/11/19 11:19 AM, Nicholas Piggin wrote:
>>> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
>>> ---
>>>    core/opal-dump.c   | 80 +++++++++++++++++++++++++---------------------
>>>    include/opal-api.h | 14 ++++----
>>>    2 files changed, 51 insertions(+), 43 deletions(-)
>>>
>>
>>
>> .../...
>>
>>> @@ -426,13 +434,13 @@ static void post_mpipl_arch_regs_data(void)
>>>
>>>    	/* Fill CPU register details */
>>>    	opal_mpipl_cpu_data->version = OPAL_MPIPL_VERSION;
>>> -	opal_mpipl_cpu_data->cpu_data_version = proc_dump->version;
>>> +	opal_mpipl_cpu_data->cpu_data_version = cpu_to_be32((u32)proc_dump->version);
>>>    	opal_mpipl_cpu_data->cpu_data_size = proc_dump->thread_size;
>>>    	opal_mpipl_cpu_data->region_cnt = cpu_to_be32(1);
>>>
>>> -	opal_mpipl_cpu_data->region[0].src  = proc_dump->dest_addr & ~(HRMOR_BIT);
>>> -	opal_mpipl_cpu_data->region[0].dest = proc_dump->dest_addr & ~(HRMOR_BIT);
>>> -	opal_mpipl_cpu_data->region[0].size = proc_dump->act_size;
>>> +	opal_mpipl_cpu_data->region[0].src  = proc_dump->dest_addr & ~(cpu_to_be64(HRMOR_BIT));
>>> +	opal_mpipl_cpu_data->region[0].dest = proc_dump->dest_addr & ~(cpu_to_be64(HRMOR_BIT));
>>> +	opal_mpipl_cpu_data->region[0].size = cpu_to_be64(be32_to_cpu(proc_dump->act_size));
>>>
>>>    	/* Update tag */
>>>    	opal_mpipl_tags[OPAL_MPIPL_TAG_CPU] = (u64)opal_mpipl_cpu_data;
>>
>> We should convert opal_mpipl_cpu_data to BE here.
> 
> Ah, missed that because I didn't annotate the opal call types.
> 
> What about just doing the conversion in the opal calls? That tends to
> be the usual pattern is we keep our internal data structures in native
> endian, and then do the conversion at the point where we need to load/
> store hardware and OS memory.

Agree. We should do it in OPAL API call. From endianess point of view 
opal_mpipl_query_tag() is
somewhat special call...because for kernel passed tags we should return as is, 
and OPAL generated
tags we should convert to BE before sending it to kernel.


> 
>>
>>> @@ -442,7 +450,7 @@ static void post_mpipl_get_opal_data(void)
>>>    {
>>>    	struct mdrt_table *mdrt = (void *)(MDRT_TABLE_BASE);
>>>    	int i, j = 0, count = 0;
>>> -	u32 mdrt_cnt = ntuple_mdrt->act_cnt;
>>> +	int mdrt_cnt = be16_to_cpu(ntuple_mdrt->act_cnt);
>>>    	struct opal_mpipl_region *region;
>>>
>>>    	/* Count OPAL dump regions */
>>> @@ -466,8 +474,8 @@ static void post_mpipl_get_opal_data(void)
>>>
>>>    	/* Fill OPAL dump details */
>>>    	opal_mpipl_data->version = OPAL_MPIPL_VERSION;
>>> -	opal_mpipl_data->crashing_pir = mpipl_metadata->crashing_pir;
>>> -	opal_mpipl_data->region_cnt = count;
>>> +	opal_mpipl_data->crashing_pir = cpu_to_be32(mpipl_metadata->crashing_pir);
>>> +	opal_mpipl_data->region_cnt = cpu_to_be32(count);
>>>    	region = opal_mpipl_data->region;
>>>
>>>    	mdrt = (void *)(MDRT_TABLE_BASE);
>>> @@ -477,9 +485,9 @@ static void post_mpipl_get_opal_data(void)
>>>    			continue;
>>>    		}
>>>
>>> -		region[j].src  = mdrt->src_addr  & ~(HRMOR_BIT);
>>> -		region[j].dest = mdrt->dest_addr & ~(HRMOR_BIT);
>>> -		region[j].size = mdrt->size;
>>> +		region[j].src  = mdrt->src_addr  & ~(cpu_to_be64(HRMOR_BIT));
>>> +		region[j].dest = mdrt->dest_addr & ~(cpu_to_be64(HRMOR_BIT));
>>> +		region[j].size = cpu_to_be64(be32_to_cpu(mdrt->size));
>>>
>>>    		prlog(PR_NOTICE, "OPAL reserved region %d - src : 0x%llx, "
>>>    		      "dest : 0x%llx, size : 0x%llx\n", j, region[j].src,
>>
>> Can you fix above prlog as well?
>>
>> Also we have to convert `opal_mpipl_data` to BE before adding that to
>> `opal_mpipl_tags`.
> 
> Yeah I'll take another look at these. I'll do another tree-wide pass
> over the opal call APIs to make sure I haven't missed any other type
> annotations.

Thanks!

-Vasant



More information about the Skiboot mailing list