pseries softreset on cpus in 32bit mode
Olaf Hering
olh at suse.de
Tue May 23 04:46:12 EST 2006
On Mon, May 22, Olaf Hering wrote:
>
> Consider a simple app like this, which is placed as '/init' in an initrd
> cpio archive:
>
> hello32.c
>
> #include <stdio.h>
> int main(void) {
> printf("foobar\n");
> asm("li 31,0; b .\n");
> return 0;
> }
Modified the userland app to init some registers with a fixed value, and
ran a kernel with the debug patch below. It gets into bad_stack from
decrementer_common = c000000000003400. 3200 is coming from
c000000000003200 <system_reset_common>:
So what does that mean? Should a softreset disable interrupts?
Linux version 2.6.17-rc4-g353b28ba-dirty (olaf at pomegranate) (gcc version 4.1.0 (SUSE Linux)) #13 SMP Mon May 22 20:38:56 CEST 2006
[boot]0012 Setup Arch
Top of RAM: 0x1e000000, Total RAM: 0x1e000000
Memory hole size: 0MB
PPC64 nvram contains 16384 bytes
Using default idle loop
[boot]0015 Setup Done
Built 1 zonelists
Kernel command line: root=/dev/hda2 xmon=on quiet
foobar
Bad kernel stack pointer ffad3ad0 at 3200
cpu 0x1: Vector: c000000007a5ef10 at [c000000007a5ed40]
pc: 0000000000003200
lr: 0000000010000338
sp: ffad3ad0
msr: 40001032
current = 0xc00000000ffc67e0
paca = 0xc00000000053a100
pid = 1, comm = init
enter ? for help
1:mon> r
R00 = 0000000010000338 R16 = c0000000004470e8
R01 = 00000000ffad3ad0 R17 = 0000000000000000
R02 = 000000001009c470 R18 = 00000000000413cd
R03 = 0000000007aceff8 R19 = 0000000000507ab8
R04 = 000000001002489c R20 = 0000000000000042
R05 = 0000000040000042 R21 = 0000000000000042
R06 = 0000000000004000 R22 = 0000000000000042
R07 = 000000001000b100 R23 = 0000000000000042
R08 = 000000000000f932 R24 = 0000000000000042
R09 = 0000000000000000 R25 = 0000000000000042
R10 = 0000000000000000 R26 = 0000000000000042
R11 = 0000000000000000 R27 = 0000000000000042
R12 = 00000000200fffff R28 = 0000000000000042
R13 = c00000000053a100 R29 = 0000000000003420
R14 = c000000000448a38 R30 = 0000000000003200
R15 = 4000000002010000 R31 = 0000000010000368
pc = 0000000000003200
lr = 0000000010000338
msr = 0000000040001032 cr = 20000042
ctr = 0000000000032ddc xer = 00000000200fffff trap = c000000007a5ef10
1:mon>
Index: linux-2.6/arch/powerpc/kernel/head_64.S
===================================================================
--- linux-2.6.orig/arch/powerpc/kernel/head_64.S
+++ linux-2.6/arch/powerpc/kernel/head_64.S
@@ -269,7 +269,12 @@ exception_marker:
subi r1,r1,INT_FRAME_SIZE; /* alloc frame on kernel stack */ \
beq- 1f; \
ld r1,PACAKSAVE(r13); /* kernel stack to use */ \
-1: cmpdi cr1,r1,0; /* check if r1 is in userspace */ \
+1: \
+ cmpdi cr1,r29,0x42; \
+ bne cr1,2f; \
+ li r29,2f at l; \
+2: \
+ cmpdi cr1,r1,0; /* check if r1 is in userspace */ \
bge- cr1,bad_stack; /* abort if it is */ \
std r9,_CCR(r1); /* save CR in stackframe */ \
std r11,_NIP(r1); /* save SRR0 in stackframe */ \
@@ -600,6 +605,7 @@ slb_miss_user_pseries:
system_reset_fwnmi:
HMT_MEDIUM
mtspr SPRN_SPRG1,r13 /* save r13 */
+ mfspr r31,SPRN_SRR0
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common)
.globl machine_check_fwnmi
@@ -842,6 +848,7 @@ bad_stack:
std r9,_CCR(r1)
std r10,GPR1(r1)
std r11,_NIP(r1)
+ mr r30,r11
std r12,_MSR(r1)
mfspr r11,SPRN_DAR
mfspr r12,SPRN_DSISR
More information about the Linuxppc-dev
mailing list