GNU Linux-libre 5.4.274-gnu1
[releases.git] / arch / arm / kvm / hyp / cp15-sr.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Original code:
4  * Copyright (C) 2012 - Virtual Open Systems and Columbia University
5  * Author: Christoffer Dall <c.dall@virtualopensystems.com>
6  *
7  * Mostly rewritten in C by Marc Zyngier <marc.zyngier@arm.com>
8  */
9
10 #include <asm/kvm_hyp.h>
11
12 static u64 *cp15_64(struct kvm_cpu_context *ctxt, int idx)
13 {
14         return (u64 *)(ctxt->cp15 + idx);
15 }
16
17 void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
18 {
19         ctxt->cp15[c0_CSSELR]           = read_sysreg(CSSELR);
20         ctxt->cp15[c1_SCTLR]            = read_sysreg(SCTLR);
21         ctxt->cp15[c1_CPACR]            = read_sysreg(CPACR);
22         *cp15_64(ctxt, c2_TTBR0)        = read_sysreg(TTBR0);
23         *cp15_64(ctxt, c2_TTBR1)        = read_sysreg(TTBR1);
24         ctxt->cp15[c2_TTBCR]            = read_sysreg(TTBCR);
25         ctxt->cp15[c3_DACR]             = read_sysreg(DACR);
26         ctxt->cp15[c5_DFSR]             = read_sysreg(DFSR);
27         ctxt->cp15[c5_IFSR]             = read_sysreg(IFSR);
28         ctxt->cp15[c5_ADFSR]            = read_sysreg(ADFSR);
29         ctxt->cp15[c5_AIFSR]            = read_sysreg(AIFSR);
30         ctxt->cp15[c6_DFAR]             = read_sysreg(DFAR);
31         ctxt->cp15[c6_IFAR]             = read_sysreg(IFAR);
32         *cp15_64(ctxt, c7_PAR)          = read_sysreg(PAR);
33         ctxt->cp15[c10_PRRR]            = read_sysreg(PRRR);
34         ctxt->cp15[c10_NMRR]            = read_sysreg(NMRR);
35         ctxt->cp15[c10_AMAIR0]          = read_sysreg(AMAIR0);
36         ctxt->cp15[c10_AMAIR1]          = read_sysreg(AMAIR1);
37         ctxt->cp15[c12_VBAR]            = read_sysreg(VBAR);
38         ctxt->cp15[c13_CID]             = read_sysreg(CID);
39         ctxt->cp15[c13_TID_URW]         = read_sysreg(TID_URW);
40         ctxt->cp15[c13_TID_URO]         = read_sysreg(TID_URO);
41         ctxt->cp15[c13_TID_PRIV]        = read_sysreg(TID_PRIV);
42         ctxt->cp15[c14_CNTKCTL]         = read_sysreg(CNTKCTL);
43 }
44
45 void __hyp_text __sysreg_restore_state(struct kvm_cpu_context *ctxt)
46 {
47         write_sysreg(ctxt->cp15[c0_MPIDR],      VMPIDR);
48         write_sysreg(ctxt->cp15[c0_CSSELR],     CSSELR);
49         write_sysreg(ctxt->cp15[c1_SCTLR],      SCTLR);
50         write_sysreg(ctxt->cp15[c1_CPACR],      CPACR);
51         write_sysreg(*cp15_64(ctxt, c2_TTBR0),  TTBR0);
52         write_sysreg(*cp15_64(ctxt, c2_TTBR1),  TTBR1);
53         write_sysreg(ctxt->cp15[c2_TTBCR],      TTBCR);
54         write_sysreg(ctxt->cp15[c3_DACR],       DACR);
55         write_sysreg(ctxt->cp15[c5_DFSR],       DFSR);
56         write_sysreg(ctxt->cp15[c5_IFSR],       IFSR);
57         write_sysreg(ctxt->cp15[c5_ADFSR],      ADFSR);
58         write_sysreg(ctxt->cp15[c5_AIFSR],      AIFSR);
59         write_sysreg(ctxt->cp15[c6_DFAR],       DFAR);
60         write_sysreg(ctxt->cp15[c6_IFAR],       IFAR);
61         write_sysreg(*cp15_64(ctxt, c7_PAR),    PAR);
62         write_sysreg(ctxt->cp15[c10_PRRR],      PRRR);
63         write_sysreg(ctxt->cp15[c10_NMRR],      NMRR);
64         write_sysreg(ctxt->cp15[c10_AMAIR0],    AMAIR0);
65         write_sysreg(ctxt->cp15[c10_AMAIR1],    AMAIR1);
66         write_sysreg(ctxt->cp15[c12_VBAR],      VBAR);
67         write_sysreg(ctxt->cp15[c13_CID],       CID);
68         write_sysreg(ctxt->cp15[c13_TID_URW],   TID_URW);
69         write_sysreg(ctxt->cp15[c13_TID_URO],   TID_URO);
70         write_sysreg(ctxt->cp15[c13_TID_PRIV],  TID_PRIV);
71         write_sysreg(ctxt->cp15[c14_CNTKCTL],   CNTKCTL);
72 }