Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 17172
b: refs/heads/master
c: 758438a
h: refs/heads/master
v: v3
  • Loading branch information
Michael Ellerman authored and Paul Mackerras committed Jan 9, 2006
1 parent 4d39f1a commit ba12e00
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0cc4746cadda16826a1b3214c042a2f75445b71c
refs/heads/master: 758438a7b8da593c9116e95cc7fdff6e9e0b0c40
30 changes: 24 additions & 6 deletions trunk/arch/powerpc/kernel/head_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -154,11 +154,15 @@ _GLOBAL(__secondary_hold)
bne 100b

#ifdef CONFIG_HMT
b .hmt_init
LOADADDR(r4, .hmt_init)
mtctr r4
bctr
#else
#ifdef CONFIG_SMP
LOADADDR(r4, .pSeries_secondary_smp_init)
mtctr r4
mr r3,r24
b .pSeries_secondary_smp_init
bctr
#else
BUG_OPCODE
#endif
Expand Down Expand Up @@ -200,6 +204,20 @@ exception_marker:
#define EX_R3 64
#define EX_LR 72

/*
* We're short on space and time in the exception prolog, so we can't use
* the normal LOADADDR macro. Normally we just need the low halfword of the
* address, but for Kdump we need the whole low word.
*/
#ifdef CONFIG_CRASH_DUMP
#define LOAD_HANDLER(reg, label) \
oris reg,reg,(label)@h; /* virt addr of handler ... */ \
ori reg,reg,(label)@l; /* .. and the rest */
#else
#define LOAD_HANDLER(reg, label) \
ori reg,reg,(label)@l; /* virt addr of handler ... */
#endif

#define EXCEPTION_PROLOG_PSERIES(area, label) \
mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \
std r9,area+EX_R9(r13); /* save r9 - r12 */ \
Expand All @@ -212,7 +230,7 @@ exception_marker:
clrrdi r12,r13,32; /* get high part of &label */ \
mfmsr r10; \
mfspr r11,SPRN_SRR0; /* save SRR0 */ \
ori r12,r12,(label)@l; /* virt addr of handler */ \
LOAD_HANDLER(r12,label) \
ori r10,r10,MSR_IR|MSR_DR|MSR_RI; \
mtspr SPRN_SRR0,r12; \
mfspr r12,SPRN_SRR1; /* and SRR1 */ \
Expand Down Expand Up @@ -1348,7 +1366,7 @@ _GLOBAL(do_stab_bolted)
* fixed address (the linker can't compute (u64)&initial_stab >>
* PAGE_SHIFT).
*/
. = STAB0_PHYS_ADDR /* 0x6000 */
. = STAB0_OFFSET /* 0x6000 */
.globl initial_stab
initial_stab:
.space 4096
Expand Down Expand Up @@ -1553,7 +1571,7 @@ _STATIC(__boot_from_prom)
_STATIC(__after_prom_start)

/*
* We need to run with __start at physical address 0.
* We need to run with __start at physical address PHYSICAL_START.
* This will leave some code in the first 256B of
* real memory, which are reserved for software use.
* The remainder of the first page is loaded with the fixed
Expand All @@ -1568,7 +1586,7 @@ _STATIC(__after_prom_start)
mr r26,r3
SET_REG_TO_CONST(r27,KERNELBASE)

li r3,0 /* target addr */
LOADADDR(r3, PHYSICAL_START) /* target addr */

// XXX FIXME: Use phys returned by OF (r30)
add r4,r27,r26 /* source addr */
Expand Down
5 changes: 4 additions & 1 deletion trunk/arch/powerpc/kernel/setup_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ void early_setup_secondary(void)
void smp_release_cpus(void)
{
extern unsigned long __secondary_hold_spinloop;
unsigned long *ptr;

DBG(" -> smp_release_cpus()\n");

Expand All @@ -332,7 +333,9 @@ void smp_release_cpus(void)
* This is useless but harmless on iSeries, secondaries are already
* waiting on their paca spinloops. */

__secondary_hold_spinloop = 1;
ptr = (unsigned long *)((unsigned long)&__secondary_hold_spinloop
- PHYSICAL_START);
*ptr = 1;
mb();

DBG(" <- smp_release_cpus()\n");
Expand Down
16 changes: 7 additions & 9 deletions trunk/arch/powerpc/platforms/powermac/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -753,29 +753,27 @@ static int __init smp_core99_probe(void)
static void __devinit smp_core99_kick_cpu(int nr)
{
unsigned int save_vector;
unsigned long new_vector;
unsigned long flags;
unsigned long target, flags;
volatile unsigned int *vector
= ((volatile unsigned int *)(KERNELBASE+0x100));

if (nr < 0 || nr > 3)
return;
if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu", 0x346);

if (ppc_md.progress)
ppc_md.progress("smp_core99_kick_cpu", 0x346);

local_irq_save(flags);
local_irq_disable();

/* Save reset vector */
save_vector = *vector;

/* Setup fake reset vector that does
/* Setup fake reset vector that does
* b __secondary_start_pmac_0 + nr*8 - KERNELBASE
*/
new_vector = (unsigned long) __secondary_start_pmac_0 + nr * 8;
*vector = 0x48000002 + new_vector - KERNELBASE;

/* flush data cache and inval instruction cache */
flush_icache_range((unsigned long) vector, (unsigned long) vector + 4);
target = (unsigned long) __secondary_start_pmac_0 + nr * 8;
create_branch((unsigned long)vector, target, BRANCH_SET_LINK);

/* Put some life in our friend */
pmac_call_feature(PMAC_FTR_RESET_CPU, NULL, nr, 0);
Expand Down
3 changes: 2 additions & 1 deletion trunk/include/asm-powerpc/mmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@

/* Location of cpu0's segment table */
#define STAB0_PAGE 0x6
#define STAB0_PHYS_ADDR (STAB0_PAGE<<12)
#define STAB0_OFFSET (STAB0_PAGE << 12)
#define STAB0_PHYS_ADDR (STAB0_OFFSET + PHYSICAL_START)

#ifndef __ASSEMBLY__
extern char initial_stab[];
Expand Down

0 comments on commit ba12e00

Please sign in to comment.