Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm64/vmm/arm64.h
105863 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (C) 2015 Mihai Carabas <[email protected]>
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
#ifndef _VMM_ARM64_H_
29
#define _VMM_ARM64_H_
30
31
#include <machine/reg.h>
32
#include <machine/hypervisor.h>
33
#include <machine/pcpu.h>
34
35
#include "mmu.h"
36
#include "io/vgic_v3.h"
37
#include "io/vtimer.h"
38
39
struct vgic_v3;
40
struct vgic_v3_cpu;
41
42
/*
43
* Per-vCPU hypervisor state.
44
*/
45
struct hypctx {
46
struct trapframe tf;
47
48
/*
49
* EL1 control registers.
50
*/
51
uint64_t elr_el1; /* Exception Link Register */
52
uint64_t sp_el0; /* Stack pointer */
53
uint64_t tpidr_el0; /* EL0 Software ID Register */
54
uint64_t tpidrro_el0; /* Read-only Thread ID Register */
55
uint64_t tpidr_el1; /* EL1 Software ID Register */
56
uint64_t vbar_el1; /* Vector Base Address Register */
57
58
uint64_t actlr_el1; /* Auxiliary Control Register */
59
uint64_t afsr0_el1; /* Auxiliary Fault Status Register 0 */
60
uint64_t afsr1_el1; /* Auxiliary Fault Status Register 1 */
61
uint64_t amair_el1; /* Auxiliary Memory Attribute Indirection Register */
62
uint64_t contextidr_el1; /* Current Process Identifier */
63
uint64_t cpacr_el1; /* Architectural Feature Access Control Register */
64
uint64_t csselr_el1; /* Cache Size Selection Register */
65
uint64_t esr_el1; /* Exception Syndrome Register */
66
uint64_t far_el1; /* Fault Address Register */
67
uint64_t mair_el1; /* Memory Attribute Indirection Register */
68
uint64_t mdccint_el1; /* Monitor DCC Interrupt Enable Register */
69
uint64_t mdscr_el1; /* Monitor Debug System Control Register */
70
uint64_t par_el1; /* Physical Address Register */
71
uint64_t sctlr_el1; /* System Control Register */
72
uint64_t tcr_el1; /* Translation Control Register */
73
uint64_t tcr2_el1; /* Translation Control Register 2 */
74
uint64_t ttbr0_el1; /* Translation Table Base Register 0 */
75
uint64_t ttbr1_el1; /* Translation Table Base Register 1 */
76
uint64_t spsr_el1; /* Saved Program Status Register */
77
78
uint64_t pmcr_el0; /* Performance Monitors Control Register */
79
uint64_t pmccntr_el0;
80
uint64_t pmccfiltr_el0;
81
uint64_t pmuserenr_el0;
82
uint64_t pmselr_el0;
83
uint64_t pmxevcntr_el0;
84
uint64_t pmcntenset_el0;
85
uint64_t pmintenset_el1;
86
uint64_t pmovsset_el0;
87
uint64_t pmevcntr_el0[31];
88
uint64_t pmevtyper_el0[31];
89
90
uint64_t dbgclaimset_el1;
91
uint64_t dbgbcr_el1[16]; /* Debug Breakpoint Control Registers */
92
uint64_t dbgbvr_el1[16]; /* Debug Breakpoint Value Registers */
93
uint64_t dbgwcr_el1[16]; /* Debug Watchpoint Control Registers */
94
uint64_t dbgwvr_el1[16]; /* Debug Watchpoint Value Registers */
95
96
/* EL2 control registers */
97
uint64_t cptr_el2; /* Architectural Feature Trap Register */
98
uint64_t hcr_el2; /* Hypervisor Configuration Register */
99
uint64_t hcrx_el2; /* Extended Hypervisor Configuration Register */
100
uint64_t mdcr_el2; /* Monitor Debug Configuration Register */
101
uint64_t vpidr_el2; /* Virtualization Processor ID Register */
102
uint64_t vmpidr_el2; /* Virtualization Multiprocessor ID Register */
103
104
/* FEAT_FGT registers */
105
/*uint64_t hafgrtr_el2; *//* For FEAT_AMUv1 (not supported) */
106
uint64_t hdfgrtr_el2;
107
uint64_t hdfgwtr_el2;
108
uint64_t hfgitr_el2;
109
uint64_t hfgrtr_el2;
110
uint64_t hfgwtr_el2;
111
112
/* FEAT_FGT2 registers */
113
uint64_t hdfgrtr2_el2;
114
uint64_t hdfgwtr2_el2;
115
uint64_t hfgitr2_el2;
116
uint64_t hfgrtr2_el2;
117
uint64_t hfgwtr2_el2;
118
119
uint64_t el2_addr; /* The address of this in el2 space */
120
struct hyp *hyp;
121
struct vcpu *vcpu;
122
struct {
123
uint64_t far_el2; /* Fault Address Register */
124
uint64_t hpfar_el2; /* Hypervisor IPA Fault Address Register */
125
} exit_info;
126
127
struct vtimer_cpu vtimer_cpu;
128
129
uint64_t setcaps; /* Currently enabled capabilities. */
130
131
/* vCPU state used to handle guest debugging. */
132
uint64_t debug_spsr; /* Saved guest SPSR */
133
uint64_t debug_mdscr; /* Saved guest MDSCR */
134
135
struct vgic_v3_regs vgic_v3_regs;
136
struct vgic_v3_cpu *vgic_cpu;
137
bool has_exception;
138
bool dbg_oslock;
139
};
140
141
struct hyp {
142
struct vm *vm;
143
struct vtimer vtimer;
144
uint64_t vmid_generation;
145
uint64_t vttbr_el2;
146
uint64_t el2_addr; /* The address of this in el2 space */
147
uint64_t feats; /* Which features are enabled */
148
#define HYP_FEAT_HCX (0x1ul << 0)
149
#define HYP_FEAT_ECV_POFF (0x1ul << 1)
150
#define HYP_FEAT_FGT (0x1ul << 2)
151
#define HYP_FEAT_FGT2 (0x1ul << 3)
152
bool vgic_attached;
153
struct vgic_v3 *vgic;
154
struct hypctx *ctx[];
155
};
156
157
uint64_t vmm_call_hyp(uint64_t, ...);
158
159
#if 0
160
#define eprintf(fmt, ...) printf("%s:%d " fmt, __func__, __LINE__, ##__VA_ARGS__)
161
#else
162
#define eprintf(fmt, ...) do {} while(0)
163
#endif
164
165
struct hypctx *arm64_get_active_vcpu(void);
166
void raise_data_insn_abort(struct hypctx *, uint64_t, bool, int);
167
168
#endif /* !_VMM_ARM64_H_ */
169
170