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 38 BEGIN_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 46 END_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 65 slb_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 75 slb_loop_enter_skip: 76 addi r11, r11, 16 77 cmpd cr0, r11, r12 78 blt slb_loop_enter 79 80 slb_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 116 BEGIN_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 123 END_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 136 1: addi r7, r7, SHADOW_SLB_ENTRY_LEN 137 addi r8, r8, SHADOW_SLB_ENTRY_LEN 138 .endr 139 140 isync 141 sync 142 143 slb_do_exit: 144 145 .endm
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.