/* SPDX-License-Identifier: GPL-2.0-only */1/*2*3* Copyright SUSE Linux Products GmbH 20094*5* Authors: Alexander Graf <[email protected]>6*/78/******************************************************************************9* *10* Entry code *11* *12*****************************************************************************/1314.macro LOAD_GUEST_SEGMENTS1516/* Required state:17*18* MSR = ~IR|DR19* R1 = host R120* R2 = host R221* R3 = shadow vcpu22* all other volatile GPRS = free except R4, R623* SVCPU[CR] = guest CR24* SVCPU[XER] = guest XER25* SVCPU[CTR] = guest CTR26* SVCPU[LR] = guest LR27*/2829#define XCHG_SR(n) lwz r9, (SVCPU_SR+(n*4))(r3); \30mtsr n, r93132XCHG_SR(0)33XCHG_SR(1)34XCHG_SR(2)35XCHG_SR(3)36XCHG_SR(4)37XCHG_SR(5)38XCHG_SR(6)39XCHG_SR(7)40XCHG_SR(8)41XCHG_SR(9)42XCHG_SR(10)43XCHG_SR(11)44XCHG_SR(12)45XCHG_SR(13)46XCHG_SR(14)47XCHG_SR(15)4849/* Clear BATs. */5051#define KVM_KILL_BAT(n, reg) \52mtspr SPRN_IBAT##n##U,reg; \53mtspr SPRN_IBAT##n##L,reg; \54mtspr SPRN_DBAT##n##U,reg; \55mtspr SPRN_DBAT##n##L,reg; \5657li r9, 058KVM_KILL_BAT(0, r9)59KVM_KILL_BAT(1, r9)60KVM_KILL_BAT(2, r9)61KVM_KILL_BAT(3, r9)6263.endm6465/******************************************************************************66* *67* Exit code *68* *69*****************************************************************************/7071.macro LOAD_HOST_SEGMENTS7273/* Register usage at this point:74*75* R1 = host R176* R2 = host R277* R12 = exit handler id78* R13 = shadow vcpu - SHADOW_VCPU_OFF79* SVCPU.* = guest *80* SVCPU[CR] = guest CR81* SVCPU[XER] = guest XER82* SVCPU[CTR] = guest CTR83* SVCPU[LR] = guest LR84*85*/8687/* Restore BATs */8889/* We only overwrite the upper part, so we only restoree90the upper part. */91#define KVM_LOAD_BAT(n, reg, RA, RB) \92lwz RA,(n*16)+0(reg); \93lwz RB,(n*16)+4(reg); \94mtspr SPRN_IBAT##n##U,RA; \95mtspr SPRN_IBAT##n##L,RB; \96lwz RA,(n*16)+8(reg); \97lwz RB,(n*16)+12(reg); \98mtspr SPRN_DBAT##n##U,RA; \99mtspr SPRN_DBAT##n##L,RB; \100101lis r9, BATS@ha102addi r9, r9, BATS@l103tophys(r9, r9)104KVM_LOAD_BAT(0, r9, r10, r11)105KVM_LOAD_BAT(1, r9, r10, r11)106KVM_LOAD_BAT(2, r9, r10, r11)107KVM_LOAD_BAT(3, r9, r10, r11)108109/* Restore Segment Registers */110111/* 0xc - 0xf */112113li r0, 4114mtctr r0115LOAD_REG_IMMEDIATE(r3, 0x20000000 | (0x111 * 0xc))116lis r4, 0xc0001173: mtsrin r3, r4118addi r3, r3, 0x111 /* increment VSID */119addis r4, r4, 0x1000 /* address of next segment */120bdnz 3b121122/* 0x0 - 0xb */123124/* switch_mmu_context() needs paging, let's enable it */125mfmsr r9126ori r11, r9, MSR_DR127mtmsr r11128sync129130/* switch_mmu_context() clobbers r12, rescue it */131SAVE_GPR(12, r1)132133/* Calling switch_mmu_context(<inv>, current->mm, <inv>); */134lwz r4, MM(r2)135bl switch_mmu_context136137/* restore r12 */138REST_GPR(12, r1)139140/* Disable paging again */141mfmsr r9142li r6, MSR_DR143andc r9, r9, r6144mtmsr r9145sync146147.endm148149150