hc
2023-03-21 4b55d97acc464242bcd6a8ae77b8ff37c22dec58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
 * Original code:
 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
 *
 * Mostly rewritten in C by Marc Zyngier <marc.zyngier@arm.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
#include <asm/kvm_hyp.h>
 
static u64 *cp15_64(struct kvm_cpu_context *ctxt, int idx)
{
   return (u64 *)(ctxt->cp15 + idx);
}
 
void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
{
   ctxt->cp15[c0_MPIDR]        = read_sysreg(VMPIDR);
   ctxt->cp15[c0_CSSELR]        = read_sysreg(CSSELR);
   ctxt->cp15[c1_SCTLR]        = read_sysreg(SCTLR);
   ctxt->cp15[c1_CPACR]        = read_sysreg(CPACR);
   *cp15_64(ctxt, c2_TTBR0)    = read_sysreg(TTBR0);
   *cp15_64(ctxt, c2_TTBR1)    = read_sysreg(TTBR1);
   ctxt->cp15[c2_TTBCR]        = read_sysreg(TTBCR);
   ctxt->cp15[c3_DACR]        = read_sysreg(DACR);
   ctxt->cp15[c5_DFSR]        = read_sysreg(DFSR);
   ctxt->cp15[c5_IFSR]        = read_sysreg(IFSR);
   ctxt->cp15[c5_ADFSR]        = read_sysreg(ADFSR);
   ctxt->cp15[c5_AIFSR]        = read_sysreg(AIFSR);
   ctxt->cp15[c6_DFAR]        = read_sysreg(DFAR);
   ctxt->cp15[c6_IFAR]        = read_sysreg(IFAR);
   *cp15_64(ctxt, c7_PAR)        = read_sysreg(PAR);
   ctxt->cp15[c10_PRRR]        = read_sysreg(PRRR);
   ctxt->cp15[c10_NMRR]        = read_sysreg(NMRR);
   ctxt->cp15[c10_AMAIR0]        = read_sysreg(AMAIR0);
   ctxt->cp15[c10_AMAIR1]        = read_sysreg(AMAIR1);
   ctxt->cp15[c12_VBAR]        = read_sysreg(VBAR);
   ctxt->cp15[c13_CID]        = read_sysreg(CID);
   ctxt->cp15[c13_TID_URW]        = read_sysreg(TID_URW);
   ctxt->cp15[c13_TID_URO]        = read_sysreg(TID_URO);
   ctxt->cp15[c13_TID_PRIV]    = read_sysreg(TID_PRIV);
   ctxt->cp15[c14_CNTKCTL]        = read_sysreg(CNTKCTL);
}
 
void __hyp_text __sysreg_restore_state(struct kvm_cpu_context *ctxt)
{
   write_sysreg(ctxt->cp15[c0_MPIDR],    VMPIDR);
   write_sysreg(ctxt->cp15[c0_CSSELR],    CSSELR);
   write_sysreg(ctxt->cp15[c1_SCTLR],    SCTLR);
   write_sysreg(ctxt->cp15[c1_CPACR],    CPACR);
   write_sysreg(*cp15_64(ctxt, c2_TTBR0),    TTBR0);
   write_sysreg(*cp15_64(ctxt, c2_TTBR1),    TTBR1);
   write_sysreg(ctxt->cp15[c2_TTBCR],    TTBCR);
   write_sysreg(ctxt->cp15[c3_DACR],    DACR);
   write_sysreg(ctxt->cp15[c5_DFSR],    DFSR);
   write_sysreg(ctxt->cp15[c5_IFSR],    IFSR);
   write_sysreg(ctxt->cp15[c5_ADFSR],    ADFSR);
   write_sysreg(ctxt->cp15[c5_AIFSR],    AIFSR);
   write_sysreg(ctxt->cp15[c6_DFAR],    DFAR);
   write_sysreg(ctxt->cp15[c6_IFAR],    IFAR);
   write_sysreg(*cp15_64(ctxt, c7_PAR),    PAR);
   write_sysreg(ctxt->cp15[c10_PRRR],    PRRR);
   write_sysreg(ctxt->cp15[c10_NMRR],    NMRR);
   write_sysreg(ctxt->cp15[c10_AMAIR0],    AMAIR0);
   write_sysreg(ctxt->cp15[c10_AMAIR1],    AMAIR1);
   write_sysreg(ctxt->cp15[c12_VBAR],    VBAR);
   write_sysreg(ctxt->cp15[c13_CID],    CID);
   write_sysreg(ctxt->cp15[c13_TID_URW],    TID_URW);
   write_sysreg(ctxt->cp15[c13_TID_URO],    TID_URO);
   write_sysreg(ctxt->cp15[c13_TID_PRIV],    TID_PRIV);
   write_sysreg(ctxt->cp15[c14_CNTKCTL],    CNTKCTL);
}