diff options
Diffstat (limited to 'arch/ia64/kernel/patch.c')
| -rw-r--r-- | arch/ia64/kernel/patch.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/ia64/kernel/patch.c b/arch/ia64/kernel/patch.c index e0dca8743dbb..b83b2c516008 100644 --- a/arch/ia64/kernel/patch.c +++ b/arch/ia64/kernel/patch.c | |||
| @@ -115,6 +115,29 @@ ia64_patch_vtop (unsigned long start, unsigned long end) | |||
| 115 | ia64_srlz_i(); | 115 | ia64_srlz_i(); |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | /* | ||
| 119 | * Disable the RSE workaround by turning the conditional branch | ||
| 120 | * that we tagged in each place the workaround was used into an | ||
| 121 | * unconditional branch. | ||
| 122 | */ | ||
| 123 | void __init | ||
| 124 | ia64_patch_rse (unsigned long start, unsigned long end) | ||
| 125 | { | ||
| 126 | s32 *offp = (s32 *) start; | ||
| 127 | u64 ip, *b; | ||
| 128 | |||
| 129 | while (offp < (s32 *) end) { | ||
| 130 | ip = (u64) offp + *offp; | ||
| 131 | |||
| 132 | b = (u64 *)(ip & -16); | ||
| 133 | b[1] &= ~0xf800000L; | ||
| 134 | ia64_fc((void *) ip); | ||
| 135 | ++offp; | ||
| 136 | } | ||
| 137 | ia64_sync_i(); | ||
| 138 | ia64_srlz_i(); | ||
| 139 | } | ||
| 140 | |||
| 118 | void __init | 141 | void __init |
| 119 | ia64_patch_mckinley_e9 (unsigned long start, unsigned long end) | 142 | ia64_patch_mckinley_e9 (unsigned long start, unsigned long end) |
| 120 | { | 143 | { |
