[Crash-utility] [PATCH] crash: arm32: a better way to identify LPAE enabled kernel

Liu hua sdu.liu at huawei.com
Fri Sep 19 06:14:20 UTC 2014


于 2014/9/18 21:09, Dave Anderson 写道:
> Hello Liu,
> 
> That works -- but I think the addition of the next_symbol_value() function
> is over-kill, and it introduces an unnecessary (although presumably impossible)
> FATAL error.  Why not simplify it to do something like this:

Yes, I will resend this patch.

Thanks,
Liu HUa
> 
>                  if ((string = pc->read_vmcoreinfo("CONFIG_ARM_LPAE"))) {
>                          machdep->flags |= PAE;
>                          free(string);
>                  } else if ((sp = next_symbol("swapper_pg_dir")) &&
> 		         (sp->value - symbol_value("swapper_pg_dir")) == 0x5000))
>                          machdep->flags |= PAE;
> 
> Thanks,
>   Dave
> 
> ----- Original Message -----
>> Thanks to Dave's suggest, I impove the way to identify
>> LPAE enabled kernel for arm platform, for compatibility with
>> some old kernel.
>>
>> If a vmcore santisfy one of the following conditions, It must
>> be generated by a LPAE enabled kernel.
>>
>> (1) it has CONFIG_ARM_LPAE=y vmcore_info
>> (2) swapper_pg_dir and its next symbol value differ by 0x5000
>>
>> Signed-off-by: Liu Hua <sdu.liu at huawei.com>
>> ---
>>  arm.c     | 11 ++++++++++-
>>  symbols.c | 10 ++++++++++
>>  2 files changed, 20 insertions(+), 1 deletion(-)
>>
>> diff --git a/arm.c b/arm.c
>> index cb7d841..76ba699 100644
>> --- a/arm.c
>> +++ b/arm.c
>> @@ -190,6 +190,8 @@ void
>>  arm_init(int when)
>>  {
>>  	ulong vaddr;
>> +	char *string;
>> +	ulong difference;
>>  
>>  #if defined(__i386__) || defined(__x86_64__)
>>  	if (ACTIVE())
>> @@ -229,8 +231,15 @@ arm_init(int when)
>>  		 * LPAE requires an additional page for the PGD,
>>  		 * so PG_DIR_SIZE = 0x5000 for LPAE
>>  		 */
>> -		if ((symbol_value("_text") - symbol_value("swapper_pg_dir")) == 0x5000)
>> +		if ((string = pc->read_vmcoreinfo("CONFIG_ARM_LPAE"))) {
>>  			machdep->flags |= PAE;
>> +			free(string);
>> +		} else {
>> +			difference = next_symbol_value("swapper_pg_dir", NULL)
>> +					- symbol_value("swapper_pg_dir");
>> +			if (difference == 0x5000)
>> +				machdep->flags |= PAE;
>> +		}
>>  		machdep->kvbase = symbol_value("_stext") & ~KVBASE_MASK;
>>  		machdep->identity_map_base = machdep->kvbase;
>>  		machdep->is_kvaddr = arm_is_kvaddr;
>> diff --git a/symbols.c b/symbols.c
>> index a0f256e..b294cd2 100644
>> --- a/symbols.c
>> +++ b/symbols.c
>> @@ -4936,6 +4936,16 @@ try_get_symbol_data(char *symbol, long size, void
>> *local)
>>  	return FALSE;
>>  }
>>  
>> +ulong
>> +next_symbol_value(char *symbol, struct syment *psb)
>> +{
>> +        struct syment *sp;
>> +
>> +        if (!(sp = next_symbol(symbol, psb)))
>> +                error(FATAL, "cannot resolve \"%s\"\n", symbol);
>> +        return(sp->value);
>> +}
>> +
>>  /*
>>   *  Return the value of a given symbol.
>>   */
>> --
>> 1.9.0
>>
>>
> 
> .
> 





More information about the Crash-utility mailing list