Skip to content

Commit

Permalink
[POWERPC] Fix boot failure on POWER6
Browse files Browse the repository at this point in the history
Commit 473980a added a call to clear
the SLB shadow buffer before registering it.  Unfortunately this means
that we clear out the entries that slb_initialize has previously set in
there.  On POWER6, the hypervisor uses the SLB shadow buffer when doing
partition switches, and that means that after the next partition switch,
each non-boot CPU has no SLB entries to map the kernel text and data,
which causes it to crash.

This fixes it by reverting most of 473980a and instead clearing the
3rd entry explicitly in slb_initialize.  This fixes the problem that
473980a was trying to solve, but without breaking POWER6.

Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Paul Mackerras committed Jan 15, 2008
1 parent d262c32 commit dfbe0d3
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 10 deletions.
10 changes: 2 additions & 8 deletions arch/powerpc/mm/slb.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,6 @@ static inline void slb_shadow_clear(unsigned long entry)
get_slb_shadow()->save_area[entry].esid = 0;
}

void slb_shadow_clear_all(void)
{
int i;

for (i = 0; i < SLB_NUM_BOLTED; i++)
slb_shadow_clear(i);
}

static inline void create_shadowed_slbe(unsigned long ea, int ssize,
unsigned long flags,
unsigned long entry)
Expand Down Expand Up @@ -300,6 +292,8 @@ void slb_initialize(void)

create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1);

slb_shadow_clear(2);

/* We don't bolt the stack for the time being - we're in boot,
* so the stack is in the bolted segment. By the time it goes
* elsewhere, we'll call _switch() which will bolt in the new
Expand Down
1 change: 0 additions & 1 deletion arch/powerpc/platforms/pseries/lpar.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,6 @@ void vpa_init(int cpu)
*/
addr = __pa(&slb_shadow[cpu]);
if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
slb_shadow_clear_all();
ret = register_slb_shadow(hwcpu, addr);
if (ret)
printk(KERN_ERR
Expand Down
1 change: 0 additions & 1 deletion include/asm-powerpc/mmu-hash64.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,6 @@ extern void hpte_init_iSeries(void);
extern void hpte_init_beat(void);
extern void hpte_init_beat_v3(void);

extern void slb_shadow_clear_all(void);
extern void stabs_alloc(void);
extern void slb_initialize(void);
extern void slb_flush_and_rebolt(void);
Expand Down

0 comments on commit dfbe0d3

Please sign in to comment.