? .tmp_export-objs ? build.sh ? build2.sh ? build3.sh ? config-tausq ? config-willy ? for-jda.tgz ? kernel.build.log ? ld.log ? t.diff ? include/linux/modules ? include/linux/modversions.h ? init/version.i ? scripts/lxdialog/lxdialog Index: arch/parisc/vmlinux.lds.S =================================================================== RCS file: /var/cvs/linux-2.5/arch/parisc/vmlinux.lds.S,v retrieving revision 1.3 diff -u -p -r1.3 vmlinux.lds.S --- arch/parisc/vmlinux.lds.S 9 Oct 2002 19:18:10 -0000 1.3 +++ arch/parisc/vmlinux.lds.S 12 Oct 2002 07:55:19 -0000 @@ -1,6 +1,6 @@ #include #ifdef CONFIG_PARISC64 -#include "vmlinux64.lds.S" +#include "vmlinux64.lds" #else #include "vmlinux32.lds.S" #endif Index: arch/parisc/kernel/pdc_cons.c =================================================================== RCS file: /var/cvs/linux-2.5/arch/parisc/kernel/pdc_cons.c,v retrieving revision 1.5 diff -u -p -r1.5 pdc_cons.c --- arch/parisc/kernel/pdc_cons.c 9 Oct 2002 14:31:05 -0000 1.5 +++ arch/parisc/kernel/pdc_cons.c 12 Oct 2002 07:55:19 -0000 @@ -12,7 +12,7 @@ /* Define EARLY_BOOTUP_DEBUG to debug kernel related boot problems. * On production kernels EARLY_BOOTUP_DEBUG should be undefined. */ -#undef EARLY_BOOTUP_DEBUG +#define EARLY_BOOTUP_DEBUG #include @@ -70,7 +70,7 @@ static struct console pdc_cons = { write: pdc_console_write, device: PDC_CONSOLE_DEVICE, setup: pdc_console_setup, - flags: CON_PRINTBUFFER|CON_ENABLED, + flags: CON_BOOT|CON_PRINTBUFFER|CON_ENABLED, index: -1, }; @@ -93,7 +93,7 @@ static void pdc_console_init_force(void) register_console(&pdc_cons); } -void pdc_console_init(void) +void __init pdc_console_init(void) { #if defined(EARLY_BOOTUP_DEBUG) || defined(CONFIG_PDC_CONSOLE) pdc_console_init_force(); Index: arch/parisc/kernel/time.c =================================================================== RCS file: /var/cvs/linux-2.5/arch/parisc/kernel/time.c,v retrieving revision 1.4 diff -u -p -r1.4 time.c --- arch/parisc/kernel/time.c 9 Oct 2002 04:44:36 -0000 1.4 +++ arch/parisc/kernel/time.c 12 Oct 2002 07:55:19 -0000 @@ -150,6 +150,9 @@ gettimeoffset (void) last_tick -= clocktick * (jiffies - wall_jiffies + 1); elapsed_cycles = mfctl(16) - last_tick; + if (elapsed_cycles < 0) + elapsed_cycles = 0; + /* the precision of this math could be improved */ return elapsed_cycles / (PAGE0->mem_10msec / 10000); #else Index: arch/parisc/kernel/traps.c =================================================================== RCS file: /var/cvs/linux-2.5/arch/parisc/kernel/traps.c,v retrieving revision 1.9 diff -u -p -r1.9 traps.c --- arch/parisc/kernel/traps.c 9 Oct 2002 04:44:37 -0000 1.9 +++ arch/parisc/kernel/traps.c 12 Oct 2002 07:55:19 -0000 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -116,77 +117,96 @@ void show_regs(struct pt_regs *regs) void dump_stack(void) { - show_stack(NULL); + unsigned long stack; + show_trace(&stack); } -void show_stack(unsigned long *stack) +static int kstack_depth_to_print = 48; +extern struct module kernel_module; + +static inline int kernel_text_address(unsigned long addr) { -#if 0 - /* If regs->sr[7] == 0, we are on a kernel stack */ - if (regs->sr[7] == 0) { +#ifdef CONFIG_MODULES + struct module *mod; +#endif + extern char _stext, _etext; - unsigned long sp = regs->gr[30]; - unsigned long cr30; - unsigned long cr31; - unsigned long stack_start; - struct pt_regs *int_regs; - - cr30 = mfctl(30); - cr31 = mfctl(31); - stack_start = sp & ~(ISTACK_SIZE - 1); - if (stack_start == cr31) { - /* - * We are on the interrupt stack, get the stack - * pointer from the first pt_regs structure on - * the interrupt stack, so we can dump the task - * stack first. - */ - - int_regs = (struct pt_regs *)cr31; - sp = int_regs->gr[30]; - stack_start = sp & ~(INIT_THREAD_SIZE - 1); - if (stack_start != cr30) { - printk(KERN_CRIT "WARNING! Interrupt-Stack pointer and cr30 do not correspond!\n"); - printk(KERN_CRIT "Dumping virtual address stack instead\n"); - dump_stack((unsigned long)__va(stack_start), (unsigned long)__va(sp), 0); - } else { - dump_stack(stack_start, sp, 0); - }; - - printk("\n\n" KERN_DEBUG "Registers at Interrupt:\n"); - show_regs(int_regs); - - /* Now dump the interrupt stack */ - - sp = regs->gr[30]; - stack_start = sp & ~(ISTACK_SIZE - 1); - dump_stack(stack_start,sp,1); - } - else - { - stack_start = sp & ~(INIT_THREAD_SIZE - 1); - if (stack_start == cr30) { - /* We're in a non-interrupt stack and cr30 matches - the start of the stack */ - dump_stack(stack_start, sp, 0); - - } - else - { - /* Stack Dump! */ - printk(KERN_CRIT "WARNING! Stack pointer and cr30 do not correspond!\n"); - printk(KERN_CRIT "Dumping virtual address stack instead\n"); - dump_stack((unsigned long)__va(stack_start), (unsigned long)__va(sp), 0); - } - } + if (addr >= (unsigned long) &_stext && + addr <= (unsigned long) &_etext) + return 1; + +#ifdef CONFIG_MODULES + for (mod = module_list; mod != &kernel_module; mod = mod->next) { + /* mod_bound tests for addr being inside the vmalloc'ed + * module area. Of course it'd be better to test only + * for the .text subset... */ + if (mod_bound(addr, 0, mod)) + return 1; } #endif + + return 0; +} + +void show_stack(unsigned long *sp) +{ + unsigned long *stack; + int i; + + /* + * debugging aid: "show_stack(NULL);" prints the + * back trace for this cpu. + */ + if(sp==NULL) + sp=(unsigned long*)&sp; + + stack = sp; + for(i=0; i < kstack_depth_to_print; i++) { + if (((long) stack & (THREAD_SIZE-1)) == 0) + break; + if (i && ((i % 4) == 0)) + printk("\n "); + printk("%016lx ", *stack++); + } + printk("\n"); + show_trace(sp); } + void show_trace(unsigned long *stack) { - BUG(); + unsigned long *endstack; + unsigned long addr; + int i; + + printk("Call Trace:"); + addr = (unsigned long)stack + THREAD_SIZE - 1; + endstack = (unsigned long *)(addr & -THREAD_SIZE); + i = 0; + while (stack + 1 <= endstack) { + addr = *stack++; + /* + * If the address is either in the text segment of the + * kernel, or in the region which contains vmalloc'ed + * memory, it *may* be the address of a calling + * routine; if so, print it so that someone tracing + * down the cause of the crash will be able to figure + * out the call path that was taken. + */ + if (kernel_text_address(addr)) { + if (i % 4 == 0) + printk("\n "); + printk(" [<%08lx>]", addr); + i++; + } + } + printk("\n"); +} + +void show_trace_task(struct task_struct *tsk) +{ + show_trace((unsigned long *)tsk->thread.regs.ksp); } void die_if_kernel(char *str, struct pt_regs *regs, long err) @@ -400,7 +420,7 @@ void parisc_terminate(char *msg, struct if (code == 1) transfer_pim_to_trap_frame(regs); - show_stack(regs); + show_stack(regs->gr[30]); printk("\n"); printk(KERN_CRIT "%s: Code=%d regs=%p (Addr=" RFMT ")\n", @@ -679,13 +699,6 @@ void handle_interruption(int code, struc do_page_fault(regs, code, fault_address); } - - -void show_trace_task(struct task_struct *tsk) -{ - BUG(); -} - int __init check_ivt(void *iva) Index: drivers/serial/8250.c =================================================================== RCS file: /var/cvs/linux-2.5/drivers/serial/8250.c,v retrieving revision 1.3 diff -u -p -r1.3 8250.c --- drivers/serial/8250.c 8 Oct 2002 22:47:49 -0000 1.3 +++ drivers/serial/8250.c 12 Oct 2002 07:55:23 -0000 @@ -445,7 +445,7 @@ static void autoconfig(struct uart_8250_ DEBUG_AUTOCONF("Testing ttyS%d (0x%04x, 0x%08lx)...\n", up->port.line, up->port.iobase, up->port.membase); - if (!up->port.iobase && !up->port.membase) + if (!up->port.iobase && !up->port.mapbase && !up->port.membase) return; /* @@ -1875,6 +1875,7 @@ static int __register_serial(struct seri struct uart_port port; port.iobase = req->port; + port.mapbase = req->iomap_base; port.membase = req->iomem_base; port.irq = req->irq; port.uartclk = req->baud_base * 16; Index: drivers/serial/8250_pci.c =================================================================== RCS file: /var/cvs/linux-2.5/drivers/serial/8250_pci.c,v retrieving revision 1.3 diff -u -p -r1.3 8250_pci.c --- drivers/serial/8250_pci.c 2 Sep 2002 06:57:26 -0000 1.3 +++ drivers/serial/8250_pci.c 12 Oct 2002 07:55:23 -0000 @@ -175,6 +175,7 @@ get_pci_port(struct pci_dev *dev, struct return 0; } req->io_type = SERIAL_IO_MEM; + req->iomap_base = port; req->iomem_base = ioremap(port, board->uart_offset); if (req->iomem_base == NULL) return -ENOMEM; Index: drivers/serial/core.c =================================================================== RCS file: /var/cvs/linux-2.5/drivers/serial/core.c,v retrieving revision 1.3 diff -u -p -r1.3 core.c --- drivers/serial/core.c 2 Sep 2002 06:57:26 -0000 1.3 +++ drivers/serial/core.c 12 Oct 2002 07:55:28 -0000 @@ -2017,7 +2017,7 @@ __uart_register_port(struct uart_driver /* * If there isn't a port here, don't do anything further. */ - if (!port->iobase && !port->membase) + if (!port->iobase && !port->mapbase && !port->membase) return; /* @@ -2412,6 +2412,7 @@ int uart_register_port(struct uart_drive } state->port->iobase = port->iobase; + state->port->mapbase = port->mapbase; state->port->membase = port->membase; state->port->irq = port->irq; state->port->uartclk = port->uartclk; Index: include/linux/console.h =================================================================== RCS file: /var/cvs/linux-2.5/include/linux/console.h,v retrieving revision 1.2 diff -u -p -r1.2 console.h --- include/linux/console.h 18 Jul 2002 16:17:11 -0000 1.2 +++ include/linux/console.h 12 Oct 2002 07:55:29 -0000 @@ -90,6 +90,7 @@ extern struct console_cmdline console_li #define CON_PRINTBUFFER (1) #define CON_CONSDEV (2) /* Last on the command line */ #define CON_ENABLED (4) +#define CON_BOOT (8) struct console { Index: include/linux/serial.h =================================================================== RCS file: /var/cvs/linux-2.5/include/linux/serial.h,v retrieving revision 1.3 diff -u -p -r1.3 serial.h --- include/linux/serial.h 8 Oct 2002 22:49:17 -0000 1.3 +++ include/linux/serial.h 12 Oct 2002 07:55:30 -0000 @@ -45,6 +45,7 @@ struct serial_struct { int hub6; unsigned short closing_wait; /* time to wait before closing */ unsigned short closing_wait2; /* no longer used... */ + unsigned long iomap_base; unsigned char *iomem_base; unsigned short iomem_reg_shift; unsigned int port_high; Index: kernel/printk.c =================================================================== RCS file: /var/cvs/linux-2.5/kernel/printk.c,v retrieving revision 1.5 diff -u -p -r1.5 printk.c --- kernel/printk.c 8 Oct 2002 22:49:24 -0000 1.5 +++ kernel/printk.c 12 Oct 2002 07:55:30 -0000 @@ -637,6 +637,11 @@ void register_console(struct console * c if (!(console->flags & CON_ENABLED)) return; + if (console_drivers && (console_drivers->flags & CON_BOOT)) { + unregister_console(console_drivers); + console->flags &= ~CON_PRINTBUFFER; + } + /* * Put this console in the list - keep the * preferred driver at the head of the list. Index: kernel/timer.c =================================================================== RCS file: /var/cvs/linux-2.5/kernel/timer.c,v retrieving revision 1.4 diff -u -p -r1.4 timer.c --- kernel/timer.c 8 Oct 2002 22:49:24 -0000 1.4 +++ kernel/timer.c 12 Oct 2002 07:55:33 -0000 @@ -739,6 +739,9 @@ static inline void update_times(void) { unsigned long ticks; + if (wall_jiffies > jiffies) + wall_jiffies = jiffies; + ticks = jiffies - wall_jiffies; if (ticks) { wall_jiffies += ticks;