[PATCH] powerpc/64s: machine check handle ifetch from foreign real address for POWER9

Michael Ellerman mpe at ellerman.id.au
Fri Jun 2 13:14:40 AEST 2017


Nicholas Piggin <npiggin at gmail.com> writes:

> The i-side 0111b case was missed by 7b9f71f974 ("powerpc/64s: POWER9
> machine check handler").
>
> It is possible to trigger this exception by branching to a foreign real
> address (bits [8:12] != 0) with instruction relocation off, and verify
> the exception cause is found after this patch.

Can you define "foreign" for people who aren't reading the chip docs :)

cheers

> Fixes: 7b9f71f974 ("powerpc/64s: POWER9 machine check handler")
> Reported-by: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
>  arch/powerpc/include/asm/mce.h  | 15 ++++++++-------
>  arch/powerpc/kernel/mce.c       |  1 +
>  arch/powerpc/kernel/mce_power.c |  3 +++
>  3 files changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/mce.h b/arch/powerpc/include/asm/mce.h
> index 81eff8631434..190d69a7f701 100644
> --- a/arch/powerpc/include/asm/mce.h
> +++ b/arch/powerpc/include/asm/mce.h
> @@ -90,13 +90,14 @@ enum MCE_UserErrorType {
>  enum MCE_RaErrorType {
>  	MCE_RA_ERROR_INDETERMINATE = 0,
>  	MCE_RA_ERROR_IFETCH = 1,
> -	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH = 2,
> -	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN = 3,
> -	MCE_RA_ERROR_LOAD = 4,
> -	MCE_RA_ERROR_STORE = 5,
> -	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 6,
> -	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN = 7,
> -	MCE_RA_ERROR_LOAD_STORE_FOREIGN = 8,
> +	MCE_RA_ERROR_IFETCH_FOREIGN = 2,
> +	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH = 3,
> +	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN = 4,
> +	MCE_RA_ERROR_LOAD = 5,
> +	MCE_RA_ERROR_STORE = 6,
> +	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 7,
> +	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN = 8,
> +	MCE_RA_ERROR_LOAD_STORE_FOREIGN = 9,
>  };
>  
>  enum MCE_LinkErrorType {
> diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
> index 5f9eada3519b..92f185875694 100644
> --- a/arch/powerpc/kernel/mce.c
> +++ b/arch/powerpc/kernel/mce.c
> @@ -268,6 +268,7 @@ void machine_check_print_event_info(struct machine_check_event *evt,
>  	static const char *mc_ra_types[] = {
>  		"Indeterminate",
>  		"Instruction fetch (bad)",
> +		"Instruction fetch (foreign)",
>  		"Page table walk ifetch (bad)",
>  		"Page table walk ifetch (foreign)",
>  		"Load (bad)",
> diff --git a/arch/powerpc/kernel/mce_power.c b/arch/powerpc/kernel/mce_power.c
> index f913139bb0c2..d24e689e893f 100644
> --- a/arch/powerpc/kernel/mce_power.c
> +++ b/arch/powerpc/kernel/mce_power.c
> @@ -236,6 +236,9 @@ static const struct mce_ierror_table mce_p9_ierror_table[] = {
>  { 0x00000000081c0000, 0x0000000000180000, true,
>    MCE_ERROR_TYPE_UE,  MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH,
>    MCE_INITIATOR_CPU,  MCE_SEV_ERROR_SYNC, },
> +{ 0x00000000081c0000, 0x00000000001c0000, true,
> +  MCE_ERROR_TYPE_RA,  MCE_RA_ERROR_IFETCH_FOREIGN,
> +  MCE_INITIATOR_CPU,  MCE_SEV_ERROR_SYNC, },
>  { 0x00000000081c0000, 0x0000000008000000, true,
>    MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_IFETCH_TIMEOUT,
>    MCE_INITIATOR_CPU,  MCE_SEV_ERROR_SYNC, },
> -- 
> 2.11.0


More information about the Linuxppc-dev mailing list