diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-22 11:11:33 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-22 11:11:33 -0700 |
commit | 3f2c6d0f4f0dafdc99af0df71edba57e7815cb13 (patch) | |
tree | 757a03a92ee24cdd21b26c2f478b10eb607172ab /arch | |
parent | 4beb2584be3cf1d4fc7a222b0f747735da8e3c91 (diff) | |
parent | 216e39db112da4d25a52aeb956e7da70fdd0d94c (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/cooloney/blackfin-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/cooloney/blackfin-2.6:
Blackfin arch: add proper const volatile to addr argument to the read functions
Blackfin arch: Add definition of dma_mapping_error
Blackfin arch: move cond_syscall() behind __KERNEL__ like all other architectures
Blackfin arch: match kernel startup messaage with new linker script
Blackfin arch: add missing braces around array bfin serial init
Blackfin arch: update printk to use KERN_EMERG and reformat crash output
Blackfin arch: update ANOMALY handling
Diffstat (limited to 'arch')
-rw-r--r-- | arch/blackfin/kernel/setup.c | 8 | ||||
-rw-r--r-- | arch/blackfin/kernel/traps.c | 141 | ||||
-rw-r--r-- | arch/blackfin/lib/memcmp.S | 5 | ||||
-rw-r--r-- | arch/blackfin/lib/memcpy.S | 13 | ||||
-rw-r--r-- | arch/blackfin/lib/memmove.S | 17 | ||||
-rw-r--r-- | arch/blackfin/mach-common/cache.S | 20 | ||||
-rw-r--r-- | arch/blackfin/mach-common/interrupt.S | 2 |
7 files changed, 132 insertions, 74 deletions
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index a24fa1ab802..5b9b434c1ed 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c @@ -329,9 +329,10 @@ void __init setup_arch(char **cmdline_p) printk(KERN_INFO "Memory map:\n" KERN_INFO " text = 0x%p-0x%p\n" - KERN_INFO " init = 0x%p-0x%p\n" + KERN_INFO " rodata = 0x%p-0x%p\n" KERN_INFO " data = 0x%p-0x%p\n" - KERN_INFO " stack = 0x%p-0x%p\n" + KERN_INFO " stack = 0x%p-0x%p\n" + KERN_INFO " init = 0x%p-0x%p\n" KERN_INFO " bss = 0x%p-0x%p\n" KERN_INFO " available = 0x%p-0x%p\n" #ifdef CONFIG_MTD_UCLINUX @@ -341,9 +342,10 @@ void __init setup_arch(char **cmdline_p) KERN_INFO " DMA Zone = 0x%p-0x%p\n" #endif , _stext, _etext, - __init_begin, __init_end, + __start_rodata, __end_rodata, _sdata, _edata, (void*)&init_thread_union, (void*)((int)(&init_thread_union) + 0x2000), + __init_begin, __init_end, __bss_start, __bss_stop, (void*)_ramstart, (void*)memory_end #ifdef CONFIG_MTD_UCLINUX diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 5ab87b0b92d..aa660f32d8c 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c @@ -148,8 +148,15 @@ asmlinkage void trap_c(struct pt_regs *fp) unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; #ifdef CONFIG_KGDB -# define CHK_DEBUGGER_TRAP() do { CHK_DEBUGGER(trapnr, sig, info.si_code, fp,); } while (0) -# define CHK_DEBUGGER_TRAP_MAYBE() do { if (kgdb_connected) CHK_DEBUGGER_TRAP(); } while (0) +# define CHK_DEBUGGER_TRAP() \ + do { \ + CHK_DEBUGGER(trapnr, sig, info.si_code, fp); \ + } while (0) +# define CHK_DEBUGGER_TRAP_MAYBE() \ + do { \ + if (kgdb_connected) \ + CHK_DEBUGGER_TRAP(); \ + } while (0) #else # define CHK_DEBUGGER_TRAP() do { } while (0) # define CHK_DEBUGGER_TRAP_MAYBE() do { } while (0) @@ -297,7 +304,8 @@ asmlinkage void trap_c(struct pt_regs *fp) info.si_code = ILL_CPLB_MULHIT; #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO sig = SIGSEGV; - printk(KERN_EMERG "\n\nNULL pointer access (probably)\n"); + printk(KERN_EMERG "\n" + KERN_EMERG "NULL pointer access (probably)\n"); #else sig = SIGILL; printk(KERN_EMERG EXC_0x27); @@ -418,7 +426,9 @@ asmlinkage void trap_c(struct pt_regs *fp) if (current->mm) { fp->pc = current->mm->start_code; } else { - printk(KERN_EMERG "I can't return to memory that doesn't exist - bad things happen\n"); + printk(KERN_EMERG + "I can't return to memory that doesn't exist" + " - bad things happen\n"); panic("Help - I've fallen and can't get up\n"); } } @@ -522,15 +532,19 @@ EXPORT_SYMBOL(dump_stack); void dump_bfin_regs(struct pt_regs *fp, void *retaddr) { if (current->pid) { - printk("\nCURRENT PROCESS:\n\n"); - printk("COMM=%s PID=%d\n", current->comm, current->pid); + printk(KERN_EMERG "\n" KERN_EMERG "CURRENT PROCESS:\n" + KERN_EMERG "\n"); + printk(KERN_EMERG "COMM=%s PID=%d\n", + current->comm, current->pid); } else { printk - ("\nNo Valid pid - Either things are really messed up, or you are in the kernel\n"); + (KERN_EMERG "\n" KERN_EMERG + "No Valid pid - Either things are really messed up," + " or you are in the kernel\n"); } if (current->mm) { - printk("TEXT = 0x%p-0x%p DATA = 0x%p-0x%p\n" + printk(KERN_EMERG "TEXT = 0x%p-0x%p DATA = 0x%p-0x%p\n" "BSS = 0x%p-0x%p USER-STACK = 0x%p\n\n", (void*)current->mm->start_code, (void*)current->mm->end_code, @@ -541,7 +555,7 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr) (void*)current->mm->start_stack); } - printk("return address: 0x%p; contents of [PC-16...PC+8]:\n", retaddr); + printk(KERN_EMERG "return address: [0x%p]; contents of:", retaddr); if (retaddr != 0 && retaddr <= (void*)physical_mem_end #if L1_CODE_LENGTH != 0 /* FIXME: Copy the code out of L1 Instruction SRAM through dma @@ -550,10 +564,15 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr) && retaddr < (void*)(L1_CODE_START + L1_CODE_LENGTH)) #endif ) { - int i = 0; + int i = ((unsigned int)retaddr & 0xFFFFFFF0) - 32; unsigned short x = 0; - for (i = -16; i < 8; i++) { - if (get_user(x, (unsigned short *)retaddr + i)) + for (; i < ((unsigned int)retaddr & 0xFFFFFFF0 ) + 32 ; + i += 2) { + if ( !(i & 0xF) ) + printk(KERN_EMERG "\n" KERN_EMERG + "0x%08x: ", i); + + if (get_user(x, (unsigned short *)i)) break; #ifndef CONFIG_DEBUG_HWERR /* If one of the last few instructions was a STI @@ -561,53 +580,65 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr) * and we just noticed */ if (x >= 0x0040 && x <= 0x0047 && i <= 0) - panic("\n\nWARNING : You should reconfigure the kernel to turn on\n" - " 'Hardware error interrupt debugging'\n" - " The rest of this error is meanless\n"); + panic("\n\nWARNING : You should reconfigure" + " the kernel to turn on\n" + " 'Hardware error interrupt" + " debugging'\n" + " The rest of this error" + " is meanless\n"); #endif - - if (i == -8) - printk("\n"); - if (i == 0) - printk("X\n"); - printk("%04x ", x); + if ( i == (unsigned int)retaddr ) + printk("[%04x]", x); + else + printk(" %04x ", x); } + printk("\n" KERN_EMERG "\n"); } else - printk("Cannot look at the [PC] for it is in unreadable L1 SRAM - sorry\n"); - - printk("\n\n"); - - printk("RETE: %08lx RETN: %08lx RETX: %08lx RETS: %08lx\n", - fp->rete, fp->retn, fp->retx, fp->rets); - printk("IPEND: %04lx SYSCFG: %04lx\n", fp->ipend, fp->syscfg); - printk("SEQSTAT: %08lx SP: %08lx\n", (long)fp->seqstat, (long)fp); - printk("R0: %08lx R1: %08lx R2: %08lx R3: %08lx\n", - fp->r0, fp->r1, fp->r2, fp->r3); - printk("R4: %08lx R5: %08lx R6: %08lx R7: %08lx\n", - fp->r4, fp->r5, fp->r6, fp->r7); - printk("P0: %08lx P1: %08lx P2: %08lx P3: %08lx\n", - fp->p0, fp->p1, fp->p2, fp->p3); - printk("P4: %08lx P5: %08lx FP: %08lx\n", fp->p4, fp->p5, fp->fp); - printk("A0.w: %08lx A0.x: %08lx A1.w: %08lx A1.x: %08lx\n", - fp->a0w, fp->a0x, fp->a1w, fp->a1x); - - printk("LB0: %08lx LT0: %08lx LC0: %08lx\n", fp->lb0, fp->lt0, - fp->lc0); - printk("LB1: %08lx LT1: %08lx LC1: %08lx\n", fp->lb1, fp->lt1, - fp->lc1); - printk("B0: %08lx L0: %08lx M0: %08lx I0: %08lx\n", fp->b0, fp->l0, - fp->m0, fp->i0); - printk("B1: %08lx L1: %08lx M1: %08lx I1: %08lx\n", fp->b1, fp->l1, - fp->m1, fp->i1); - printk("B2: %08lx L2: %08lx M2: %08lx I2: %08lx\n", fp->b2, fp->l2, - fp->m2, fp->i2); - printk("B3: %08lx L3: %08lx M3: %08lx I3: %08lx\n", fp->b3, fp->l3, - fp->m3, fp->i3); - - printk("\nUSP: %08lx ASTAT: %08lx\n", rdusp(), fp->astat); + printk(KERN_EMERG + "Cannot look at the [PC] for it is" + "in unreadable L1 SRAM - sorry\n"); + + + printk(KERN_EMERG + "RETE: %08lx RETN: %08lx RETX: %08lx RETS: %08lx\n", + fp->rete, fp->retn, fp->retx, fp->rets); + printk(KERN_EMERG "IPEND: %04lx SYSCFG: %04lx\n", + fp->ipend, fp->syscfg); + printk(KERN_EMERG "SEQSTAT: %08lx SP: %08lx\n", + (long)fp->seqstat, (long)fp); + printk(KERN_EMERG "R0: %08lx R1: %08lx R2: %08lx R3: %08lx\n", + fp->r0, fp->r1, fp->r2, fp->r3); + printk(KERN_EMERG "R4: %08lx R5: %08lx R6: %08lx R7: %08lx\n", + fp->r4, fp->r5, fp->r6, fp->r7); + printk(KERN_EMERG "P0: %08lx P1: %08lx P2: %08lx P3: %08lx\n", + fp->p0, fp->p1, fp->p2, fp->p3); + printk(KERN_EMERG + "P4: %08lx P5: %08lx FP: %08lx\n", + fp->p4, fp->p5, fp->fp); + printk(KERN_EMERG + "A0.w: %08lx A0.x: %08lx A1.w: %08lx A1.x: %08lx\n", + fp->a0w, fp->a0x, fp->a1w, fp->a1x); + + printk(KERN_EMERG "LB0: %08lx LT0: %08lx LC0: %08lx\n", + fp->lb0, fp->lt0, fp->lc0); + printk(KERN_EMERG "LB1: %08lx LT1: %08lx LC1: %08lx\n", + fp->lb1, fp->lt1, fp->lc1); + printk(KERN_EMERG "B0: %08lx L0: %08lx M0: %08lx I0: %08lx\n", + fp->b0, fp->l0, fp->m0, fp->i0); + printk(KERN_EMERG "B1: %08lx L1: %08lx M1: %08lx I1: %08lx\n", + fp->b1, fp->l1, fp->m1, fp->i1); + printk(KERN_EMERG "B2: %08lx L2: %08lx M2: %08lx I2: %08lx\n", + fp->b2, fp->l2, fp->m2, fp->i2); + printk(KERN_EMERG "B3: %08lx L3: %08lx M3: %08lx I3: %08lx\n", + fp->b3, fp->l3, fp->m3, fp->i3); + + printk(KERN_EMERG "\n" KERN_EMERG "USP: %08lx ASTAT: %08lx\n", + rdusp(), fp->astat); if ((long)fp->seqstat & SEQSTAT_EXCAUSE) { - printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", (void*)bfin_read_DCPLB_FAULT_ADDR()); - printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", (void*)bfin_read_ICPLB_FAULT_ADDR()); + printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", + (void *)bfin_read_DCPLB_FAULT_ADDR()); + printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", + (void *)bfin_read_ICPLB_FAULT_ADDR()); } printk("\n\n"); diff --git a/arch/blackfin/lib/memcmp.S b/arch/blackfin/lib/memcmp.S index a6b8ee6a6bf..b88c5d2d1eb 100644 --- a/arch/blackfin/lib/memcmp.S +++ b/arch/blackfin/lib/memcmp.S @@ -61,7 +61,12 @@ ENTRY(_memcmp) LSETUP (.Lquad_loop_s, .Lquad_loop_e) LC0=P1; .Lquad_loop_s: +#ifdef ANOMALY_05000202 + R0 = [P0++]; + R1 = [I0++]; +#else MNOP || R0 = [P0++] || R1 = [I0++]; +#endif CC = R0 == R1; IF !CC JUMP .Lquad_different; .Lquad_loop_e: diff --git a/arch/blackfin/lib/memcpy.S b/arch/blackfin/lib/memcpy.S index 34b5a91c215..14a5585bbd0 100644 --- a/arch/blackfin/lib/memcpy.S +++ b/arch/blackfin/lib/memcpy.S @@ -94,13 +94,20 @@ ENTRY(_memcpy) .Lmore_than_seven: /* There's at least eight bytes to copy. */ P2 += -1; /* because we unroll one iteration */ - LSETUP(.Lword_loop, .Lword_loop) LC0=P2; + LSETUP(.Lword_loops, .Lword_loope) LC0=P2; R0 = R1; I1 = P1; R3 = [I1++]; -.Lword_loop: +#ifdef ANOMALY_05000202 +.Lword_loops: + [P0++] = R3; +.Lword_loope: + R3 = [I1++]; +#else +.Lword_loops: +.Lword_loope: MNOP || [P0++] = R3 || R3 = [I1++]; - +#endif [P0++] = R3; /* Any remaining bytes to copy? */ R3 = 0x3; diff --git a/arch/blackfin/lib/memmove.S b/arch/blackfin/lib/memmove.S index c371585e9db..6ee6e206e77 100644 --- a/arch/blackfin/lib/memmove.S +++ b/arch/blackfin/lib/memmove.S @@ -69,8 +69,17 @@ ENTRY(_memmove) P2 = R2; /* set remainder */ R1 = [I0++]; - LSETUP (.Lquad_loop, .Lquad_loop) LC0=P1; -.Lquad_loop: MNOP || [P0++] = R1 || R1 = [I0++]; + LSETUP (.Lquad_loops, .Lquad_loope) LC0=P1; +#ifdef ANOMALY_05000202 +.Lquad_loops: + [P0++] = R1; +.Lquad_loope: + R1 = [I0++]; +#else +.Lquad_loops: +.Lquad_loope: + MNOP || [P0++] = R1 || R1 = [I0++]; +#endif [P0++] = R1; CC = P2 == 0; /* any remaining bytes? */ @@ -93,6 +102,10 @@ ENTRY(_memmove) R1 = B[P3--] (Z); CC = P2 == 0; IF CC JUMP .Lno_loop; +#ifdef ANOMALY_05000245 + NOP; + NOP; +#endif LSETUP (.Lol_s, .Lol_e) LC0 = P2; .Lol_s: B[P0--] = R1; .Lol_e: R1 = B[P3--] (Z); diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index 8bd2af1935b..7063795eb7c 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S @@ -123,14 +123,14 @@ ENTRY(_blackfin_icache_flush_range) R2 = R0 & R2; P0 = R2; P1 = R1; - CSYNC; + CSYNC(R3); IFLUSH [P0]; 1: IFLUSH [P0++]; CC = P0 < P1 (iu); IF CC JUMP 1b (bp); IFLUSH [P0]; - SSYNC; + SSYNC(R3); RTS; ENDPROC(_blackfin_icache_flush_range) @@ -148,7 +148,7 @@ ENTRY(_blackfin_icache_dcache_flush_range) R2 = R0 & R2; P0 = R2; P1 = R1; - CSYNC; + CSYNC(R3); IFLUSH [P0]; 1: FLUSH [P0]; @@ -157,7 +157,7 @@ ENTRY(_blackfin_icache_dcache_flush_range) IF CC JUMP 1b (bp); IFLUSH [P0]; FLUSH [P0]; - SSYNC; + SSYNC(R3); RTS; ENDPROC(_blackfin_icache_dcache_flush_range) @@ -174,7 +174,7 @@ ENTRY(_blackfin_dcache_invalidate_range) R2 = R0 & R2; P0 = R2; P1 = R1; - CSYNC; + CSYNC(R3); FLUSHINV[P0]; 1: FLUSHINV[P0++]; @@ -186,7 +186,7 @@ ENTRY(_blackfin_dcache_invalidate_range) * so do one more. */ FLUSHINV[P0]; - SSYNC; + SSYNC(R3); RTS; ENDPROC(_blackfin_dcache_invalidate_range) @@ -235,7 +235,7 @@ ENTRY(_blackfin_dcache_flush_range) R2 = R0 & R2; P0 = R2; P1 = R1; - CSYNC; + CSYNC(R3); FLUSH[P0]; 1: FLUSH[P0++]; @@ -247,17 +247,17 @@ ENTRY(_blackfin_dcache_flush_range) * one more. */ FLUSH[P0]; - SSYNC; + SSYNC(R3); RTS; ENDPROC(_blackfin_dcache_flush_range) ENTRY(_blackfin_dflush_page) P1 = 1 << (PAGE_SHIFT - L1_CACHE_SHIFT); P0 = R0; - CSYNC; + CSYNC(R3); FLUSH[P0]; LSETUP (.Lfl1, .Lfl1) LC0 = P1; .Lfl1: FLUSH [P0++]; - SSYNC; + SSYNC(R3); RTS; ENDPROC(_blackfin_dflush_page) diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S index b69f517a650..8be548e061b 100644 --- a/arch/blackfin/mach-common/interrupt.S +++ b/arch/blackfin/mach-common/interrupt.S @@ -139,7 +139,7 @@ __common_int_entry: fp = 0; #endif -#ifdef ANOMALY_05000283 +#if defined (ANOMALY_05000283) || defined (ANOMALY_05000315) cc = r7 == r7; p5.h = 0xffc0; p5.l = 0x0014; |