Commit 0f52b3a0 authored by Mahesh Salgaonkar's avatar Mahesh Salgaonkar Committed by Michael Ellerman

powerpc/mce: Fix SLB rebolting during MCE recovery path.

The commit e7e81847 ("powerpc/64s: move machine check SLB flushing
to mm/slb.c") introduced a bug in reloading bolted SLB entries. Unused
bolted entries are stored with .esid=0 in the slb_shadow area, and
that value is now used directly as the RB input to slbmte, which means
the RB[52:63] index field is set to 0, which causes SLB entry 0 to be
cleared.

Fix this by storing the index bits in the unused bolted entries, which
directs the slbmte to the right place.

The SLB shadow area is also used by the hypervisor, but PAPR is okay
with that, from LoPAPR v1.1, 14.11.1.3 SLB Shadow Buffer:

  Note: SLB is filled sequentially starting at index 0
  from the shadow buffer ignoring the contents of
  RB field bits 52-63

Fixes: e7e81847 ("powerpc/64s: move machine check SLB flushing to mm/slb.c")
Signed-off-by: default avatarMahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 8cfbdbdc
...@@ -70,7 +70,7 @@ static inline void slb_shadow_update(unsigned long ea, int ssize, ...@@ -70,7 +70,7 @@ static inline void slb_shadow_update(unsigned long ea, int ssize,
static inline void slb_shadow_clear(enum slb_index index) static inline void slb_shadow_clear(enum slb_index index)
{ {
WRITE_ONCE(get_slb_shadow()->save_area[index].esid, 0); WRITE_ONCE(get_slb_shadow()->save_area[index].esid, cpu_to_be64(index));
} }
static inline void create_shadowed_slbe(unsigned long ea, int ssize, static inline void create_shadowed_slbe(unsigned long ea, int ssize,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment