diff options
| author | J. Bruce Fields <bfields@citi.umich.edu> | 2008-07-03 16:24:06 -0400 |
|---|---|---|
| committer | J. Bruce Fields <bfields@citi.umich.edu> | 2008-07-03 16:24:06 -0400 |
| commit | e86322f611eef95aafaf726fd3965e5b211f1985 (patch) | |
| tree | 28547e26df4fc6ae671dc8cc6912a53717e4db08 /arch/sh/kernel | |
| parent | b001a1b6aa960949a24c2cdc28257dfcc9428d74 (diff) | |
| parent | 8948896c9e098c6fd31a6a698a598a7cbd7fa40e (diff) | |
Merge branch 'for-bfields' of git://linux-nfs.org/~tomtucker/xprt-switch-2.6 into for-2.6.27
Diffstat (limited to 'arch/sh/kernel')
| -rw-r--r-- | arch/sh/kernel/cpu/irq/intc-sh5.c | 1 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh4/probe.c | 1 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/clock-sh7785.c | 2 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7722.c | 2 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7723.c | 49 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7763.c | 9 | ||||
| -rw-r--r-- | arch/sh/kernel/entry-common.S | 12 | ||||
| -rw-r--r-- | arch/sh/kernel/head_32.S | 4 | ||||
| -rw-r--r-- | arch/sh/kernel/init_task.c | 1 | ||||
| -rw-r--r-- | arch/sh/kernel/kgdb_stub.c | 11 | ||||
| -rw-r--r-- | arch/sh/kernel/module.c | 39 | ||||
| -rw-r--r-- | arch/sh/kernel/setup.c | 11 | ||||
| -rw-r--r-- | arch/sh/kernel/traps.c | 10 |
13 files changed, 89 insertions, 63 deletions
diff --git a/arch/sh/kernel/cpu/irq/intc-sh5.c b/arch/sh/kernel/cpu/irq/intc-sh5.c index de45c6a3e33b..79baa47af977 100644 --- a/arch/sh/kernel/cpu/irq/intc-sh5.c +++ b/arch/sh/kernel/cpu/irq/intc-sh5.c | |||
| @@ -242,6 +242,7 @@ void __init plat_irq_setup(void) | |||
| 242 | reg += 8; | 242 | reg += 8; |
| 243 | } | 243 | } |
| 244 | } | 244 | } |
| 245 | } | ||
| 245 | #endif | 246 | #endif |
| 246 | 247 | ||
| 247 | /* | 248 | /* |
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index ebceb0dadff5..be4926969181 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
| @@ -132,6 +132,7 @@ int __init detect_cpu_and_cache_system(void) | |||
| 132 | 132 | ||
| 133 | switch (prr) { | 133 | switch (prr) { |
| 134 | case 0x50: | 134 | case 0x50: |
| 135 | case 0x51: | ||
| 135 | boot_cpu_data.type = CPU_SH7723; | 136 | boot_cpu_data.type = CPU_SH7723; |
| 136 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_L2_CACHE; | 137 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_L2_CACHE; |
| 137 | break; | 138 | break; |
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 | ||
| 27 | static void master_clk_init(struct clk *clk) | 27 | static 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 | ||
| 32 | static struct clk_ops sh7785_master_clk_ops = { | 32 | static struct clk_ops sh7785_master_clk_ops = { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c index 069314037049..62ebccf18b3c 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | static struct resource usbf_resources[] = { | 17 | static struct resource usbf_resources[] = { |
| 18 | [0] = { | 18 | [0] = { |
| 19 | .name = "USBF", | 19 | .name = "m66592_udc", |
| 20 | .start = 0x04480000, | 20 | .start = 0x04480000, |
| 21 | .end = 0x044800FF, | 21 | .end = 0x044800FF, |
| 22 | .flags = IORESOURCE_MEM, | 22 | .flags = IORESOURCE_MEM, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index 16925cf28db8..a0470f2f5479 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
| @@ -16,6 +16,21 @@ | |||
| 16 | 16 | ||
| 17 | static struct plat_sci_port sci_platform_data[] = { | 17 | static struct plat_sci_port sci_platform_data[] = { |
| 18 | { | 18 | { |
| 19 | .mapbase = 0xffe00000, | ||
| 20 | .flags = UPF_BOOT_AUTOCONF, | ||
| 21 | .type = PORT_SCIF, | ||
| 22 | .irqs = { 80, 80, 80, 80 }, | ||
| 23 | },{ | ||
| 24 | .mapbase = 0xffe10000, | ||
| 25 | .flags = UPF_BOOT_AUTOCONF, | ||
| 26 | .type = PORT_SCIF, | ||
| 27 | .irqs = { 81, 81, 81, 81 }, | ||
| 28 | },{ | ||
| 29 | .mapbase = 0xffe20000, | ||
| 30 | .flags = UPF_BOOT_AUTOCONF, | ||
| 31 | .type = PORT_SCIF, | ||
| 32 | .irqs = { 82, 82, 82, 82 }, | ||
| 33 | },{ | ||
| 19 | .mapbase = 0xa4e30000, | 34 | .mapbase = 0xa4e30000, |
| 20 | .flags = UPF_BOOT_AUTOCONF, | 35 | .flags = UPF_BOOT_AUTOCONF, |
| 21 | .type = PORT_SCI, | 36 | .type = PORT_SCI, |
| @@ -73,9 +88,35 @@ static struct platform_device rtc_device = { | |||
| 73 | .resource = rtc_resources, | 88 | .resource = rtc_resources, |
| 74 | }; | 89 | }; |
| 75 | 90 | ||
| 91 | static struct resource sh7723_usb_host_resources[] = { | ||
| 92 | [0] = { | ||
| 93 | .name = "r8a66597_hcd", | ||
| 94 | .start = 0xa4d80000, | ||
| 95 | .end = 0xa4d800ff, | ||
| 96 | .flags = IORESOURCE_MEM, | ||
| 97 | }, | ||
| 98 | [1] = { | ||
| 99 | .start = 65, | ||
| 100 | .end = 65, | ||
| 101 | .flags = IORESOURCE_IRQ, | ||
| 102 | }, | ||
| 103 | }; | ||
| 104 | |||
| 105 | static struct platform_device sh7723_usb_host_device = { | ||
| 106 | .name = "r8a66597_hcd", | ||
| 107 | .id = 0, | ||
| 108 | .dev = { | ||
| 109 | .dma_mask = NULL, /* not use dma */ | ||
| 110 | .coherent_dma_mask = 0xffffffff, | ||
| 111 | }, | ||
| 112 | .num_resources = ARRAY_SIZE(sh7723_usb_host_resources), | ||
| 113 | .resource = sh7723_usb_host_resources, | ||
| 114 | }; | ||
| 115 | |||
| 76 | static struct platform_device *sh7723_devices[] __initdata = { | 116 | static struct platform_device *sh7723_devices[] __initdata = { |
| 77 | &sci_device, | 117 | &sci_device, |
| 78 | &rtc_device, | 118 | &rtc_device, |
| 119 | &sh7723_usb_host_device, | ||
| 79 | }; | 120 | }; |
| 80 | 121 | ||
| 81 | static int __init sh7723_devices_setup(void) | 122 | static int __init sh7723_devices_setup(void) |
| @@ -153,7 +194,7 @@ static struct intc_vect vectors[] __initdata = { | |||
| 153 | INTC_VECT(VIO_VOUI,0x8E0), | 194 | INTC_VECT(VIO_VOUI,0x8E0), |
| 154 | 195 | ||
| 155 | INTC_VECT(SCIFA_SCIFA0,0x900), | 196 | INTC_VECT(SCIFA_SCIFA0,0x900), |
| 156 | INTC_VECT(VPU_VPUI,0x920), | 197 | INTC_VECT(VPU_VPUI,0x980), |
| 157 | INTC_VECT(TPU_TPUI,0x9A0), | 198 | INTC_VECT(TPU_TPUI,0x9A0), |
| 158 | INTC_VECT(ADC_ADI,0x9E0), | 199 | INTC_VECT(ADC_ADI,0x9E0), |
| 159 | INTC_VECT(USB_USI0,0xA20), | 200 | INTC_VECT(USB_USI0,0xA20), |
| @@ -292,9 +333,3 @@ void __init plat_irq_setup(void) | |||
| 292 | { | 333 | { |
| 293 | register_intc_controller(&intc_desc); | 334 | register_intc_controller(&intc_desc); |
| 294 | } | 335 | } |
| 295 | |||
| 296 | void __init plat_mem_setup(void) | ||
| 297 | { | ||
| 298 | /* Register the URAM space as Node 1 */ | ||
| 299 | setup_bootmem_node(1, 0x055f0000, 0x05610000); | ||
| 300 | } | ||
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index ae2b22219f02..f189a559462b 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c | |||
| @@ -291,8 +291,9 @@ static struct intc_sense_reg irq_sense_registers[] __initdata = { | |||
| 291 | }; | 291 | }; |
| 292 | 292 | ||
| 293 | static DECLARE_INTC_DESC(intc_irq_desc, "sh7763-irq", irq_vectors, | 293 | static DECLARE_INTC_DESC(intc_irq_desc, "sh7763-irq", irq_vectors, |
| 294 | NULL, NULL, irq_mask_registers, irq_prio_registers, | 294 | NULL, irq_mask_registers, irq_prio_registers, |
| 295 | irq_sense_registers); | 295 | irq_sense_registers); |
| 296 | |||
| 296 | 297 | ||
| 297 | /* External interrupt pins in IRL mode */ | 298 | /* External interrupt pins in IRL mode */ |
| 298 | static struct intc_vect irl_vectors[] __initdata = { | 299 | static struct intc_vect irl_vectors[] __initdata = { |
| @@ -324,10 +325,10 @@ static struct intc_mask_reg irl7654_mask_registers[] __initdata = { | |||
| 324 | }; | 325 | }; |
| 325 | 326 | ||
| 326 | static DECLARE_INTC_DESC(intc_irl7654_desc, "sh7763-irl7654", irl_vectors, | 327 | static DECLARE_INTC_DESC(intc_irl7654_desc, "sh7763-irl7654", irl_vectors, |
| 327 | NULL, NULL, irl7654_mask_registers, NULL, NULL); | 328 | NULL, irl7654_mask_registers, NULL, NULL); |
| 328 | 329 | ||
| 329 | static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7763-irl3210", irl_vectors, | 330 | static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7763-irl3210", irl_vectors, |
| 330 | NULL, NULL, irl3210_mask_registers, NULL, NULL); | 331 | NULL, irl3210_mask_registers, NULL, NULL); |
| 331 | 332 | ||
| 332 | #define INTC_ICR0 0xffd00000 | 333 | #define INTC_ICR0 0xffd00000 |
| 333 | #define INTC_INTMSK0 0xffd00044 | 334 | #define INTC_INTMSK0 0xffd00044 |
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 |
| 264 | syscall_badsys: ! Bad syscall number | 261 | syscall_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/init_task.c b/arch/sh/kernel/init_task.c index f9bcc606127e..b151a25cb14d 100644 --- a/arch/sh/kernel/init_task.c +++ b/arch/sh/kernel/init_task.c | |||
| @@ -8,7 +8,6 @@ | |||
| 8 | #include <asm/pgtable.h> | 8 | #include <asm/pgtable.h> |
| 9 | 9 | ||
| 10 | static struct fs_struct init_fs = INIT_FS; | 10 | static struct fs_struct init_fs = INIT_FS; |
| 11 | static struct files_struct init_files = INIT_FILES; | ||
| 12 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 11 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
| 13 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 12 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
| 14 | struct pt_regs fake_swapper_regs; | 13 | struct pt_regs fake_swapper_regs; |
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) | |||
| 650 | static void send_signal_msg(const int signum) | 649 | static 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/module.c b/arch/sh/kernel/module.c index b3d0a03b4c76..5482e65375a9 100644 --- a/arch/sh/kernel/module.c +++ b/arch/sh/kernel/module.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/fs.h> | 30 | #include <linux/fs.h> |
| 31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
| 32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
| 33 | #include <asm/unaligned.h> | ||
| 33 | 34 | ||
| 34 | void *module_alloc(unsigned long size) | 35 | void *module_alloc(unsigned long size) |
| 35 | { | 36 | { |
| @@ -56,34 +57,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, | |||
| 56 | return 0; | 57 | return 0; |
| 57 | } | 58 | } |
| 58 | 59 | ||
| 59 | #ifdef CONFIG_SUPERH32 | ||
| 60 | #define COPY_UNALIGNED_WORD(sw, tw, align) \ | ||
| 61 | { \ | ||
| 62 | void *__s = &(sw), *__t = &(tw); \ | ||
| 63 | unsigned short *__s2 = __s, *__t2 = __t; \ | ||
| 64 | unsigned char *__s1 = __s, *__t1 = __t; \ | ||
| 65 | switch ((align)) \ | ||
| 66 | { \ | ||
| 67 | case 0: \ | ||
| 68 | *(unsigned long *) __t = *(unsigned long *) __s; \ | ||
| 69 | break; \ | ||
| 70 | case 2: \ | ||
| 71 | *__t2++ = *__s2++; \ | ||
| 72 | *__t2 = *__s2; \ | ||
| 73 | break; \ | ||
| 74 | default: \ | ||
| 75 | *__t1++ = *__s1++; \ | ||
| 76 | *__t1++ = *__s1++; \ | ||
| 77 | *__t1++ = *__s1++; \ | ||
| 78 | *__t1 = *__s1; \ | ||
| 79 | break; \ | ||
| 80 | } \ | ||
| 81 | } | ||
| 82 | #else | ||
| 83 | /* One thing SHmedia doesn't screw up! */ | ||
| 84 | #define COPY_UNALIGNED_WORD(sw, tw, align) { (tw) = (sw); } | ||
| 85 | #endif | ||
| 86 | |||
| 87 | int apply_relocate_add(Elf32_Shdr *sechdrs, | 60 | int apply_relocate_add(Elf32_Shdr *sechdrs, |
| 88 | const char *strtab, | 61 | const char *strtab, |
| 89 | unsigned int symindex, | 62 | unsigned int symindex, |
| @@ -96,7 +69,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
| 96 | Elf32_Addr relocation; | 69 | Elf32_Addr relocation; |
| 97 | uint32_t *location; | 70 | uint32_t *location; |
| 98 | uint32_t value; | 71 | uint32_t value; |
| 99 | int align; | ||
| 100 | 72 | ||
| 101 | pr_debug("Applying relocate section %u to %u\n", relsec, | 73 | pr_debug("Applying relocate section %u to %u\n", relsec, |
| 102 | sechdrs[relsec].sh_info); | 74 | sechdrs[relsec].sh_info); |
| @@ -109,7 +81,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
| 109 | sym = (Elf32_Sym *)sechdrs[symindex].sh_addr | 81 | sym = (Elf32_Sym *)sechdrs[symindex].sh_addr |
| 110 | + ELF32_R_SYM(rel[i].r_info); | 82 | + ELF32_R_SYM(rel[i].r_info); |
| 111 | relocation = sym->st_value + rel[i].r_addend; | 83 | relocation = sym->st_value + rel[i].r_addend; |
| 112 | align = (int)location & 3; | ||
| 113 | 84 | ||
| 114 | #ifdef CONFIG_SUPERH64 | 85 | #ifdef CONFIG_SUPERH64 |
| 115 | /* For text addresses, bit2 of the st_other field indicates | 86 | /* For text addresses, bit2 of the st_other field indicates |
| @@ -122,15 +93,15 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
| 122 | 93 | ||
| 123 | switch (ELF32_R_TYPE(rel[i].r_info)) { | 94 | switch (ELF32_R_TYPE(rel[i].r_info)) { |
| 124 | case R_SH_DIR32: | 95 | case R_SH_DIR32: |
| 125 | COPY_UNALIGNED_WORD (*location, value, align); | 96 | value = get_unaligned(location); |
| 126 | value += relocation; | 97 | value += relocation; |
| 127 | COPY_UNALIGNED_WORD (value, *location, align); | 98 | put_unaligned(value, location); |
| 128 | break; | 99 | break; |
| 129 | case R_SH_REL32: | 100 | case R_SH_REL32: |
| 130 | relocation = (relocation - (Elf32_Addr) location); | 101 | relocation = (relocation - (Elf32_Addr) location); |
| 131 | COPY_UNALIGNED_WORD (*location, value, align); | 102 | value = get_unaligned(location); |
| 132 | value += relocation; | 103 | value += relocation; |
| 133 | COPY_UNALIGNED_WORD (value, *location, align); | 104 | put_unaligned(value, location); |
| 134 | break; | 105 | break; |
| 135 | case R_SH_IMM_LOW16: | 106 | case R_SH_IMM_LOW16: |
| 136 | *location = (*location & ~0x3fffc00) | | 107 | *location = (*location & ~0x3fffc00) | |
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 | ||
| 22 | int is_valid_bugaddr(unsigned long addr) | 23 | int 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 | ||
