diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-02-06 01:27:28 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-20 04:11:50 -0500 |
commit | 45fec05f805a113372c9a7ff4c653ac749f6921c (patch) | |
tree | 36fc99d10656775acb8e9442719447d64ac30a03 /arch/sparc64/kernel/setup.c | |
parent | 314981ac7177a933319e3c071a5cf0a579205e6e (diff) |
[SPARC64]: Sanitize %pstate writes for sun4v.
If we're just switching between different alternate global
sets, nop it out on sun4v. Also, get rid of all of the
alternate global save/restore in the OBP CIF trampoline code.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/setup.c')
-rw-r--r-- | arch/sparc64/kernel/setup.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c index aaab319ad885..e22bf5fc92ce 100644 --- a/arch/sparc64/kernel/setup.c +++ b/arch/sparc64/kernel/setup.c | |||
@@ -547,19 +547,33 @@ static void __init per_cpu_patch(void) | |||
547 | 547 | ||
548 | static void __init gl_patch(void) | 548 | static void __init gl_patch(void) |
549 | { | 549 | { |
550 | struct gl_1insn_patch_entry *p; | 550 | struct gl_1insn_patch_entry *p1; |
551 | struct gl_2insn_patch_entry *p2; | ||
551 | 552 | ||
552 | if (tlb_type != hypervisor) | 553 | if (tlb_type != hypervisor) |
553 | return; | 554 | return; |
554 | 555 | ||
555 | p = &__gl_1insn_patch; | 556 | p1 = &__gl_1insn_patch; |
556 | while (p < &__gl_1insn_patch_end) { | 557 | while (p1 < &__gl_1insn_patch_end) { |
557 | unsigned long addr = p->addr; | 558 | unsigned long addr = p1->addr; |
558 | 559 | ||
559 | *(unsigned int *) (addr + 0) = p->insn; | 560 | *(unsigned int *) (addr + 0) = p1->insn; |
560 | __asm__ __volatile__("flush %0" : : "r" (addr + 0)); | 561 | __asm__ __volatile__("flush %0" : : "r" (addr + 0)); |
561 | 562 | ||
562 | p++; | 563 | p1++; |
564 | } | ||
565 | |||
566 | p2 = &__gl_2insn_patch; | ||
567 | while (p2 < &__gl_2insn_patch_end) { | ||
568 | unsigned long addr = p2->addr; | ||
569 | |||
570 | *(unsigned int *) (addr + 0) = p2->insns[0]; | ||
571 | __asm__ __volatile__("flush %0" : : "r" (addr + 0)); | ||
572 | |||
573 | *(unsigned int *) (addr + 3) = p2->insns[1]; | ||
574 | __asm__ __volatile__("flush %0" : : "r" (addr + 4)); | ||
575 | |||
576 | p2++; | ||
563 | } | 577 | } |
564 | } | 578 | } |
565 | 579 | ||