summaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel/setup_64.c
diff options
context:
space:
mode:
authorCatalin Marinas2012-11-13 18:36:07 +0100
committerCatalin Marinas2012-11-13 18:36:07 +0100
commit6097a07411005c0184cf90256743c784079198fc (patch)
tree0c6496aa7de5f00a60ed8e7bac4b34f5acc7e30a /arch/sparc/kernel/setup_64.c
parentarm64: Use generic sys_execve() implementation (diff)
parentLinux 3.7-rc5 (diff)
downloadkernel-qcow2-linux-6097a07411005c0184cf90256743c784079198fc.tar.gz
kernel-qcow2-linux-6097a07411005c0184cf90256743c784079198fc.tar.xz
kernel-qcow2-linux-6097a07411005c0184cf90256743c784079198fc.zip
Merge tag 'v3.7-rc5' into execve
Linux 3.7-rc5 Conflicts: arch/arm64/kernel/process.c
Diffstat (limited to 'arch/sparc/kernel/setup_64.c')
-rw-r--r--arch/sparc/kernel/setup_64.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c
index 0800e71d8a88..0eaf0059aaef 100644
--- a/arch/sparc/kernel/setup_64.c
+++ b/arch/sparc/kernel/setup_64.c
@@ -316,6 +316,25 @@ static void __init popc_patch(void)
}
}
+static void __init pause_patch(void)
+{
+ struct pause_patch_entry *p;
+
+ p = &__pause_3insn_patch;
+ while (p < &__pause_3insn_patch_end) {
+ unsigned long i, addr = p->addr;
+
+ for (i = 0; i < 3; i++) {
+ *(unsigned int *) (addr + (i * 4)) = p->insns[i];
+ wmb();
+ __asm__ __volatile__("flush %0"
+ : : "r" (addr + (i * 4)));
+ }
+
+ p++;
+ }
+}
+
#ifdef CONFIG_SMP
void __init boot_cpu_id_too_large(int cpu)
{
@@ -528,6 +547,8 @@ static void __init init_sparc64_elf_hwcap(void)
if (sparc64_elf_hwcap & AV_SPARC_POPC)
popc_patch();
+ if (sparc64_elf_hwcap & AV_SPARC_PAUSE)
+ pause_patch();
}
void __init setup_arch(char **cmdline_p)