Commit 6f20e7f2 authored by Gavin Shan's avatar Gavin Shan Committed by Michael Ellerman

powerpc/kernel: Avoid memory corruption at early stage

When calling to early_setup(), we pick "boot_paca" up for the master CPU
and initialize that with initialise_paca(). At that point, the SLB
shadow buffer isn't populated yet. Updating the SLB shadow buffer should
corrupt what we had in physical address 0 where the trap instruction is
usually stored.

This hasn't been observed to cause any trouble in practice, but is
obviously fishy.

Fixes: 6f4441ef ("powerpc: Dynamically allocate slb_shadow from memblock")
Signed-off-by: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 53a448c3
...@@ -115,6 +115,14 @@ static struct slb_shadow * __init init_slb_shadow(int cpu) ...@@ -115,6 +115,14 @@ static struct slb_shadow * __init init_slb_shadow(int cpu)
{ {
struct slb_shadow *s = &slb_shadow[cpu]; struct slb_shadow *s = &slb_shadow[cpu];
/*
* When we come through here to initialise boot_paca, the slb_shadow
* buffers are not allocated yet. That's OK, we'll get one later in
* boot, but make sure we don't corrupt memory at 0.
*/
if (!slb_shadow)
return NULL;
s->persistent = cpu_to_be32(SLB_NUM_BOLTED); s->persistent = cpu_to_be32(SLB_NUM_BOLTED);
s->buffer_length = cpu_to_be32(sizeof(*s)); s->buffer_length = cpu_to_be32(sizeof(*s));
......
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