diff options
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/asm-offsets.c | 4 | ||||
| -rw-r--r-- | arch/mips/kernel/cpu-bugs64.c | 8 | ||||
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 15 | ||||
| -rw-r--r-- | arch/mips/kernel/entry.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/gdb-low.S | 8 | ||||
| -rw-r--r-- | arch/mips/kernel/module.c | 6 | ||||
| -rw-r--r-- | arch/mips/kernel/proc.c | 2 | ||||
| -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/signal-common.h | 30 | ||||
| -rw-r--r-- | arch/mips/kernel/smp.c | 5 | ||||
| -rw-r--r-- | arch/mips/kernel/syscall.c | 27 | ||||
| -rw-r--r-- | arch/mips/kernel/traps.c | 20 | ||||
| -rw-r--r-- | arch/mips/kernel/vmlinux.lds.S | 20 |
14 files changed, 73 insertions, 94 deletions
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c index 92b28b674d6f..0facfaf4e950 100644 --- a/arch/mips/kernel/asm-offsets.c +++ b/arch/mips/kernel/asm-offsets.c | |||
| @@ -272,8 +272,8 @@ void output_sc_defines(void) | |||
| 272 | text("/* Linux sigcontext offsets. */"); | 272 | text("/* Linux sigcontext offsets. */"); |
| 273 | offset("#define SC_REGS ", struct sigcontext, sc_regs); | 273 | offset("#define SC_REGS ", struct sigcontext, sc_regs); |
| 274 | offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs); | 274 | offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs); |
| 275 | offset("#define SC_MDHI ", struct sigcontext, sc_hi); | 275 | offset("#define SC_MDHI ", struct sigcontext, sc_mdhi); |
| 276 | offset("#define SC_MDLO ", struct sigcontext, sc_lo); | 276 | offset("#define SC_MDLO ", struct sigcontext, sc_mdlo); |
| 277 | offset("#define SC_PC ", struct sigcontext, sc_pc); | 277 | offset("#define SC_PC ", struct sigcontext, sc_pc); |
| 278 | offset("#define SC_FPC_CSR ", struct sigcontext, sc_fpc_csr); | 278 | offset("#define SC_FPC_CSR ", struct sigcontext, sc_fpc_csr); |
| 279 | linefeed; | 279 | linefeed; |
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 58b3b14873cb..8c2c359a05f4 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -121,6 +121,7 @@ static inline void check_wait(void) | |||
| 121 | case CPU_24K: | 121 | case CPU_24K: |
| 122 | case CPU_25KF: | 122 | case CPU_25KF: |
| 123 | case CPU_34K: | 123 | case CPU_34K: |
| 124 | case CPU_74K: | ||
| 124 | case CPU_PR4450: | 125 | case CPU_PR4450: |
| 125 | cpu_wait = r4k_wait; | 126 | cpu_wait = r4k_wait; |
| 126 | printk(" available.\n"); | 127 | printk(" available.\n"); |
| @@ -432,6 +433,15 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
| 432 | MIPS_CPU_LLSC; | 433 | MIPS_CPU_LLSC; |
| 433 | c->tlbsize = 64; | 434 | c->tlbsize = 64; |
| 434 | break; | 435 | break; |
| 436 | case PRID_IMP_R14000: | ||
| 437 | c->cputype = CPU_R14000; | ||
| 438 | c->isa_level = MIPS_CPU_ISA_IV; | ||
| 439 | c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX | | ||
| 440 | MIPS_CPU_FPU | MIPS_CPU_32FPR | | ||
| 441 | MIPS_CPU_COUNTER | MIPS_CPU_WATCH | | ||
| 442 | MIPS_CPU_LLSC; | ||
| 443 | c->tlbsize = 64; | ||
| 444 | break; | ||
| 435 | } | 445 | } |
| 436 | } | 446 | } |
| 437 | 447 | ||
| @@ -593,6 +603,9 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c) | |||
| 593 | case PRID_IMP_34K: | 603 | case PRID_IMP_34K: |
| 594 | c->cputype = CPU_34K; | 604 | c->cputype = CPU_34K; |
| 595 | break; | 605 | break; |
| 606 | case PRID_IMP_74K: | ||
| 607 | c->cputype = CPU_74K; | ||
| 608 | break; | ||
| 596 | } | 609 | } |
| 597 | } | 610 | } |
| 598 | 611 | ||
| @@ -642,7 +655,7 @@ static inline void cpu_probe_sibyte(struct cpuinfo_mips *c) | |||
| 642 | case PRID_IMP_SB1: | 655 | case PRID_IMP_SB1: |
| 643 | c->cputype = CPU_SB1; | 656 | c->cputype = CPU_SB1; |
| 644 | /* FPU in pass1 is known to have issues. */ | 657 | /* FPU in pass1 is known to have issues. */ |
| 645 | if ((c->processor_id & 0xff) < 0x20) | 658 | if ((c->processor_id & 0xff) < 0x02) |
| 646 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); | 659 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); |
| 647 | break; | 660 | break; |
| 648 | case PRID_IMP_SB1A: | 661 | case PRID_IMP_SB1A: |
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index d101d2fb24ca..a9c6de1b9542 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S | |||
| @@ -101,7 +101,7 @@ FEXPORT(restore_all) # restore full frame | |||
| 101 | EMT | 101 | EMT |
| 102 | 1: | 102 | 1: |
| 103 | mfc0 v1, CP0_TCSTATUS | 103 | mfc0 v1, CP0_TCSTATUS |
| 104 | /* We set IXMT above, XOR should cler it here */ | 104 | /* We set IXMT above, XOR should clear it here */ |
| 105 | xori v1, v1, TCSTATUS_IXMT | 105 | xori v1, v1, TCSTATUS_IXMT |
| 106 | or v1, v0, v1 | 106 | or v1, v0, v1 |
| 107 | mtc0 v1, CP0_TCSTATUS | 107 | mtc0 v1, CP0_TCSTATUS |
diff --git a/arch/mips/kernel/gdb-low.S b/arch/mips/kernel/gdb-low.S index 10f28fb9f008..5fd7a8af0c62 100644 --- a/arch/mips/kernel/gdb-low.S +++ b/arch/mips/kernel/gdb-low.S | |||
| @@ -54,9 +54,11 @@ | |||
| 54 | */ | 54 | */ |
| 55 | mfc0 k0, CP0_CAUSE | 55 | mfc0 k0, CP0_CAUSE |
| 56 | andi k0, k0, 0x7c | 56 | andi k0, k0, 0x7c |
| 57 | add k1, k1, k0 | 57 | #ifdef CONFIG_64BIT |
| 58 | PTR_L k0, saved_vectors(k1) | 58 | dsll k0, k0, 1 |
| 59 | jr k0 | 59 | #endif |
| 60 | PTR_L k1, saved_vectors(k0) | ||
| 61 | jr k1 | ||
| 60 | nop | 62 | nop |
| 61 | 1: | 63 | 1: |
| 62 | move k0, sp | 64 | move k0, sp |
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/proc.c b/arch/mips/kernel/proc.c index 84ab959f924a..9def554f335b 100644 --- a/arch/mips/kernel/proc.c +++ b/arch/mips/kernel/proc.c | |||
| @@ -42,6 +42,7 @@ static const char *cpu_name[] = { | |||
| 42 | [CPU_R8000] = "R8000", | 42 | [CPU_R8000] = "R8000", |
| 43 | [CPU_R10000] = "R10000", | 43 | [CPU_R10000] = "R10000", |
| 44 | [CPU_R12000] = "R12000", | 44 | [CPU_R12000] = "R12000", |
| 45 | [CPU_R14000] = "R14000", | ||
| 45 | [CPU_R4300] = "R4300", | 46 | [CPU_R4300] = "R4300", |
| 46 | [CPU_R4650] = "R4650", | 47 | [CPU_R4650] = "R4650", |
| 47 | [CPU_R4700] = "R4700", | 48 | [CPU_R4700] = "R4700", |
| @@ -74,6 +75,7 @@ static const char *cpu_name[] = { | |||
| 74 | [CPU_24K] = "MIPS 24K", | 75 | [CPU_24K] = "MIPS 24K", |
| 75 | [CPU_25KF] = "MIPS 25Kf", | 76 | [CPU_25KF] = "MIPS 25Kf", |
| 76 | [CPU_34K] = "MIPS 34K", | 77 | [CPU_34K] = "MIPS 34K", |
| 78 | [CPU_74K] = "MIPS 74K", | ||
| 77 | [CPU_VR4111] = "NEC VR4111", | 79 | [CPU_VR4111] = "NEC VR4111", |
| 78 | [CPU_VR4121] = "NEC VR4121", | 80 | [CPU_VR4121] = "NEC VR4121", |
| 79 | [CPU_VR4122] = "NEC VR4122", | 81 | [CPU_VR4122] = "NEC VR4122", |
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/signal-common.h b/arch/mips/kernel/signal-common.h index 3ca786215d48..ce6cb915c0a7 100644 --- a/arch/mips/kernel/signal-common.h +++ b/arch/mips/kernel/signal-common.h | |||
| @@ -31,7 +31,6 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
| 31 | save_gp_reg(31); | 31 | save_gp_reg(31); |
| 32 | #undef save_gp_reg | 32 | #undef save_gp_reg |
| 33 | 33 | ||
| 34 | #ifdef CONFIG_32BIT | ||
| 35 | err |= __put_user(regs->hi, &sc->sc_mdhi); | 34 | err |= __put_user(regs->hi, &sc->sc_mdhi); |
| 36 | err |= __put_user(regs->lo, &sc->sc_mdlo); | 35 | err |= __put_user(regs->lo, &sc->sc_mdlo); |
| 37 | if (cpu_has_dsp) { | 36 | if (cpu_has_dsp) { |
| @@ -43,20 +42,6 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
| 43 | err |= __put_user(mflo3(), &sc->sc_lo3); | 42 | err |= __put_user(mflo3(), &sc->sc_lo3); |
| 44 | err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); | 43 | err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); |
| 45 | } | 44 | } |
| 46 | #endif | ||
| 47 | #ifdef CONFIG_64BIT | ||
| 48 | err |= __put_user(regs->hi, &sc->sc_hi[0]); | ||
| 49 | err |= __put_user(regs->lo, &sc->sc_lo[0]); | ||
| 50 | if (cpu_has_dsp) { | ||
| 51 | err |= __put_user(mfhi1(), &sc->sc_hi[1]); | ||
| 52 | err |= __put_user(mflo1(), &sc->sc_lo[1]); | ||
| 53 | err |= __put_user(mfhi2(), &sc->sc_hi[2]); | ||
| 54 | err |= __put_user(mflo2(), &sc->sc_lo[2]); | ||
| 55 | err |= __put_user(mfhi3(), &sc->sc_hi[3]); | ||
| 56 | err |= __put_user(mflo3(), &sc->sc_lo[3]); | ||
| 57 | err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); | ||
| 58 | } | ||
| 59 | #endif | ||
| 60 | 45 | ||
| 61 | err |= __put_user(!!used_math(), &sc->sc_used_math); | 46 | err |= __put_user(!!used_math(), &sc->sc_used_math); |
| 62 | 47 | ||
| @@ -92,7 +77,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
| 92 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 77 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
| 93 | 78 | ||
| 94 | err |= __get_user(regs->cp0_epc, &sc->sc_pc); | 79 | err |= __get_user(regs->cp0_epc, &sc->sc_pc); |
| 95 | #ifdef CONFIG_32BIT | ||
| 96 | err |= __get_user(regs->hi, &sc->sc_mdhi); | 80 | err |= __get_user(regs->hi, &sc->sc_mdhi); |
| 97 | err |= __get_user(regs->lo, &sc->sc_mdlo); | 81 | err |= __get_user(regs->lo, &sc->sc_mdlo); |
| 98 | if (cpu_has_dsp) { | 82 | if (cpu_has_dsp) { |
| @@ -104,20 +88,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
| 104 | err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg); | 88 | err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg); |
| 105 | err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); | 89 | err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); |
| 106 | } | 90 | } |
| 107 | #endif | ||
| 108 | #ifdef CONFIG_64BIT | ||
| 109 | err |= __get_user(regs->hi, &sc->sc_hi[0]); | ||
| 110 | err |= __get_user(regs->lo, &sc->sc_lo[0]); | ||
| 111 | if (cpu_has_dsp) { | ||
| 112 | err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg); | ||
| 113 | err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg); | ||
| 114 | err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg); | ||
| 115 | err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg); | ||
| 116 | err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg); | ||
| 117 | err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg); | ||
| 118 | err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); | ||
| 119 | } | ||
| 120 | #endif | ||
| 121 | 91 | ||
| 122 | #define restore_gp_reg(i) do { \ | 92 | #define restore_gp_reg(i) do { \ |
| 123 | err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \ | 93 | err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \ |
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 2aeaa2fd4b32..5e8a18a8e2bd 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c | |||
| @@ -276,31 +276,9 @@ 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 SETNAME: { | ||
| 284 | char nodename[__NEW_UTS_LEN + 1]; | ||
| 285 | |||
| 286 | if (!capable(CAP_SYS_ADMIN)) | ||
| 287 | return -EPERM; | ||
| 288 | |||
| 289 | name = (char __user *) arg1; | ||
| 290 | |||
| 291 | len = strncpy_from_user(nodename, name, __NEW_UTS_LEN); | ||
| 292 | if (len < 0) | ||
| 293 | return -EFAULT; | ||
| 294 | |||
| 295 | down_write(&uts_sem); | ||
| 296 | strncpy(system_utsname.nodename, nodename, len); | ||
| 297 | nodename[__NEW_UTS_LEN] = '\0'; | ||
| 298 | strlcpy(system_utsname.nodename, nodename, | ||
| 299 | sizeof(system_utsname.nodename)); | ||
| 300 | up_write(&uts_sem); | ||
| 301 | return 0; | ||
| 302 | } | ||
| 303 | |||
| 304 | case MIPS_ATOMIC_SET: | 282 | case MIPS_ATOMIC_SET: |
| 305 | printk(KERN_CRIT "How did I get here?\n"); | 283 | printk(KERN_CRIT "How did I get here?\n"); |
| 306 | return -EINVAL; | 284 | return -EINVAL; |
| @@ -313,9 +291,6 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) | |||
| 313 | case FLUSH_CACHE: | 291 | case FLUSH_CACHE: |
| 314 | __flush_cache_all(); | 292 | __flush_cache_all(); |
| 315 | return 0; | 293 | return 0; |
| 316 | |||
| 317 | case MIPS_RDNVRAM: | ||
| 318 | return -EIO; | ||
| 319 | } | 294 | } |
| 320 | 295 | ||
| 321 | return -EINVAL; | 296 | return -EINVAL; |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 4901f0a37fca..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) |
| @@ -902,6 +917,7 @@ static inline void parity_protection_init(void) | |||
| 902 | { | 917 | { |
| 903 | switch (current_cpu_data.cputype) { | 918 | switch (current_cpu_data.cputype) { |
| 904 | case CPU_24K: | 919 | case CPU_24K: |
| 920 | case CPU_34K: | ||
| 905 | case CPU_5KC: | 921 | case CPU_5KC: |
| 906 | write_c0_ecc(0x80000000); | 922 | write_c0_ecc(0x80000000); |
| 907 | back_to_back_c0_hazard(); | 923 | back_to_back_c0_hazard(); |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 14fa00e3cdfa..b84d1f9ce28e 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
| @@ -151,23 +151,13 @@ SECTIONS | |||
| 151 | 151 | ||
| 152 | /* This is the MIPS specific mdebug section. */ | 152 | /* This is the MIPS specific mdebug section. */ |
| 153 | .mdebug : { *(.mdebug) } | 153 | .mdebug : { *(.mdebug) } |
| 154 | /* These are needed for ELF backends which have not yet been | 154 | |
| 155 | converted to the new style linker. */ | 155 | STABS_DEBUG |
| 156 | .stab 0 : { *(.stab) } | 156 | |
| 157 | .stabstr 0 : { *(.stabstr) } | 157 | DWARF_DEBUG |
| 158 | /* DWARF debug sections. | 158 | |
| 159 | Symbols in the .debug DWARF section are relative to the beginning of the | ||
| 160 | section so we begin .debug at 0. It's not clear yet what needs to happen | ||
| 161 | for the others. */ | ||
| 162 | .debug 0 : { *(.debug) } | ||
| 163 | .debug_srcinfo 0 : { *(.debug_srcinfo) } | ||
| 164 | .debug_aranges 0 : { *(.debug_aranges) } | ||
| 165 | .debug_pubnames 0 : { *(.debug_pubnames) } | ||
| 166 | .debug_sfnames 0 : { *(.debug_sfnames) } | ||
| 167 | .line 0 : { *(.line) } | ||
| 168 | /* These must appear regardless of . */ | 159 | /* These must appear regardless of . */ |
| 169 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } | 160 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } |
| 170 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } | 161 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } |
| 171 | .comment : { *(.comment) } | ||
| 172 | .note : { *(.note) } | 162 | .note : { *(.note) } |
| 173 | } | 163 | } |
