[SPARC64]: Fix lockdep, particularly on SMP.

As noted by Al Viro, when we try to call prom_set_trap_table()
in the SMP trampoline code we try to take the PROM call spinlock
which doesn't work because the current thread pointer isn't
valid yet and lockdep depends upon that being correct.

Furthermore, we cannot set the current thread pointer register
because it can't be properly dereferenced until we return from
prom_set_trap_table(). Kernel TLB misses only work after that
call.

So do the PROM call to set the trap table directly instead of
going through the OBP library C code, and thus avoid the lock
altogether.

These calls are guarenteed to be serialized fully.

Since there are now no calls to the prom_set_trap_table{_sun4v}()
library functions, they can be deleted.

Signed-off-by: David S. Miller <davem@davemloft.net>

+58 -30
+30 -5
arch/sparc64/kernel/head.S
··· 98 .globl prom_boot_mapped_pc, prom_boot_mapping_mode 99 .globl prom_boot_mapping_phys_high, prom_boot_mapping_phys_low 100 .globl prom_compatible_name, prom_cpu_path, prom_cpu_compatible 101 - .globl is_sun4v, sun4v_chip_type 102 prom_peer_name: 103 .asciz "peer" 104 prom_compatible_name: ··· 121 .asciz "map" 122 prom_unmap_name: 123 .asciz "unmap" 124 prom_sun4v_name: 125 .asciz "sun4v" 126 prom_niagara_prefix: ··· 693 sethi %hi(kern_base), %g3 694 ldx [%g3 + %lo(kern_base)], %g3 695 add %g2, %g3, %o1 696 697 - call prom_set_trap_table_sun4v 698 - sethi %hi(sparc64_ttable_tl0), %o0 699 700 ba,pt %xcc, 2f 701 nop 702 703 - 1: call prom_set_trap_table 704 - sethi %hi(sparc64_ttable_tl0), %o0 705 706 /* Start using proper page size encodings in ctx register. */ 707 2: sethi %hi(sparc64_kern_pri_context), %g3
··· 98 .globl prom_boot_mapped_pc, prom_boot_mapping_mode 99 .globl prom_boot_mapping_phys_high, prom_boot_mapping_phys_low 100 .globl prom_compatible_name, prom_cpu_path, prom_cpu_compatible 101 + .globl is_sun4v, sun4v_chip_type, prom_set_trap_table_name 102 prom_peer_name: 103 .asciz "peer" 104 prom_compatible_name: ··· 121 .asciz "map" 122 prom_unmap_name: 123 .asciz "unmap" 124 + prom_set_trap_table_name: 125 + .asciz "SUNW,set-trap-table" 126 prom_sun4v_name: 127 .asciz "sun4v" 128 prom_niagara_prefix: ··· 691 sethi %hi(kern_base), %g3 692 ldx [%g3 + %lo(kern_base)], %g3 693 add %g2, %g3, %o1 694 + sethi %hi(sparc64_ttable_tl0), %o0 695 696 + set prom_set_trap_table_name, %g2 697 + stx %g2, [%sp + 2047 + 128 + 0x00] 698 + mov 2, %g2 699 + stx %g2, [%sp + 2047 + 128 + 0x08] 700 + mov 0, %g2 701 + stx %g2, [%sp + 2047 + 128 + 0x10] 702 + stx %o0, [%sp + 2047 + 128 + 0x18] 703 + stx %o1, [%sp + 2047 + 128 + 0x20] 704 + sethi %hi(p1275buf), %g2 705 + or %g2, %lo(p1275buf), %g2 706 + ldx [%g2 + 0x08], %o1 707 + call %o1 708 + add %sp, (2047 + 128), %o0 709 710 ba,pt %xcc, 2f 711 nop 712 713 + 1: sethi %hi(sparc64_ttable_tl0), %o0 714 + set prom_set_trap_table_name, %g2 715 + stx %g2, [%sp + 2047 + 128 + 0x00] 716 + mov 1, %g2 717 + stx %g2, [%sp + 2047 + 128 + 0x08] 718 + mov 0, %g2 719 + stx %g2, [%sp + 2047 + 128 + 0x10] 720 + stx %o0, [%sp + 2047 + 128 + 0x18] 721 + sethi %hi(p1275buf), %g2 722 + or %g2, %lo(p1275buf), %g2 723 + ldx [%g2 + 0x08], %o1 724 + call %o1 725 + add %sp, (2047 + 128), %o0 726 727 /* Start using proper page size encodings in ctx register. */ 728 2: sethi %hi(sparc64_kern_pri_context), %g3
+28 -5
arch/sparc64/kernel/trampoline.S
··· 345 sethi %hi(tramp_stack), %g1 346 or %g1, %lo(tramp_stack), %g1 347 add %g1, TRAMP_STACK_SIZE, %g1 348 - sub %g1, STACKFRAME_SZ + STACK_BIAS, %sp 349 mov 0, %fp 350 351 /* Put garbage in these registers to trap any access to them. */ ··· 411 sethi %hi(kern_base), %g3 412 ldx [%g3 + %lo(kern_base)], %g3 413 add %g2, %g3, %o1 414 415 - call prom_set_trap_table_sun4v 416 - sethi %hi(sparc64_ttable_tl0), %o0 417 418 ba,pt %xcc, 2f 419 nop 420 421 - 1: call prom_set_trap_table 422 - sethi %hi(sparc64_ttable_tl0), %o0 423 424 2: ldx [%l0], %g6 425 ldx [%g6 + TI_TASK], %g4
··· 345 sethi %hi(tramp_stack), %g1 346 or %g1, %lo(tramp_stack), %g1 347 add %g1, TRAMP_STACK_SIZE, %g1 348 + sub %g1, STACKFRAME_SZ + STACK_BIAS + 256, %sp 349 mov 0, %fp 350 351 /* Put garbage in these registers to trap any access to them. */ ··· 411 sethi %hi(kern_base), %g3 412 ldx [%g3 + %lo(kern_base)], %g3 413 add %g2, %g3, %o1 414 + sethi %hi(sparc64_ttable_tl0), %o0 415 416 + set prom_set_trap_table_name, %g2 417 + stx %g2, [%sp + 2047 + 128 + 0x00] 418 + mov 2, %g2 419 + stx %g2, [%sp + 2047 + 128 + 0x08] 420 + mov 0, %g2 421 + stx %g2, [%sp + 2047 + 128 + 0x10] 422 + stx %o0, [%sp + 2047 + 128 + 0x18] 423 + stx %o1, [%sp + 2047 + 128 + 0x20] 424 + sethi %hi(p1275buf), %g2 425 + or %g2, %lo(p1275buf), %g2 426 + ldx [%g2 + 0x08], %o1 427 + call %o1 428 + add %sp, (2047 + 128), %o0 429 430 ba,pt %xcc, 2f 431 nop 432 433 + 1: sethi %hi(sparc64_ttable_tl0), %o0 434 + set prom_set_trap_table_name, %g2 435 + stx %g2, [%sp + 2047 + 128 + 0x00] 436 + mov 1, %g2 437 + stx %g2, [%sp + 2047 + 128 + 0x08] 438 + mov 0, %g2 439 + stx %g2, [%sp + 2047 + 128 + 0x10] 440 + stx %o0, [%sp + 2047 + 128 + 0x18] 441 + sethi %hi(p1275buf), %g2 442 + or %g2, %lo(p1275buf), %g2 443 + ldx [%g2 + 0x08], %o1 444 + call %o1 445 + add %sp, (2047 + 128), %o0 446 447 2: ldx [%l0], %g6 448 ldx [%g6 + TI_TASK], %g4
-16
arch/sparc64/prom/misc.c
··· 143 return 0xff; 144 } 145 146 - /* Install Linux trap table so PROM uses that instead of its own. */ 147 - void prom_set_trap_table(unsigned long tba) 148 - { 149 - p1275_cmd("SUNW,set-trap-table", 150 - (P1275_ARG(0, P1275_ARG_IN_64B) | 151 - P1275_INOUT(1, 0)), tba); 152 - } 153 - 154 - void prom_set_trap_table_sun4v(unsigned long tba, unsigned long mmfsa) 155 - { 156 - p1275_cmd("SUNW,set-trap-table", 157 - (P1275_ARG(0, P1275_ARG_IN_64B) | 158 - P1275_ARG(1, P1275_ARG_IN_64B) | 159 - P1275_INOUT(2, 0)), tba, mmfsa); 160 - } 161 - 162 int prom_get_mmu_ihandle(void) 163 { 164 int node, ret;
··· 143 return 0xff; 144 } 145 146 int prom_get_mmu_ihandle(void) 147 { 148 int node, ret;
-4
include/asm-sparc64/oplib.h
··· 297 extern int prom_ihandle2path(int handle, char *buffer, int bufsize); 298 299 /* Client interface level routines. */ 300 - extern void prom_set_trap_table(unsigned long tba); 301 - extern void prom_set_trap_table_sun4v(unsigned long tba, unsigned long mmfsa); 302 - 303 extern long p1275_cmd(const char *, long, ...); 304 - 305 306 #if 0 307 #define P1275_SIZE(x) ((((long)((x) / 32)) << 32) | (x))
··· 297 extern int prom_ihandle2path(int handle, char *buffer, int bufsize); 298 299 /* Client interface level routines. */ 300 extern long p1275_cmd(const char *, long, ...); 301 302 #if 0 303 #define P1275_SIZE(x) ((((long)((x) / 32)) << 32) | (x))