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 e0dca8743db..b83b2c51600 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)  	ia64_srlz_i();  } +/* + * Disable the RSE workaround by turning the conditional branch + * that we tagged in each place the workaround was used into an + * unconditional branch. + */ +void __init +ia64_patch_rse (unsigned long start, unsigned long end) +{ +	s32 *offp = (s32 *) start; +	u64 ip, *b; + +	while (offp < (s32 *) end) { +		ip = (u64) offp + *offp; + +		b = (u64 *)(ip & -16); +		b[1] &= ~0xf800000L; +		ia64_fc((void *) ip); +		++offp; +	} +	ia64_sync_i(); +	ia64_srlz_i(); +} +  void __init  ia64_patch_mckinley_e9 (unsigned long start, unsigned long end)  {  |