Commit | Line | Data |
---|---|---|
dff9d3c2 DM |
1 | #include <linux/kernel.h> |
2 | #include <linux/types.h> | |
3 | #include <linux/mutex.h> | |
4 | #include <linux/cpu.h> | |
5 | ||
6 | #include <linux/jump_label.h> | |
7 | #include <linux/memory.h> | |
8 | ||
8befc9f2 DM |
9 | #include <asm/cacheflush.h> |
10 | ||
dff9d3c2 DM |
11 | #ifdef HAVE_JUMP_LABEL |
12 | ||
13 | void arch_jump_label_transform(struct jump_entry *entry, | |
14 | enum jump_label_type type) | |
15 | { | |
16 | u32 val; | |
17 | u32 *insn = (u32 *) (unsigned long) entry->code; | |
18 | ||
76b235c6 | 19 | if (type == JUMP_LABEL_JMP) { |
dff9d3c2 DM |
20 | s32 off = (s32)entry->target - (s32)entry->code; |
21 | ||
22 | #ifdef CONFIG_SPARC64 | |
23 | /* ba,pt %xcc, . + (off << 2) */ | |
24 | val = 0x10680000 | ((u32) off >> 2); | |
25 | #else | |
26 | /* ba . + (off << 2) */ | |
27 | val = 0x10800000 | ((u32) off >> 2); | |
28 | #endif | |
29 | } else { | |
30 | val = 0x01000000; | |
31 | } | |
32 | ||
33 | get_online_cpus(); | |
34 | mutex_lock(&text_mutex); | |
35 | *insn = val; | |
36 | flushi(insn); | |
37 | mutex_unlock(&text_mutex); | |
38 | put_online_cpus(); | |
39 | } | |
40 | ||
dff9d3c2 | 41 | #endif |