Hi Dave, On Fri, 2010-02-26 at 09:50 -0500, Dave Anderson wrote: > ----- "Michael Holzheu" <holzheu@xxxxxxxxxxxxxxxxxx> wrote: > > > Hi Dave, > > > > This patch fixes several bugs in the s390 stack backtrace code > > * Add panic stack as second interrupt stack > > * Fix printing of access registers (4 bytes instead of 8 bytes) > > * Use u64 for s390x register 14 > > * Fix interrupt stack handling for s390x (use 160 byte overhead > > instead of 96) > > The patch looks OK upon first glance -- can you verify that it's > absolutely backwards-compatible to earlier kernel versions? I tested vanilla 2.6.32, RHEL5, SLES10 and SLES11. But I found a bug with RHEL4: Older Linux kernels for s390 can be built so that the panic stack is not set (CONFIG_CHECK_STACK kernel built option): *(lowcore_ptr[i]) = S390_lowcore; lowcore_ptr[i]->async_stack = stack + (ASYNC_SIZE); #ifdef CONFIG_CHECK_STACK stack = __get_free_pages(GFP_KERNEL,0); if (stack == 0ULL) panic("smp_boot_cpus failed to allocate memory\n"); lowcore_ptr[i]->panic_stack = stack + (PAGE_SIZE); #endif RHEL4 has not defined CONFIG_CHECK_STACK. Therefore the following patch adds a check, so that the panic stack is only used, when it is there. --- s390.c | 2 ++ s390x.c | 2 ++ 2 files changed, 4 insertions(+) --- a/s390.c +++ b/s390.c @@ -581,6 +581,8 @@ static void s390_get_int_stack(char *sta if (!MEMBER_EXISTS("_lowcore", stack_name)) return; stack_addr = ULONG(lc + MEMBER_OFFSET("_lowcore", stack_name)); + if (stack_addr == 0) + return; readmem(stack_addr - INT_STACK_SIZE, KVADDR, int_stack, INT_STACK_SIZE, stack_name, FAULT_ON_ERROR); *start = stack_addr - INT_STACK_SIZE; --- a/s390x.c +++ b/s390x.c @@ -813,6 +813,8 @@ static void s390x_get_int_stack(char *st if (!MEMBER_EXISTS("_lowcore", stack_name)) return; stack_addr = ULONG(lc + MEMBER_OFFSET("_lowcore", stack_name)); + if (stack_addr == 0) + return; readmem(stack_addr - INT_STACK_SIZE, KVADDR, int_stack, INT_STACK_SIZE, stack_name, FAULT_ON_ERROR); *start = stack_addr - INT_STACK_SIZE;
s390: Check for kernels that do not have defined panic stack Older Linux kernels for s390 can be built so that the panic stack is not set (CONFIG_CHECK_STACK kernel built option): *(lowcore_ptr[i]) = S390_lowcore; lowcore_ptr[i]->async_stack = stack + (ASYNC_SIZE); #ifdef CONFIG_CHECK_STACK stack = __get_free_pages(GFP_KERNEL,0); if (stack == 0ULL) panic("smp_boot_cpus failed to allocate memory\n"); lowcore_ptr[i]->panic_stack = stack + (PAGE_SIZE); #endif RHEL4 has not defined CONFIG_CHECK_STACK. Therefore this patch adds a check, so that the panic stack is only used, when it is there. --- s390.c | 2 ++ s390x.c | 2 ++ 2 files changed, 4 insertions(+) --- a/s390.c +++ b/s390.c @@ -581,6 +581,8 @@ static void s390_get_int_stack(char *sta if (!MEMBER_EXISTS("_lowcore", stack_name)) return; stack_addr = ULONG(lc + MEMBER_OFFSET("_lowcore", stack_name)); + if (stack_addr == 0) + return; readmem(stack_addr - INT_STACK_SIZE, KVADDR, int_stack, INT_STACK_SIZE, stack_name, FAULT_ON_ERROR); *start = stack_addr - INT_STACK_SIZE; --- a/s390x.c +++ b/s390x.c @@ -813,6 +813,8 @@ static void s390x_get_int_stack(char *st if (!MEMBER_EXISTS("_lowcore", stack_name)) return; stack_addr = ULONG(lc + MEMBER_OFFSET("_lowcore", stack_name)); + if (stack_addr == 0) + return; readmem(stack_addr - INT_STACK_SIZE, KVADDR, int_stack, INT_STACK_SIZE, stack_name, FAULT_ON_ERROR); *start = stack_addr - INT_STACK_SIZE;
-- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility