diff options
author | Michael Ellerman <michael@ellerman.id.au> | 2011-06-29 19:16:59 +0000 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-07-01 13:48:55 +1000 |
commit | ac5f89c7d87f6f2fb7073723fc943488d9c3479d (patch) | |
tree | f7373ad0d4af2c937a420f3909284814d4487535 /arch/powerpc/kernel/jump_label.c | |
parent | 87fa35dd881fd61a2a8166892366f2c22c34a1fa (diff) | |
download | talos-op-linux-ac5f89c7d87f6f2fb7073723fc943488d9c3479d.tar.gz talos-op-linux-ac5f89c7d87f6f2fb7073723fc943488d9c3479d.zip |
powerpc: Add jump label support
This patch adds support for the new "jump label" feature.
Unlike x86 and sparc we just merrily patch the code with no locks etc,
as far as I know this is safe, but I'm not really sure what the x86/sparc
code is protecting against so maybe it's not.
I also don't see any reason for us to implement the poke_early() routine,
even though sparc does.
[BenH: Updated the patch to upstream generic changes]
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/jump_label.c')
-rw-r--r-- | arch/powerpc/kernel/jump_label.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/jump_label.c b/arch/powerpc/kernel/jump_label.c new file mode 100644 index 000000000000..368d158d665d --- /dev/null +++ b/arch/powerpc/kernel/jump_label.c @@ -0,0 +1,23 @@ +/* + * Copyright 2010 Michael Ellerman, IBM Corp. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include <linux/kernel.h> +#include <linux/jump_label.h> +#include <asm/code-patching.h> + +void arch_jump_label_transform(struct jump_entry *entry, + enum jump_label_type type) +{ + u32 *addr = (u32 *)(unsigned long)entry->code; + + if (type == JUMP_LABEL_ENABLE) + patch_branch(addr, entry->target, 0); + else + patch_instruction(addr, PPC_INST_NOP); +} |