Commit e7304597 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc/security: Use PPC_RAW_BLR() and PPC_RAW_NOP()



On the road to remove all use of PPC_INST_xxx, replace
PPC_INST_BLR by PPC_RAW_BLR(). Same for PPC_INST_NOP.

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/c04f88d0e53d2122fbbe92226892a01ebc668b6a.1621506159.git.christophe.leroy@csgroup.eu
parent 47b04699
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -289,7 +289,6 @@
#define PPC_INST_MFLR			0x7c0802a6
#define PPC_INST_ADDIS			0x3c000000
#define PPC_INST_ADD			0x7c000214
#define PPC_INST_BLR			0x4e800020
#define PPC_INST_DIVD			0x7c0003d2
#define PPC_INST_RLDICR			0x78000004
#define PPC_INST_ORI			0x60000000
@@ -478,7 +477,7 @@
#define PPC_RAW_ADDC(t, a, b)		(0x7c000014 | ___PPC_RT(t) | ___PPC_RA(a) | ___PPC_RB(b))
#define PPC_RAW_ADDC_DOT(t, a, b)	(0x7c000014 | ___PPC_RT(t) | ___PPC_RA(a) | ___PPC_RB(b) | 0x1)
#define PPC_RAW_NOP()			(PPC_INST_NOP)
#define PPC_RAW_BLR()			(PPC_INST_BLR)
#define PPC_RAW_BLR()			(0x4e800020)
#define PPC_RAW_BLRL()			(0x4e800021)
#define PPC_RAW_MTLR(r)			(0x7c0803a6 | ___PPC_RT(r))
#define PPC_RAW_MFLR(t)			(PPC_INST_MFLR | ___PPC_RT(t))
+6 −6
Original line number Diff line number Diff line
@@ -438,7 +438,7 @@ static void update_branch_cache_flush(void)
	site = &patch__call_kvm_flush_link_stack;
	// This controls the branch from guest_exit_cont to kvm_flush_link_stack
	if (link_stack_flush_type == BRANCH_CACHE_FLUSH_NONE) {
		patch_instruction_site(site, ppc_inst(PPC_INST_NOP));
		patch_instruction_site(site, ppc_inst(PPC_RAW_NOP()));
	} else {
		// Could use HW flush, but that could also flush count cache
		patch_branch_site(site, (u64)&kvm_flush_link_stack, BRANCH_SET_LINK);
@@ -447,11 +447,11 @@ static void update_branch_cache_flush(void)

	// Patch out the bcctr first, then nop the rest
	site = &patch__call_flush_branch_caches3;
	patch_instruction_site(site, ppc_inst(PPC_INST_NOP));
	patch_instruction_site(site, ppc_inst(PPC_RAW_NOP()));
	site = &patch__call_flush_branch_caches2;
	patch_instruction_site(site, ppc_inst(PPC_INST_NOP));
	patch_instruction_site(site, ppc_inst(PPC_RAW_NOP()));
	site = &patch__call_flush_branch_caches1;
	patch_instruction_site(site, ppc_inst(PPC_INST_NOP));
	patch_instruction_site(site, ppc_inst(PPC_RAW_NOP()));

	// This controls the branch from _switch to flush_branch_caches
	if (count_cache_flush_type == BRANCH_CACHE_FLUSH_NONE &&
@@ -474,12 +474,12 @@ static void update_branch_cache_flush(void)
		// If we just need to flush the link stack, early return
		if (count_cache_flush_type == BRANCH_CACHE_FLUSH_NONE) {
			patch_instruction_site(&patch__flush_link_stack_return,
					       ppc_inst(PPC_INST_BLR));
					       ppc_inst(PPC_RAW_BLR()));

		// If we have flush instruction, early return
		} else if (count_cache_flush_type == BRANCH_CACHE_FLUSH_HW) {
			patch_instruction_site(&patch__flush_count_cache_return,
					       ppc_inst(PPC_INST_BLR));
					       ppc_inst(PPC_RAW_BLR()));
		}
	}
}