diff options
Diffstat (limited to 'arch/x86/kernel/jump_label.c')
| -rw-r--r-- | arch/x86/kernel/jump_label.c | 25 | 
1 files changed, 18 insertions, 7 deletions
diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c index ee11b7dfbfb..26d5a55a273 100644 --- a/arch/x86/kernel/jump_label.c +++ b/arch/x86/kernel/jump_label.c @@ -42,15 +42,27 @@ static void __jump_label_transform(struct jump_entry *entry,  				   int init)  {  	union jump_code_union code; +	const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };  	const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5];  	if (type == JUMP_LABEL_ENABLE) { -		/* -		 * We are enabling this jump label. If it is not a nop -		 * then something must have gone wrong. -		 */ -		if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) != 0)) -			bug_at((void *)entry->code, __LINE__); +		if (init) { +			/* +			 * Jump label is enabled for the first time. +			 * So we expect a default_nop... +			 */ +			if (unlikely(memcmp((void *)entry->code, default_nop, 5) +				     != 0)) +				bug_at((void *)entry->code, __LINE__); +		} else { +			/* +			 * ...otherwise expect an ideal_nop. Otherwise +			 * something went horribly wrong. +			 */ +			if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) +				     != 0)) +				bug_at((void *)entry->code, __LINE__); +		}  		code.jump = 0xe9;  		code.offset = entry->target - @@ -63,7 +75,6 @@ static void __jump_label_transform(struct jump_entry *entry,  		 * are converting the default nop to the ideal nop.  		 */  		if (init) { -			const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };  			if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0))  				bug_at((void *)entry->code, __LINE__);  		} else {  | 
