arch/powerpc/kvm/tm.S

Source file repositories/reference/linux-study-clean/arch/powerpc/kvm/tm.S

File Facts

System
Linux kernel
Corpus path
arch/powerpc/kvm/tm.S
Extension
.S
Size
9131 bytes
Lines
399
Domain
Architecture Layer
Bucket
arch/powerpc
Inferred role
Architecture Layer: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

#include <linux/export.h>
#include <asm/reg.h>
#include <asm/ppc_asm.h>
#include <asm/asm-offsets.h>
#include <asm/tm.h>
#include <asm/cputable.h>

#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
#define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM)

/*
 * Save transactional state and TM-related registers.
 * Called with:
 * - r3 pointing to the vcpu struct
 * - r4 containing the MSR with current TS bits:
 * 	(For HV KVM, it is VCPU_MSR ; For PR KVM, it is host MSR).
 * - r5 containing a flag indicating that non-volatile registers
 *	must be preserved.
 * If r5 == 0, this can modify all checkpointed registers, but
 * restores r1, r2 before exit.  If r5 != 0, this restores the
 * MSR TM/FP/VEC/VSX bits to their state on entry.
 */
_GLOBAL(__kvmppc_save_tm)
	mflr	r0
	std	r0, PPC_LR_STKOFF(r1)
	stdu    r1, -SWITCH_FRAME_SIZE(r1)

	mr	r9, r3
	cmpdi	cr7, r5, 0

	/* Turn on TM. */
	mfmsr	r8
	mr	r10, r8
	li	r0, 1
	rldimi	r8, r0, MSR_TM_LG, 63-MSR_TM_LG
	ori     r8, r8, MSR_FP
	oris    r8, r8, (MSR_VEC | MSR_VSX)@h
	mtmsrd	r8

	rldicl. r4, r4, 64 - MSR_TS_S_LG, 62
	beq	1f	/* TM not active in guest. */

	std	r1, HSTATE_SCRATCH2(r13)
	std	r3, HSTATE_SCRATCH1(r13)

	/* Save CR on the stack - even if r5 == 0 we need to get cr7 back. */
	mfcr	r6
	SAVE_GPR(6, r1)

	/* Save DSCR so we can restore it to avoid running with user value */
	mfspr	r7, SPRN_DSCR
	SAVE_GPR(7, r1)

	/*
	 * We are going to do treclaim., which will modify all checkpointed
	 * registers.  Save the non-volatile registers on the stack if
	 * preservation of non-volatile state has been requested.
	 */
	beq	cr7, 3f
	SAVE_NVGPRS(r1)

	/* MSR[TS] will be 0 (non-transactional) once we do treclaim. */
	li	r0, 0
	rldimi	r10, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG
	SAVE_GPR(10, r1)	/* final MSR value */
3:
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
BEGIN_FTR_SECTION
	/* Emulation of the treclaim instruction needs TEXASR before treclaim */
	mfspr	r6, SPRN_TEXASR

Annotation

Implementation Notes