aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-05-19 19:33:08 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-05-19 19:33:08 -0400
commitdb07b02304d0d70bf8273abc93d94e4c8d2f9cec (patch)
tree02ff2652fdbf288021bcbcf9af37b79d9aa76254
parent88e6c9499f959cdac9ef120a1a1e857da5944052 (diff)
parent336f1d326831873ffab6de5fcec4b3be05103ae0 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: sh: Fix up restorer in debug_trap exception return path. sh: Make is_valid_bugaddr() more intelligent on nommu. sh: use the common ascii hex helpers sh: fix sh7785 master clock value sh: Fix up thread info pointer in syscall_badsys resume path. sh: Fix up optimized SH-4 memcpy on big endian. sh: disable initrd defaults in .empty_zero_page. sh: display boot params by default on entry.
-rw-r--r--arch/sh/kernel/cpu/sh4a/clock-sh7785.c2
-rw-r--r--arch/sh/kernel/entry-common.S12
-rw-r--r--arch/sh/kernel/head_32.S4
-rw-r--r--arch/sh/kernel/kgdb_stub.c11
-rw-r--r--arch/sh/kernel/setup.c11
-rw-r--r--arch/sh/kernel/traps.c10
-rw-r--r--arch/sh/lib/memcpy-sh4.S22
-rw-r--r--drivers/serial/sh-sci.c8
-rw-r--r--include/asm-sh/kgdb.h14
9 files changed, 49 insertions, 45 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
index 805535aa505e..27fa81bef6a0 100644
--- a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
+++ b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
@@ -26,7 +26,7 @@ static int pfc_divisors[] = { 1, 1, 1, 1, 1, 1, 1, 18,
26 26
27static void master_clk_init(struct clk *clk) 27static void master_clk_init(struct clk *clk)
28{ 28{
29 clk->rate *= 36; 29 clk->rate *= pfc_divisors[ctrl_inl(FRQMR1) & 0x000f];
30} 30}
31 31
32static struct clk_ops sh7785_master_clk_ops = { 32static struct clk_ops sh7785_master_clk_ops = {
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S
index 926b2e7b11c1..718bd2356b34 100644
--- a/arch/sh/kernel/entry-common.S
+++ b/arch/sh/kernel/entry-common.S
@@ -1,9 +1,6 @@
1/* $Id: entry.S,v 1.37 2004/06/11 13:02:46 doyu Exp $ 1/*
2 *
3 * linux/arch/sh/entry.S
4 *
5 * Copyright (C) 1999, 2000, 2002 Niibe Yutaka 2 * Copyright (C) 1999, 2000, 2002 Niibe Yutaka
6 * Copyright (C) 2003 Paul Mundt 3 * Copyright (C) 2003 - 2008 Paul Mundt
7 * 4 *
8 * This file is subject to the terms and conditions of the GNU General Public 5 * This file is subject to the terms and conditions of the GNU General Public
9 * License. See the file "COPYING" in the main directory of this archive 6 * License. See the file "COPYING" in the main directory of this archive
@@ -262,6 +259,7 @@ __restore_all:
262 259
263 .align 2 260 .align 2
264syscall_badsys: ! Bad syscall number 261syscall_badsys: ! Bad syscall number
262 get_current_thread_info r8, r0
265 mov #-ENOSYS, r0 263 mov #-ENOSYS, r0
266 bra resume_userspace 264 bra resume_userspace
267 mov.l r0, @(OFF_R0,r15) ! Return value 265 mov.l r0, @(OFF_R0,r15) ! Return value
@@ -281,7 +279,9 @@ debug_trap:
281 mov.l 1f, r8 279 mov.l 1f, r8
282 add r0, r8 280 add r0, r8
283 mov.l @r8, r8 281 mov.l @r8, r8
284 jmp @r8 282 jsr @r8
283 nop
284 bra __restore_all
285 nop 285 nop
286 286
287 .align 2 287 .align 2
diff --git a/arch/sh/kernel/head_32.S b/arch/sh/kernel/head_32.S
index d67d7ed09f22..ae0a382a82eb 100644
--- a/arch/sh/kernel/head_32.S
+++ b/arch/sh/kernel/head_32.S
@@ -30,8 +30,8 @@ ENTRY(empty_zero_page)
30 .long 0 /* RAMDISK_FLAGS */ 30 .long 0 /* RAMDISK_FLAGS */
31 .long 0x0200 /* ORIG_ROOT_DEV */ 31 .long 0x0200 /* ORIG_ROOT_DEV */
32 .long 1 /* LOADER_TYPE */ 32 .long 1 /* LOADER_TYPE */
33 .long 0x00360000 /* INITRD_START */ 33 .long 0x00000000 /* INITRD_START */
34 .long 0x000a0000 /* INITRD_SIZE */ 34 .long 0x00000000 /* INITRD_SIZE */
35#ifdef CONFIG_32BIT 35#ifdef CONFIG_32BIT
36 .long 0x53453f00 + 32 /* "SE?" = 32 bit */ 36 .long 0x53453f00 + 32 /* "SE?" = 32 bit */
37#else 37#else
diff --git a/arch/sh/kernel/kgdb_stub.c b/arch/sh/kernel/kgdb_stub.c
index 832641bbd47d..bf8ac4c71640 100644
--- a/arch/sh/kernel/kgdb_stub.c
+++ b/arch/sh/kernel/kgdb_stub.c
@@ -274,8 +274,7 @@ static char *mem_to_hex(const char *mem, char *buf, const int count)
274 } 274 }
275 for (i = 0; i < count; i++) { 275 for (i = 0; i < count; i++) {
276 ch = *mem++; 276 ch = *mem++;
277 *buf++ = highhex(ch); 277 buf = pack_hex_byte(buf, ch);
278 *buf++ = lowhex(ch);
279 } 278 }
280 *buf = 0; 279 *buf = 0;
281 return (buf); 280 return (buf);
@@ -427,8 +426,8 @@ static void put_packet(char *buffer)
427 426
428 /* '#' Separator, put high and low components of checksum */ 427 /* '#' Separator, put high and low components of checksum */
429 put_debug_char('#'); 428 put_debug_char('#');
430 put_debug_char(highhex(checksum)); 429 put_debug_char(hex_asc_hi(checksum));
431 put_debug_char(lowhex(checksum)); 430 put_debug_char(hex_asc_lo(checksum));
432 } 431 }
433 while ((get_debug_char()) != '+'); /* While no ack */ 432 while ((get_debug_char()) != '+'); /* While no ack */
434} 433}
@@ -650,8 +649,8 @@ static void undo_single_step(void)
650static void send_signal_msg(const int signum) 649static void send_signal_msg(const int signum)
651{ 650{
652 out_buffer[0] = 'S'; 651 out_buffer[0] = 'S';
653 out_buffer[1] = highhex(signum); 652 out_buffer[1] = hex_asc_hi(signum);
654 out_buffer[2] = lowhex(signum); 653 out_buffer[2] = hex_asc_lo(signum);
655 out_buffer[3] = 0; 654 out_buffer[3] = 0;
656 put_packet(out_buffer); 655 put_packet(out_buffer);
657} 656}
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
index 516bde9c50fa..bca2bbc575db 100644
--- a/arch/sh/kernel/setup.c
+++ b/arch/sh/kernel/setup.c
@@ -292,6 +292,17 @@ void __init setup_arch(char **cmdline_p)
292 292
293 ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); 293 ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
294 294
295 printk(KERN_NOTICE "Boot params:\n"
296 "... MOUNT_ROOT_RDONLY - %08lx\n"
297 "... RAMDISK_FLAGS - %08lx\n"
298 "... ORIG_ROOT_DEV - %08lx\n"
299 "... LOADER_TYPE - %08lx\n"
300 "... INITRD_START - %08lx\n"
301 "... INITRD_SIZE - %08lx\n",
302 MOUNT_ROOT_RDONLY, RAMDISK_FLAGS,
303 ORIG_ROOT_DEV, LOADER_TYPE,
304 INITRD_START, INITRD_SIZE);
305
295#ifdef CONFIG_BLK_DEV_RAM 306#ifdef CONFIG_BLK_DEV_RAM
296 rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; 307 rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
297 rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); 308 rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c
index a3bdc68ef02c..438f1ebcc453 100644
--- a/arch/sh/kernel/traps.c
+++ b/arch/sh/kernel/traps.c
@@ -4,6 +4,7 @@
4#include <linux/kdebug.h> 4#include <linux/kdebug.h>
5#include <linux/signal.h> 5#include <linux/signal.h>
6#include <linux/sched.h> 6#include <linux/sched.h>
7#include <linux/uaccess.h>
7#include <asm/system.h> 8#include <asm/system.h>
8 9
9#ifdef CONFIG_BUG 10#ifdef CONFIG_BUG
@@ -21,7 +22,14 @@ static void handle_BUG(struct pt_regs *regs)
21 22
22int is_valid_bugaddr(unsigned long addr) 23int is_valid_bugaddr(unsigned long addr)
23{ 24{
24 return addr >= PAGE_OFFSET; 25 unsigned short opcode;
26
27 if (addr < PAGE_OFFSET)
28 return 0;
29 if (probe_kernel_address((u16 *)addr, opcode))
30 return 0;
31
32 return opcode == TRAPA_BUG_OPCODE;
25} 33}
26#endif 34#endif
27 35
diff --git a/arch/sh/lib/memcpy-sh4.S b/arch/sh/lib/memcpy-sh4.S
index 560bc17eebdd..459fa92a7c53 100644
--- a/arch/sh/lib/memcpy-sh4.S
+++ b/arch/sh/lib/memcpy-sh4.S
@@ -126,10 +126,10 @@
126 126
127 mov.l r3,@-r0 ! 30 LS 127 mov.l r3,@-r0 ! 30 LS
128#else 128#else
1293: mov r1,r3 ! OPQR 1293: mov r7,r3 ! OPQR
130 shlr8 r3 ! xOPQ 130 shlr8 r3 ! xOPQ
131 mov.l @(r0,r5),r1 ! KLMN 131 mov.l @(r0,r5),r7 ! KLMN
132 mov r1,r6 132 mov r7,r6
133 shll16 r6 133 shll16 r6
134 shll8 r6 ! Nxxx 134 shll8 r6 ! Nxxx
135 or r6,r3 ! NOPQ 135 or r6,r3 ! NOPQ
@@ -733,24 +733,24 @@ ENTRY(memcpy)
733 movca.l r0,@r1 ! 40 LS (latency=3-7) 733 movca.l r0,@r1 ! 40 LS (latency=3-7)
734 add #-0x1c, r1 ! 50 EX 734 add #-0x1c, r1 ! 50 EX
735 735
736 mov.l r3, @(0x1c,r1) ! 33 LS 736 mov.l r3, @(0x18,r1) ! 33 LS
737 xtrct r11, r10 ! 48 EX 737 xtrct r11, r10 ! 48 EX
738 738
739 mov.l r6, @(0x18,r1) ! 33 LS 739 mov.l r6, @(0x14,r1) ! 33 LS
740 xtrct r12, r11 ! 48 EX 740 xtrct r12, r11 ! 48 EX
741 741
742 mov.l r7, @(0x14,r1) ! 33 LS 742 mov.l r7, @(0x10,r1) ! 33 LS
743 743
744 mov.l r8, @(0x10,r1) ! 33 LS 744 mov.l r8, @(0x0c,r1) ! 33 LS
745 add #-0x3e, r5 ! 50 EX 745 add #-0x1e, r5 ! 50 EX
746 746
747 mov.l r9, @(0x0c,r1) ! 33 LS 747 mov.l r9, @(0x08,r1) ! 33 LS
748 cmp/eq r2,r1 ! 54 MT 748 cmp/eq r2,r1 ! 54 MT
749 749
750 mov.l r10, @(0x08,r1) ! 33 LS 750 mov.l r10, @(0x04,r1) ! 33 LS
751 bf/s 2b ! 109 BR 751 bf/s 2b ! 109 BR
752 752
753 mov.l r11, @(0x04,r1) ! 33 LS 753 mov.l r11, @(0x00,r1) ! 33 LS
754#endif 754#endif
755 755
756 mov.l @r15+, r12 756 mov.l @r15+, r12
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c
index 8fdafc27fce8..ce6ee92b3a1b 100644
--- a/drivers/serial/sh-sci.c
+++ b/drivers/serial/sh-sci.c
@@ -184,15 +184,15 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count)
184 int h, l; 184 int h, l;
185 185
186 c = *p++; 186 c = *p++;
187 h = highhex(c); 187 h = hex_asc_hi(c);
188 l = lowhex(c); 188 l = hex_asc_lo(c);
189 put_char(port, h); 189 put_char(port, h);
190 put_char(port, l); 190 put_char(port, l);
191 checksum += h + l; 191 checksum += h + l;
192 } 192 }
193 put_char(port, '#'); 193 put_char(port, '#');
194 put_char(port, highhex(checksum)); 194 put_char(port, hex_asc_hi(checksum));
195 put_char(port, lowhex(checksum)); 195 put_char(port, hex_asc_lo(checksum));
196 } while (get_char(port) != '+'); 196 } while (get_char(port) != '+');
197 } else 197 } else
198#endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */ 198#endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */
diff --git a/include/asm-sh/kgdb.h b/include/asm-sh/kgdb.h
index 4bc8cb187d11..24e42078f36f 100644
--- a/include/asm-sh/kgdb.h
+++ b/include/asm-sh/kgdb.h
@@ -66,18 +66,4 @@ extern int setjmp(jmp_buf __jmpb);
66/* Forced breakpoint */ 66/* Forced breakpoint */
67#define breakpoint() __asm__ __volatile__("trapa #0x3c") 67#define breakpoint() __asm__ __volatile__("trapa #0x3c")
68 68
69/* Taken from sh-stub.c of GDB 4.18 */
70static const char hexchars[] = "0123456789abcdef";
71
72/* Get high hex bits */
73static inline char highhex(const int x)
74{
75 return hexchars[(x >> 4) & 0xf];
76}
77
78/* Get low hex bits */
79static inline char lowhex(const int x)
80{
81 return hexchars[x & 0xf];
82}
83#endif 69#endif