I've been trying to diagnose this panic on a pa8800 box with git head: LBA: Truncating lmmio_space [fffffffff0000000/fffffffffecffffe] to [fffffffff0000000,fffffffffe77ffff] powersw: Soft power switch support not available. Backtrace: [<000000004011c7a0>] real32_call+0x148/0x178 [<000000004013ec7c>] enqueue_task_fair+0x6c/0xb0 [<000000004013f418>] update_rq_clock+0x30/0x48 [<000000004013e800>] set_next_entity+0x38/0x70 [<000000004016dca0>] autoremove_wake_function+0x18/0x48 [<00000000401bbda4>] cache_alloc_debugcheck_after+0x24c/0x300 [<000000004025c500>] kobject_uevent_env+0x418/0x5a8 [<000000004025b10c>] kobject_put+0x24/0x30 [<000000004015af60>] __sysctl_head_next+0x78/0x120 [<0000000040174234>] sysctl_check_table+0x494/0x938 [<000000004015b078>] sysctl_head_finish+0x40/0x60 [<000000004011c7a0>] real32_call+0x148/0x178 [<000000004013e3f8>] calc_delta_mine+0x68/0xf8 [<000000004018621c>] touch_softlockup_watchdog+0x3c/0x50 [<000000004014a66c>] task_tick_fair+0x84/0xf0 [<0000000040186720>] softlockup_tick+0x128/0x1c0 Kernel Fault: Code=26 regs=000000007f46c7d0 (Addr=0000000000000158) YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI PSW: 00001000000001000000000000001111 Not tainted r00-03 000000000804000f 0000000040583be0 0000000040104084 000000007f46c290 r04-07 000000004057f3e0 000000007f46c360 0000000000000000 000000007f44e040 r08-11 00000000404d7dc0 0000000000000000 000000007f44e288 00000000405bc340 r12-15 0000000000000001 00000000405bbc00 0000000040447300 0000000000000001 r16-19 000000007f46c360 00000000404dc400 00000000405bc340 0000000000000000 r20-23 000000007f46c290 0000000000000000 0000000000000310 0000000000000000 r24-27 0000000000000000 000000007f46c360 00000000403d5030 000000004057f3e0 r28-31 000000007f46c000 000000007f46c690 000000007f46c7d0 000000007f46c000 sr00-03 0000000000000000 0000000000000000 0000000000000000 0000000000000000 sr04-07 0000000000000000 0000000000000000 0000000000000000 0000000000000000 IASQ: 0000000000000000 0000000000000000 IAOQ: 000000004011af54 000000004011af58 IIR: 4a7702b0 ISR: 0000000000000000 IOR: 0000000000000158 CPU: 0 CR30: 000000007f46c000 CR31: fffffff0f0e098e0 ORIG_R28: 000000004013e3f8 IAOQ[0]: handle_interruption+0x804/0x890 IAOQ[1]: handle_interruption+0x808/0x890 RP(r2): intr_check_sig+0x0/0x38 The reason is actually that %cr30 is NULL, which should be an impossibility. However, all the real32_call() places in the trace intrigued me because they shouldn't happen on a pa8800 ... it has only wide firmware, so only 64 bit realmode calls can work. It transpires that the way we call PDC console constantly causes these real32_call() calls to be invoked leading to the panic. Sure enough, if I scrub them out of my build with the attached patch, the panic goes and git head boots just fine. James diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile index 27827bc..7ddf756 100644 --- a/arch/parisc/kernel/Makefile +++ b/arch/parisc/kernel/Makefile @@ -11,10 +11,11 @@ obj-y := cache.o pacache.o setup.o traps.o time.o irq.o \ pa7300lc.o syscall.o entry.o sys_parisc.o firmware.o \ ptrace.o hardware.o inventory.o drivers.o semaphore.o \ signal.o hpmc.o real2.o parisc_ksyms.o unaligned.o \ - process.o processor.o pdc_cons.o pdc_chassis.o unwind.o \ + process.o processor.o pdc_chassis.o unwind.o \ topology.o obj-$(CONFIG_SMP) += smp.o +obj-$(CONFIG_PDC_CONSOLE) += pdc_cons.o obj-$(CONFIG_PA11) += pci-dma.o obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_MODULES) += module.o diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 4ab83d5..378bc61 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -1080,7 +1080,7 @@ void pdc_io_reset_devices(void) spin_unlock_irqrestore(&pdc_lock, flags); } - +#ifdef CONFIG_PDC_CONSOLE /** * pdc_iodc_print - Console print using IODC. * @str: the string to output. @@ -1168,7 +1168,9 @@ int pdc_iodc_getc(void) return ch; } +#endif +#ifdef CONFIG_FB_STI int pdc_sti_call(unsigned long func, unsigned long flags, unsigned long inptr, unsigned long outputr, unsigned long glob_cfg) @@ -1183,6 +1185,7 @@ int pdc_sti_call(unsigned long func, unsigned long flags, return retval; } EXPORT_SYMBOL(pdc_sti_call); +#endif #ifdef CONFIG_64BIT /** @@ -1375,7 +1378,6 @@ int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val) * to overlay real_stack (real2.S), preparing a 32-bit call frame. * real32_call_asm() then uses this stack in narrow real mode */ - struct narrow_stack { /* use int, not long which is 64 bits */ unsigned int arg13; @@ -1404,6 +1406,14 @@ long real32_call(unsigned long fn, ...) extern unsigned long real32_call_asm(unsigned int *, unsigned int *, unsigned int); + + /* Calling real32_call without narrow firmware is a serious + * problem and can lead to crashes */ + if (unlikely(!parisc_narrow_firmware)) { + printk(KERN_ERR "Invalid call to 32 bit firmware\n"); + WARN_ON(1); + return -EINVAL; + } va_start(args, fn); real_stack.arg0 = va_arg(args, unsigned int); diff --git a/include/asm-parisc/pdc.h b/include/asm-parisc/pdc.h index deda8c3..d11aabb 100644 --- a/include/asm-parisc/pdc.h +++ b/include/asm-parisc/pdc.h @@ -588,8 +588,13 @@ struct pdc_hpmc_pim_20 { /* PDC_PIM */ __u64 fr[32]; }; +#ifdef CONFIG_PDC_CONSOLE void pdc_console_init(void); /* in pdc_console.c */ void pdc_console_restart(void); +#else +static inline void pdc_console_init(void) { } +static inline void pdc_console_restart(void) { } +#endif void setup_pdc(void); /* in inventory.c */ - To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html