Skip to content

Commit

Permalink
powerpc/64: don't set boot CPU's r13 to paca until the structure is s…
Browse files Browse the repository at this point in the history
…et up

The idea is to get to the point where if r13 is non-zero, then it should
contain a reasonable paca. This can be used in early boot program check
and machine check handlers to avoid running off into the weeds if they
hit before r13 has a paca.

Signed-off-by: Nicholas Piggin <[email protected]>
Signed-off-by: Michael Ellerman <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
npiggin authored and mpe committed Sep 28, 2022
1 parent b830c87 commit 519b2e3
Showing 1 changed file with 10 additions and 10 deletions.
20 changes: 10 additions & 10 deletions arch/powerpc/kernel/setup_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,25 +177,25 @@ early_param("smt-enabled", early_smt_enabled);
#endif /* CONFIG_SMP */

/** Fix up paca fields required for the boot cpu */
static void __init fixup_boot_paca(void)
static void __init fixup_boot_paca(struct paca_struct *boot_paca)
{
/* The boot cpu is started */
get_paca()->cpu_start = 1;
boot_paca->cpu_start = 1;
#ifdef CONFIG_PPC_BOOK3S_64
/*
* Give the early boot machine check stack somewhere to use, use
* half of the init stack. This is a bit hacky but there should not be
* deep stack usage in early init so shouldn't overflow it or overwrite
* things.
*/
get_paca()->mc_emergency_sp = (void *)&init_thread_union +
boot_paca->mc_emergency_sp = (void *)&init_thread_union +
(THREAD_SIZE/2);
#endif
/* Allow percpu accesses to work until we setup percpu data */
get_paca()->data_offset = 0;
boot_paca->data_offset = 0;
/* Mark interrupts soft and hard disabled in PACA */
irq_soft_mask_set(IRQS_DISABLED);
get_paca()->irq_happened = PACA_IRQ_HARD_DIS;
boot_paca->irq_soft_mask = IRQS_DISABLED;
boot_paca->irq_happened = PACA_IRQ_HARD_DIS;
WARN_ON(mfmsr() & MSR_EE);
}

Expand Down Expand Up @@ -363,8 +363,8 @@ void __init early_setup(unsigned long dt_ptr)
* what CPU we are on.
*/
initialise_paca(&boot_paca, 0);
setup_paca(&boot_paca);
fixup_boot_paca();
fixup_boot_paca(&boot_paca);
setup_paca(&boot_paca); /* install the paca into registers */

/* -------- printk is now safe to use ------- */

Expand Down Expand Up @@ -393,8 +393,8 @@ void __init early_setup(unsigned long dt_ptr)
/* Poison paca_ptrs[0] again if it's not the boot cpu */
memset(&paca_ptrs[0], 0x88, sizeof(paca_ptrs[0]));
}
setup_paca(paca_ptrs[boot_cpuid]);
fixup_boot_paca();
fixup_boot_paca(paca_ptrs[boot_cpuid]);
setup_paca(paca_ptrs[boot_cpuid]); /* install the paca into registers */

/*
* Configure exception handlers. This include setting up trampolines
Expand Down

0 comments on commit 519b2e3

Please sign in to comment.