Re: [PATCH] crash: arm32: a better way to identify LPAE enabled kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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:

                 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@xxxxxxxxxx>
> ---
>  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
> 
> 

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux