diff options
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/cpu-bugs64.c | 8 | ||||
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/module.c | 6 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-o32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/setup.c | 18 | ||||
| -rw-r--r-- | arch/mips/kernel/smp.c | 5 | ||||
| -rw-r--r-- | arch/mips/kernel/syscall.c | 3 | ||||
| -rw-r--r-- | arch/mips/kernel/traps.c | 19 |
8 files changed, 44 insertions, 19 deletions
diff --git a/arch/mips/kernel/cpu-bugs64.c b/arch/mips/kernel/cpu-bugs64.c index 47a087b6c11b..d268827c62bd 100644 --- a/arch/mips/kernel/cpu-bugs64.c +++ b/arch/mips/kernel/cpu-bugs64.c | |||
| @@ -206,7 +206,7 @@ static inline void check_daddi(void) | |||
| 206 | "daddi %0, %1, %3\n\t" | 206 | "daddi %0, %1, %3\n\t" |
| 207 | ".set pop" | 207 | ".set pop" |
| 208 | : "=r" (v), "=&r" (tmp) | 208 | : "=r" (v), "=&r" (tmp) |
| 209 | : "I" (0xffffffffffffdb9a), "I" (0x1234)); | 209 | : "I" (0xffffffffffffdb9aUL), "I" (0x1234)); |
| 210 | set_except_vector(12, handler); | 210 | set_except_vector(12, handler); |
| 211 | local_irq_restore(flags); | 211 | local_irq_restore(flags); |
| 212 | 212 | ||
| @@ -224,7 +224,7 @@ static inline void check_daddi(void) | |||
| 224 | "dsrl %1, %1, 1\n\t" | 224 | "dsrl %1, %1, 1\n\t" |
| 225 | "daddi %0, %1, %3" | 225 | "daddi %0, %1, %3" |
| 226 | : "=r" (v), "=&r" (tmp) | 226 | : "=r" (v), "=&r" (tmp) |
| 227 | : "I" (0xffffffffffffdb9a), "I" (0x1234)); | 227 | : "I" (0xffffffffffffdb9aUL), "I" (0x1234)); |
| 228 | set_except_vector(12, handler); | 228 | set_except_vector(12, handler); |
| 229 | local_irq_restore(flags); | 229 | local_irq_restore(flags); |
| 230 | 230 | ||
| @@ -280,7 +280,7 @@ static inline void check_daddiu(void) | |||
| 280 | "daddu %1, %2\n\t" | 280 | "daddu %1, %2\n\t" |
| 281 | ".set pop" | 281 | ".set pop" |
| 282 | : "=&r" (v), "=&r" (w), "=&r" (tmp) | 282 | : "=&r" (v), "=&r" (w), "=&r" (tmp) |
| 283 | : "I" (0xffffffffffffdb9a), "I" (0x1234)); | 283 | : "I" (0xffffffffffffdb9aUL), "I" (0x1234)); |
| 284 | 284 | ||
| 285 | if (v == w) { | 285 | if (v == w) { |
| 286 | printk("no.\n"); | 286 | printk("no.\n"); |
| @@ -296,7 +296,7 @@ static inline void check_daddiu(void) | |||
| 296 | "addiu %1, $0, %4\n\t" | 296 | "addiu %1, $0, %4\n\t" |
| 297 | "daddu %1, %2" | 297 | "daddu %1, %2" |
| 298 | : "=&r" (v), "=&r" (w), "=&r" (tmp) | 298 | : "=&r" (v), "=&r" (w), "=&r" (tmp) |
| 299 | : "I" (0xffffffffffffdb9a), "I" (0x1234)); | 299 | : "I" (0xffffffffffffdb9aUL), "I" (0x1234)); |
| 300 | 300 | ||
| 301 | if (v == w) { | 301 | if (v == w) { |
| 302 | printk("yes.\n"); | 302 | printk("yes.\n"); |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index bef3e2dc7c52..8c2c359a05f4 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -655,7 +655,7 @@ static inline void cpu_probe_sibyte(struct cpuinfo_mips *c) | |||
| 655 | case PRID_IMP_SB1: | 655 | case PRID_IMP_SB1: |
| 656 | c->cputype = CPU_SB1; | 656 | c->cputype = CPU_SB1; |
| 657 | /* FPU in pass1 is known to have issues. */ | 657 | /* FPU in pass1 is known to have issues. */ |
| 658 | if ((c->processor_id & 0xff) < 0x20) | 658 | if ((c->processor_id & 0xff) < 0x02) |
| 659 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); | 659 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); |
| 660 | break; | 660 | break; |
| 661 | case PRID_IMP_SB1A: | 661 | case PRID_IMP_SB1A: |
diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c index e54a7f442f8a..d7bf0215bc1d 100644 --- a/arch/mips/kernel/module.c +++ b/arch/mips/kernel/module.c | |||
| @@ -288,6 +288,9 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, | |||
| 288 | sym = (Elf_Sym *)sechdrs[symindex].sh_addr | 288 | sym = (Elf_Sym *)sechdrs[symindex].sh_addr |
| 289 | + ELF_MIPS_R_SYM(rel[i]); | 289 | + ELF_MIPS_R_SYM(rel[i]); |
| 290 | if (!sym->st_value) { | 290 | if (!sym->st_value) { |
| 291 | /* Ignore unresolved weak symbol */ | ||
| 292 | if (ELF_ST_BIND(sym->st_info) == STB_WEAK) | ||
| 293 | continue; | ||
| 291 | printk(KERN_WARNING "%s: Unknown symbol %s\n", | 294 | printk(KERN_WARNING "%s: Unknown symbol %s\n", |
| 292 | me->name, strtab + sym->st_name); | 295 | me->name, strtab + sym->st_name); |
| 293 | return -ENOENT; | 296 | return -ENOENT; |
| @@ -325,6 +328,9 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, | |||
| 325 | sym = (Elf_Sym *)sechdrs[symindex].sh_addr | 328 | sym = (Elf_Sym *)sechdrs[symindex].sh_addr |
| 326 | + ELF_MIPS_R_SYM(rel[i]); | 329 | + ELF_MIPS_R_SYM(rel[i]); |
| 327 | if (!sym->st_value) { | 330 | if (!sym->st_value) { |
| 331 | /* Ignore unresolved weak symbol */ | ||
| 332 | if (ELF_ST_BIND(sym->st_info) == STB_WEAK) | ||
| 333 | continue; | ||
| 328 | printk(KERN_WARNING "%s: Unknown symbol %s\n", | 334 | printk(KERN_WARNING "%s: Unknown symbol %s\n", |
| 329 | me->name, strtab + sym->st_name); | 335 | me->name, strtab + sym->st_name); |
| 330 | return -ENOENT; | 336 | return -ENOENT; |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index b53a9207f530..8efb23a84131 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
| @@ -209,7 +209,7 @@ sys_call_table: | |||
| 209 | PTR sys_fork | 209 | PTR sys_fork |
| 210 | PTR sys_read | 210 | PTR sys_read |
| 211 | PTR sys_write | 211 | PTR sys_write |
| 212 | PTR sys_open /* 4005 */ | 212 | PTR compat_sys_open /* 4005 */ |
| 213 | PTR sys_close | 213 | PTR sys_close |
| 214 | PTR sys_waitpid | 214 | PTR sys_waitpid |
| 215 | PTR sys_creat | 215 | PTR sys_creat |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index bcf1b10e518f..397a70e651b5 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
| @@ -246,7 +246,7 @@ static inline int parse_rd_cmdline(unsigned long* rd_start, unsigned long* rd_en | |||
| 246 | #ifdef CONFIG_64BIT | 246 | #ifdef CONFIG_64BIT |
| 247 | /* HACK: Guess if the sign extension was forgotten */ | 247 | /* HACK: Guess if the sign extension was forgotten */ |
| 248 | if (start > 0x0000000080000000 && start < 0x00000000ffffffff) | 248 | if (start > 0x0000000080000000 && start < 0x00000000ffffffff) |
| 249 | start |= 0xffffffff00000000; | 249 | start |= 0xffffffff00000000UL; |
| 250 | #endif | 250 | #endif |
| 251 | 251 | ||
| 252 | end = start + size; | 252 | end = start + size; |
| @@ -355,8 +355,6 @@ static inline void bootmem_init(void) | |||
| 355 | } | 355 | } |
| 356 | #endif | 356 | #endif |
| 357 | 357 | ||
| 358 | memory_present(0, first_usable_pfn, max_low_pfn); | ||
| 359 | |||
| 360 | /* Initialize the boot-time allocator with low memory only. */ | 358 | /* Initialize the boot-time allocator with low memory only. */ |
| 361 | bootmap_size = init_bootmem(first_usable_pfn, max_low_pfn); | 359 | bootmap_size = init_bootmem(first_usable_pfn, max_low_pfn); |
| 362 | 360 | ||
| @@ -410,6 +408,7 @@ static inline void bootmem_init(void) | |||
| 410 | 408 | ||
| 411 | /* Register lowmem ranges */ | 409 | /* Register lowmem ranges */ |
| 412 | free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size)); | 410 | free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size)); |
| 411 | memory_present(0, curr_pfn, curr_pfn + size - 1); | ||
| 413 | } | 412 | } |
| 414 | 413 | ||
| 415 | /* Reserve the bootmap memory. */ | 414 | /* Reserve the bootmap memory. */ |
| @@ -419,17 +418,20 @@ static inline void bootmem_init(void) | |||
| 419 | #ifdef CONFIG_BLK_DEV_INITRD | 418 | #ifdef CONFIG_BLK_DEV_INITRD |
| 420 | initrd_below_start_ok = 1; | 419 | initrd_below_start_ok = 1; |
| 421 | if (initrd_start) { | 420 | if (initrd_start) { |
| 422 | unsigned long initrd_size = ((unsigned char *)initrd_end) - ((unsigned char *)initrd_start); | 421 | unsigned long initrd_size = ((unsigned char *)initrd_end) - |
| 422 | ((unsigned char *)initrd_start); | ||
| 423 | const int width = sizeof(long) * 2; | ||
| 424 | |||
| 423 | printk("Initial ramdisk at: 0x%p (%lu bytes)\n", | 425 | printk("Initial ramdisk at: 0x%p (%lu bytes)\n", |
| 424 | (void *)initrd_start, initrd_size); | 426 | (void *)initrd_start, initrd_size); |
| 425 | 427 | ||
| 426 | if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) { | 428 | if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) { |
| 427 | printk("initrd extends beyond end of memory " | 429 | printk("initrd extends beyond end of memory " |
| 428 | "(0x%0*Lx > 0x%0*Lx)\ndisabling initrd\n", | 430 | "(0x%0*Lx > 0x%0*Lx)\ndisabling initrd\n", |
| 429 | sizeof(long) * 2, | 431 | width, |
| 430 | (unsigned long long)CPHYSADDR(initrd_end), | 432 | (unsigned long long) CPHYSADDR(initrd_end), |
| 431 | sizeof(long) * 2, | 433 | width, |
| 432 | (unsigned long long)PFN_PHYS(max_low_pfn)); | 434 | (unsigned long long) PFN_PHYS(max_low_pfn)); |
| 433 | initrd_start = initrd_end = 0; | 435 | initrd_start = initrd_end = 0; |
| 434 | initrd_reserve_bootmem = 0; | 436 | initrd_reserve_bootmem = 0; |
| 435 | } | 437 | } |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index d42f358754ad..298f82fe8440 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -247,6 +247,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 247 | current_thread_info()->cpu = 0; | 247 | current_thread_info()->cpu = 0; |
| 248 | smp_tune_scheduling(); | 248 | smp_tune_scheduling(); |
| 249 | plat_prepare_cpus(max_cpus); | 249 | plat_prepare_cpus(max_cpus); |
| 250 | #ifndef CONFIG_HOTPLUG_CPU | ||
| 251 | cpu_present_map = cpu_possible_map; | ||
| 252 | #endif | ||
| 250 | } | 253 | } |
| 251 | 254 | ||
| 252 | /* preload SMP state for boot cpu */ | 255 | /* preload SMP state for boot cpu */ |
| @@ -442,7 +445,7 @@ static int __init topology_init(void) | |||
| 442 | int cpu; | 445 | int cpu; |
| 443 | int ret; | 446 | int ret; |
| 444 | 447 | ||
| 445 | for_each_cpu(cpu) { | 448 | for_each_present_cpu(cpu) { |
| 446 | ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu, NULL); | 449 | ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu, NULL); |
| 447 | if (ret) | 450 | if (ret) |
| 448 | printk(KERN_WARNING "topology_init: register_cpu %d " | 451 | printk(KERN_WARNING "topology_init: register_cpu %d " |
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 8f4fdd94dbd0..5e8a18a8e2bd 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c | |||
| @@ -276,8 +276,7 @@ void sys_set_thread_area(unsigned long addr) | |||
| 276 | 276 | ||
| 277 | asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) | 277 | asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) |
| 278 | { | 278 | { |
| 279 | int tmp, len; | 279 | int tmp; |
| 280 | char __user *name; | ||
| 281 | 280 | ||
| 282 | switch(cmd) { | 281 | switch(cmd) { |
| 283 | case MIPS_ATOMIC_SET: | 282 | case MIPS_ATOMIC_SET: |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 35cb08da3820..a7564b08eb4d 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -819,15 +819,30 @@ asmlinkage void do_watch(struct pt_regs *regs) | |||
| 819 | 819 | ||
| 820 | asmlinkage void do_mcheck(struct pt_regs *regs) | 820 | asmlinkage void do_mcheck(struct pt_regs *regs) |
| 821 | { | 821 | { |
| 822 | const int field = 2 * sizeof(unsigned long); | ||
| 823 | int multi_match = regs->cp0_status & ST0_TS; | ||
| 824 | |||
| 822 | show_regs(regs); | 825 | show_regs(regs); |
| 823 | dump_tlb_all(); | 826 | |
| 827 | if (multi_match) { | ||
| 828 | printk("Index : %0x\n", read_c0_index()); | ||
| 829 | printk("Pagemask: %0x\n", read_c0_pagemask()); | ||
| 830 | printk("EntryHi : %0*lx\n", field, read_c0_entryhi()); | ||
| 831 | printk("EntryLo0: %0*lx\n", field, read_c0_entrylo0()); | ||
| 832 | printk("EntryLo1: %0*lx\n", field, read_c0_entrylo1()); | ||
| 833 | printk("\n"); | ||
| 834 | dump_tlb_all(); | ||
| 835 | } | ||
| 836 | |||
| 837 | show_code((unsigned int *) regs->cp0_epc); | ||
| 838 | |||
| 824 | /* | 839 | /* |
| 825 | * Some chips may have other causes of machine check (e.g. SB1 | 840 | * Some chips may have other causes of machine check (e.g. SB1 |
| 826 | * graduation timer) | 841 | * graduation timer) |
| 827 | */ | 842 | */ |
| 828 | panic("Caught Machine Check exception - %scaused by multiple " | 843 | panic("Caught Machine Check exception - %scaused by multiple " |
| 829 | "matching entries in the TLB.", | 844 | "matching entries in the TLB.", |
| 830 | (regs->cp0_status & ST0_TS) ? "" : "not "); | 845 | (multi_match) ? "" : "not "); |
| 831 | } | 846 | } |
| 832 | 847 | ||
| 833 | asmlinkage void do_mt(struct pt_regs *regs) | 848 | asmlinkage void do_mt(struct pt_regs *regs) |
