File Index
Files and directories
Sign in
FILE

book3s_64_slb.S

File preview with syntax highlighting.

linux-6.19.14/arch/powerpc/kvm/book3s_64_slb.S GAS
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 *
  4 * Copyright SUSE Linux Products GmbH 2009
  5 *
  6 * Authors: Alexander Graf <agraf@suse.de>
  7 */
  8
  9#include <asm/asm-compat.h>
 10#include <asm/feature-fixups.h>
 11
 12#define SHADOW_SLB_ENTRY_LEN	0x10
 13#define OFFSET_ESID(x)		(SHADOW_SLB_ENTRY_LEN * x)
 14#define OFFSET_VSID(x)		((SHADOW_SLB_ENTRY_LEN * x) + 8)
 15
 16/******************************************************************************
 17 *                                                                            *
 18 *                               Entry code                                   *
 19 *                                                                            *
 20 *****************************************************************************/
 21
 22.macro LOAD_GUEST_SEGMENTS
 23
 24	/* Required state:
 25	 *
 26	 * MSR = ~IR|DR
 27	 * R13 = PACA
 28	 * R1 = host R1
 29	 * R2 = host R2
 30	 * R3 = shadow vcpu
 31	 * all other volatile GPRS = free except R4, R6
 32	 * SVCPU[CR]  = guest CR
 33	 * SVCPU[XER] = guest XER
 34	 * SVCPU[CTR] = guest CTR
 35	 * SVCPU[LR]  = guest LR
 36	 */
 37
 38BEGIN_FW_FTR_SECTION
 39
 40	/* Declare SLB shadow as 0 entries big */
 41
 42	ld	r11, PACA_SLBSHADOWPTR(r13)
 43	li	r8, 0
 44	stb	r8, 3(r11)
 45
 46END_FW_FTR_SECTION_IFSET(FW_FEATURE_LPAR)
 47
 48	/* Flush SLB */
 49
 50	li	r10, 0
 51	slbmte	r10, r10
 52	slbia
 53
 54	/* Fill SLB with our shadow */
 55
 56	lbz	r12, SVCPU_SLB_MAX(r3)
 57	mulli	r12, r12, 16
 58	addi	r12, r12, SVCPU_SLB
 59	add	r12, r12, r3
 60
 61	/* for (r11 = kvm_slb; r11 < kvm_slb + kvm_slb_size; r11+=slb_entry) */
 62	li	r11, SVCPU_SLB
 63	add	r11, r11, r3
 64
 65slb_loop_enter:
 66
 67	ld	r10, 0(r11)
 68
 69	andis.	r9, r10, SLB_ESID_V@h
 70	beq	slb_loop_enter_skip
 71
 72	ld	r9, 8(r11)
 73	slbmte	r9, r10
 74
 75slb_loop_enter_skip:
 76	addi	r11, r11, 16
 77	cmpd	cr0, r11, r12
 78	blt	slb_loop_enter
 79
 80slb_do_enter:
 81
 82.endm
 83
 84/******************************************************************************
 85 *                                                                            *
 86 *                               Exit code                                    *
 87 *                                                                            *
 88 *****************************************************************************/
 89
 90.macro LOAD_HOST_SEGMENTS
 91
 92	/* Register usage at this point:
 93	 *
 94	 * R1         = host R1
 95	 * R2         = host R2
 96	 * R12        = exit handler id
 97	 * R13        = shadow vcpu - SHADOW_VCPU_OFF [=PACA on PPC64]
 98	 * SVCPU.*    = guest *
 99	 * SVCPU[CR]  = guest CR
100	 * SVCPU[XER] = guest XER
101	 * SVCPU[CTR] = guest CTR
102	 * SVCPU[LR]  = guest LR
103	 *
104	 */
105
106	/* Remove all SLB entries that are in use. */
107
108	li	r0, 0
109	slbmte	r0, r0
110	slbia
111
112	/* Restore bolted entries from the shadow */
113
114	ld	r11, PACA_SLBSHADOWPTR(r13)
115
116BEGIN_FW_FTR_SECTION
117
118	/* Declare SLB shadow as SLB_NUM_BOLTED entries big */
119
120	li	r8, SLB_NUM_BOLTED
121	stb	r8, 3(r11)
122
123END_FW_FTR_SECTION_IFSET(FW_FEATURE_LPAR)
124
125	/* Manually load all entries from shadow SLB */
126
127	li	r8, SLBSHADOW_SAVEAREA
128	li	r7, SLBSHADOW_SAVEAREA + 8
129
130	.rept	SLB_NUM_BOLTED
131	LDX_BE	r10, r11, r8
132	cmpdi	r10, 0
133	beq	1f
134	LDX_BE	r9, r11, r7
135	slbmte	r9, r10
1361:	addi	r7, r7, SHADOW_SLB_ENTRY_LEN
137	addi	r8, r8, SHADOW_SLB_ENTRY_LEN
138	.endr
139
140	isync
141	sync
142
143slb_do_exit:
144
145.endm
~/ Read-only file preview.