Commit d5e52813 authored by Alexander Graf's avatar Alexander Graf Committed by Marcelo Tosatti
Browse files

KVM: PPC: Add helper functions to call real mode loaders



Linux contains quite some bits of code to load FPU, Altivec and VSX lazily for
a task. It calls those bits in real mode, coming from an interrupt handler.

For KVM we better reuse those, so let's wrap a bit of trampoline magic around
them and then we can call them from normal module code.

Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent fbad5f1d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -124,6 +124,9 @@ extern void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat,
extern u32 kvmppc_trampoline_lowmem;
extern u32 kvmppc_trampoline_enter;
extern void kvmppc_rmcall(ulong srr0, ulong srr1);
extern void kvmppc_load_up_fpu(void);
extern void kvmppc_load_up_altivec(void);
extern void kvmppc_load_up_vsx(void);

static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu)
{
+7 −0
Original line number Diff line number Diff line
@@ -23,3 +23,10 @@
EXPORT_SYMBOL_GPL(kvmppc_trampoline_enter);
EXPORT_SYMBOL_GPL(kvmppc_trampoline_lowmem);
EXPORT_SYMBOL_GPL(kvmppc_rmcall);
EXPORT_SYMBOL_GPL(kvmppc_load_up_fpu);
#ifdef CONFIG_ALTIVEC
EXPORT_SYMBOL_GPL(kvmppc_load_up_altivec);
#endif
#ifdef CONFIG_VSX
EXPORT_SYMBOL_GPL(kvmppc_load_up_vsx);
#endif
+34 −0
Original line number Diff line number Diff line
@@ -158,6 +158,40 @@ _GLOBAL(kvmppc_rmcall)
	mtsrr1	r4
	RFI

/*
 * Activate current's external feature (FPU/Altivec/VSX)
 */
#define define_load_up(what) 				\
							\
_GLOBAL(kvmppc_load_up_ ## what);			\
	subi	r1, r1, INT_FRAME_SIZE;			\
	mflr	r3;					\
	std	r3, _LINK(r1);				\
	mfmsr	r4;					\
	std	r31, GPR3(r1);				\
	mr	r31, r4;				\
	li	r5, MSR_DR;				\
	oris	r5, r5, MSR_EE@h;			\
	andc	r4, r4, r5;				\
	mtmsr	r4;					\
							\
	bl	.load_up_ ## what;			\
							\
	mtmsr	r31;					\
	ld	r3, _LINK(r1);				\
	ld	r31, GPR3(r1);				\
	addi	r1, r1, INT_FRAME_SIZE;			\
	mtlr	r3;					\
	blr

define_load_up(fpu)
#ifdef CONFIG_ALTIVEC
define_load_up(altivec)
#endif
#ifdef CONFIG_VSX
define_load_up(vsx)
#endif

.global kvmppc_trampoline_lowmem
kvmppc_trampoline_lowmem:
	.long kvmppc_handler_lowmem_trampoline - _stext