Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
149f120e
Commit
149f120e
authored
Nov 27, 2020
by
Marc Zyngier
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'kvm-arm64/copro-no-more' into kvmarm-master/next
Signed-off-by:
Marc Zyngier
<
maz@kernel.org
>
parents
37da329e
6ac4a5ac
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
151 additions
and
274 deletions
+151
-274
arch/arm64/include/asm/kvm_coproc.h
arch/arm64/include/asm/kvm_coproc.h
+0
-38
arch/arm64/include/asm/kvm_host.h
arch/arm64/include/asm/kvm_host.h
+18
-55
arch/arm64/kvm/arm.c
arch/arm64/kvm/arm.c
+1
-2
arch/arm64/kvm/guest.c
arch/arm64/kvm/guest.c
+0
-1
arch/arm64/kvm/handle_exit.c
arch/arm64/kvm/handle_exit.c
+0
-1
arch/arm64/kvm/inject_fault.c
arch/arm64/kvm/inject_fault.c
+20
-42
arch/arm64/kvm/reset.c
arch/arm64/kvm/reset.c
+0
-1
arch/arm64/kvm/sys_regs.c
arch/arm64/kvm/sys_regs.c
+105
-128
arch/arm64/kvm/sys_regs.h
arch/arm64/kvm/sys_regs.h
+7
-2
arch/arm64/kvm/vgic-sys-reg-v3.c
arch/arm64/kvm/vgic-sys-reg-v3.c
+0
-4
No files found.
arch/arm64/include/asm/kvm_coproc.h
deleted
100644 → 0
View file @
37da329e
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2012,2013 - ARM Ltd
* Author: Marc Zyngier <marc.zyngier@arm.com>
*
* Derived from arch/arm/include/asm/kvm_coproc.h
* Copyright (C) 2012 Rusty Russell IBM Corporation
*/
#ifndef __ARM64_KVM_COPROC_H__
#define __ARM64_KVM_COPROC_H__
#include <linux/kvm_host.h>
void
kvm_reset_sys_regs
(
struct
kvm_vcpu
*
vcpu
);
struct
kvm_sys_reg_table
{
const
struct
sys_reg_desc
*
table
;
size_t
num
;
};
int
kvm_handle_cp14_load_store
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp14_32
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp14_64
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp15_32
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp15_64
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_sys_reg
(
struct
kvm_vcpu
*
vcpu
);
#define kvm_coproc_table_init kvm_sys_reg_table_init
void
kvm_sys_reg_table_init
(
void
);
struct
kvm_one_reg
;
int
kvm_arm_copy_sys_reg_indices
(
struct
kvm_vcpu
*
vcpu
,
u64
__user
*
uindices
);
int
kvm_arm_sys_reg_get_reg
(
struct
kvm_vcpu
*
vcpu
,
const
struct
kvm_one_reg
*
);
int
kvm_arm_sys_reg_set_reg
(
struct
kvm_vcpu
*
vcpu
,
const
struct
kvm_one_reg
*
);
unsigned
long
kvm_arm_num_sys_reg_descs
(
struct
kvm_vcpu
*
vcpu
);
#endif
/* __ARM64_KVM_COPROC_H__ */
arch/arm64/include/asm/kvm_host.h
View file @
149f120e
...
...
@@ -203,48 +203,6 @@ enum vcpu_sysreg {
NR_SYS_REGS
/* Nothing after this line! */
};
/* 32bit mapping */
#define c0_MPIDR (MPIDR_EL1 * 2)
/* MultiProcessor ID Register */
#define c0_CSSELR (CSSELR_EL1 * 2)
/* Cache Size Selection Register */
#define c1_SCTLR (SCTLR_EL1 * 2)
/* System Control Register */
#define c1_ACTLR (ACTLR_EL1 * 2)
/* Auxiliary Control Register */
#define c1_CPACR (CPACR_EL1 * 2)
/* Coprocessor Access Control */
#define c2_TTBR0 (TTBR0_EL1 * 2)
/* Translation Table Base Register 0 */
#define c2_TTBR0_high (c2_TTBR0 + 1)
/* TTBR0 top 32 bits */
#define c2_TTBR1 (TTBR1_EL1 * 2)
/* Translation Table Base Register 1 */
#define c2_TTBR1_high (c2_TTBR1 + 1)
/* TTBR1 top 32 bits */
#define c2_TTBCR (TCR_EL1 * 2)
/* Translation Table Base Control R. */
#define c3_DACR (DACR32_EL2 * 2)
/* Domain Access Control Register */
#define c5_DFSR (ESR_EL1 * 2)
/* Data Fault Status Register */
#define c5_IFSR (IFSR32_EL2 * 2)
/* Instruction Fault Status Register */
#define c5_ADFSR (AFSR0_EL1 * 2)
/* Auxiliary Data Fault Status R */
#define c5_AIFSR (AFSR1_EL1 * 2)
/* Auxiliary Instr Fault Status R */
#define c6_DFAR (FAR_EL1 * 2)
/* Data Fault Address Register */
#define c6_IFAR (c6_DFAR + 1)
/* Instruction Fault Address Register */
#define c7_PAR (PAR_EL1 * 2)
/* Physical Address Register */
#define c7_PAR_high (c7_PAR + 1)
/* PAR top 32 bits */
#define c10_PRRR (MAIR_EL1 * 2)
/* Primary Region Remap Register */
#define c10_NMRR (c10_PRRR + 1)
/* Normal Memory Remap Register */
#define c12_VBAR (VBAR_EL1 * 2)
/* Vector Base Address Register */
#define c13_CID (CONTEXTIDR_EL1 * 2)
/* Context ID Register */
#define c13_TID_URW (TPIDR_EL0 * 2)
/* Thread ID, User R/W */
#define c13_TID_URO (TPIDRRO_EL0 * 2)
/* Thread ID, User R/O */
#define c13_TID_PRIV (TPIDR_EL1 * 2)
/* Thread ID, Privileged */
#define c10_AMAIR0 (AMAIR_EL1 * 2)
/* Aux Memory Attr Indirection Reg */
#define c10_AMAIR1 (c10_AMAIR0 + 1)
/* Aux Memory Attr Indirection Reg */
#define c14_CNTKCTL (CNTKCTL_EL1 * 2)
/* Timer Control Register (PL1) */
#define cp14_DBGDSCRext (MDSCR_EL1 * 2)
#define cp14_DBGBCR0 (DBGBCR0_EL1 * 2)
#define cp14_DBGBVR0 (DBGBVR0_EL1 * 2)
#define cp14_DBGBXVR0 (cp14_DBGBVR0 + 1)
#define cp14_DBGWCR0 (DBGWCR0_EL1 * 2)
#define cp14_DBGWVR0 (DBGWVR0_EL1 * 2)
#define cp14_DBGDCCINT (MDCCINT_EL1 * 2)
#define cp14_DBGVCR (DBGVCR32_EL2 * 2)
#define NR_COPRO_REGS (NR_SYS_REGS * 2)
struct
kvm_cpu_context
{
struct
user_pt_regs
regs
;
/* sp = sp_el0 */
...
...
@@ -255,10 +213,7 @@ struct kvm_cpu_context {
struct
user_fpsimd_state
fp_regs
;
union
{
u64
sys_regs
[
NR_SYS_REGS
];
u32
copro
[
NR_COPRO_REGS
];
};
u64
sys_regs
[
NR_SYS_REGS
];
struct
kvm_vcpu
*
__hyp_running_vcpu
;
};
...
...
@@ -556,15 +511,6 @@ static inline bool __vcpu_write_sys_reg_to_cpu(u64 val, int reg)
return
true
;
}
/*
* CP14 and CP15 live in the same array, as they are backed by the
* same system registers.
*/
#define CPx_BIAS IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
#define vcpu_cp14(v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS])
#define vcpu_cp15(v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS])
struct
kvm_vm_stat
{
ulong
remote_tlb_flush
;
};
...
...
@@ -589,6 +535,12 @@ unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu);
int
kvm_arm_copy_reg_indices
(
struct
kvm_vcpu
*
vcpu
,
u64
__user
*
indices
);
int
kvm_arm_get_reg
(
struct
kvm_vcpu
*
vcpu
,
const
struct
kvm_one_reg
*
reg
);
int
kvm_arm_set_reg
(
struct
kvm_vcpu
*
vcpu
,
const
struct
kvm_one_reg
*
reg
);
unsigned
long
kvm_arm_num_sys_reg_descs
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_arm_copy_sys_reg_indices
(
struct
kvm_vcpu
*
vcpu
,
u64
__user
*
uindices
);
int
kvm_arm_sys_reg_get_reg
(
struct
kvm_vcpu
*
vcpu
,
const
struct
kvm_one_reg
*
);
int
kvm_arm_sys_reg_set_reg
(
struct
kvm_vcpu
*
vcpu
,
const
struct
kvm_one_reg
*
);
int
__kvm_arm_vcpu_get_events
(
struct
kvm_vcpu
*
vcpu
,
struct
kvm_vcpu_events
*
events
);
...
...
@@ -651,6 +603,17 @@ void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot);
int
handle_exit
(
struct
kvm_vcpu
*
vcpu
,
int
exception_index
);
void
handle_exit_early
(
struct
kvm_vcpu
*
vcpu
,
int
exception_index
);
int
kvm_handle_cp14_load_store
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp14_32
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp14_64
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp15_32
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_cp15_64
(
struct
kvm_vcpu
*
vcpu
);
int
kvm_handle_sys_reg
(
struct
kvm_vcpu
*
vcpu
);
void
kvm_reset_sys_regs
(
struct
kvm_vcpu
*
vcpu
);
void
kvm_sys_reg_table_init
(
void
);
/* MMIO helpers */
void
kvm_mmio_write_buf
(
void
*
buf
,
unsigned
int
len
,
unsigned
long
data
);
unsigned
long
kvm_mmio_read_buf
(
const
void
*
buf
,
unsigned
int
len
);
...
...
arch/arm64/kvm/arm.c
View file @
149f120e
...
...
@@ -35,7 +35,6 @@
#include <asm/kvm_asm.h>
#include <asm/kvm_mmu.h>
#include <asm/kvm_emulate.h>
#include <asm/kvm_coproc.h>
#include <asm/sections.h>
#include <kvm/arm_hypercalls.h>
...
...
@@ -1541,7 +1540,7 @@ static int init_subsystems(void)
goto
out
;
kvm_perf_init
();
kvm_
coproc
_table_init
();
kvm_
sys_reg
_table_init
();
out:
on_each_cpu
(
_kvm_arch_hardware_disable
,
NULL
,
1
);
...
...
arch/arm64/kvm/guest.c
View file @
149f120e
...
...
@@ -24,7 +24,6 @@
#include <asm/fpsimd.h>
#include <asm/kvm.h>
#include <asm/kvm_emulate.h>
#include <asm/kvm_coproc.h>
#include <asm/sigcontext.h>
#include "trace.h"
...
...
arch/arm64/kvm/handle_exit.c
View file @
149f120e
...
...
@@ -14,7 +14,6 @@
#include <asm/esr.h>
#include <asm/exception.h>
#include <asm/kvm_asm.h>
#include <asm/kvm_coproc.h>
#include <asm/kvm_emulate.h>
#include <asm/kvm_mmu.h>
#include <asm/debug-monitors.h>
...
...
arch/arm64/kvm/inject_fault.c
View file @
149f120e
...
...
@@ -69,26 +69,7 @@ static void inject_undef64(struct kvm_vcpu *vcpu)
#define DFSR_FSC_EXTABT_LPAE 0x10
#define DFSR_FSC_EXTABT_nLPAE 0x08
#define DFSR_LPAE BIT(9)
static
bool
pre_fault_synchronize
(
struct
kvm_vcpu
*
vcpu
)
{
preempt_disable
();
if
(
vcpu
->
arch
.
sysregs_loaded_on_cpu
)
{
kvm_arch_vcpu_put
(
vcpu
);
return
true
;
}
preempt_enable
();
return
false
;
}
static
void
post_fault_synchronize
(
struct
kvm_vcpu
*
vcpu
,
bool
loaded
)
{
if
(
loaded
)
{
kvm_arch_vcpu_load
(
vcpu
,
smp_processor_id
());
preempt_enable
();
}
}
#define TTBCR_EAE BIT(31)
static
void
inject_undef32
(
struct
kvm_vcpu
*
vcpu
)
{
...
...
@@ -100,39 +81,36 @@ static void inject_undef32(struct kvm_vcpu *vcpu)
* Modelled after TakeDataAbortException() and TakePrefetchAbortException
* pseudocode.
*/
static
void
inject_abt32
(
struct
kvm_vcpu
*
vcpu
,
bool
is_pabt
,
unsigned
long
addr
)
static
void
inject_abt32
(
struct
kvm_vcpu
*
vcpu
,
bool
is_pabt
,
u32
addr
)
{
u32
*
far
,
*
fsr
;
bool
is_lpae
;
bool
loaded
;
u64
far
;
u32
fsr
;
/* Give the guest an IMPLEMENTATION DEFINED exception */
if
(
vcpu_read_sys_reg
(
vcpu
,
TCR_EL1
)
&
TTBCR_EAE
)
{
fsr
=
DFSR_LPAE
|
DFSR_FSC_EXTABT_LPAE
;
}
else
{
/* no need to shuffle FS[4] into DFSR[10] as its 0 */
fsr
=
DFSR_FSC_EXTABT_nLPAE
;
}
loaded
=
pre_fault_synchronize
(
vcpu
);
far
=
vcpu_read_sys_reg
(
vcpu
,
FAR_EL1
);
if
(
is_pabt
)
{
vcpu
->
arch
.
flags
|=
(
KVM_ARM64_EXCEPT_AA32_IABT
|
KVM_ARM64_PENDING_EXCEPTION
);
far
=
&
vcpu_cp15
(
vcpu
,
c6_IFAR
);
fsr
=
&
vcpu_cp15
(
vcpu
,
c5_IFSR
);
far
&=
GENMASK
(
31
,
0
);
far
|=
(
u64
)
addr
<<
32
;
vcpu_write_sys_reg
(
vcpu
,
fsr
,
IFSR32_EL2
);
}
else
{
/* !iabt */
vcpu
->
arch
.
flags
|=
(
KVM_ARM64_EXCEPT_AA32_DABT
|
KVM_ARM64_PENDING_EXCEPTION
);
far
=
&
vcpu_cp15
(
vcpu
,
c6_DFAR
);
fsr
=
&
vcpu_cp15
(
vcpu
,
c5_DFSR
);
}
*
far
=
addr
;
/* Give the guest an IMPLEMENTATION DEFINED exception */
is_lpae
=
(
vcpu_cp15
(
vcpu
,
c2_TTBCR
)
>>
31
);
if
(
is_lpae
)
{
*
fsr
=
DFSR_LPAE
|
DFSR_FSC_EXTABT_LPAE
;
}
else
{
/* no need to shuffle FS[4] into DFSR[10] as its 0 */
*
fsr
=
DFSR_FSC_EXTABT_nLPAE
;
far
&=
GENMASK
(
63
,
32
);
far
|=
addr
;
vcpu_write_sys_reg
(
vcpu
,
fsr
,
ESR_EL1
);
}
post_fault_synchronize
(
vcpu
,
loaded
);
vcpu_write_sys_reg
(
vcpu
,
far
,
FAR_EL1
);
}
/**
...
...
arch/arm64/kvm/reset.c
View file @
149f120e
...
...
@@ -25,7 +25,6 @@
#include <asm/ptrace.h>
#include <asm/kvm_arm.h>
#include <asm/kvm_asm.h>
#include <asm/kvm_coproc.h>
#include <asm/kvm_emulate.h>
#include <asm/kvm_mmu.h>
#include <asm/virt.h>
...
...
arch/arm64/kvm/sys_regs.c
View file @
149f120e
This diff is collapsed.
Click to expand it.
arch/arm64/kvm/sys_regs.h
View file @
149f120e
...
...
@@ -19,14 +19,18 @@ struct sys_reg_params {
u8
Op2
;
u64
regval
;
bool
is_write
;
bool
is_aarch32
;
bool
is_32bit
;
/* Only valid if is_aarch32 is true */
};
struct
sys_reg_desc
{
/* Sysreg string for debug */
const
char
*
name
;
enum
{
AA32_ZEROHIGH
,
AA32_LO
,
AA32_HI
,
}
aarch32_map
;
/* MRS/MSR instruction which accesses it. */
u8
Op0
;
u8
Op1
;
...
...
@@ -153,6 +157,7 @@ const struct sys_reg_desc *find_reg_by_id(u64 id,
const
struct
sys_reg_desc
table
[],
unsigned
int
num
);
#define AA32(_x) .aarch32_map = AA32_##_x
#define Op0(_x) .Op0 = _x
#define Op1(_x) .Op1 = _x
#define CRn(_x) .CRn = _x
...
...
arch/arm64/kvm/vgic-sys-reg-v3.c
View file @
149f120e
...
...
@@ -268,8 +268,6 @@ int vgic_v3_has_cpu_sysregs_attr(struct kvm_vcpu *vcpu, bool is_write, u64 id,
params
.
regval
=
*
reg
;
params
.
is_write
=
is_write
;
params
.
is_aarch32
=
false
;
params
.
is_32bit
=
false
;
if
(
find_reg_by_id
(
sysreg
,
&
params
,
gic_v3_icc_reg_descs
,
ARRAY_SIZE
(
gic_v3_icc_reg_descs
)))
...
...
@@ -288,8 +286,6 @@ int vgic_v3_cpu_sysregs_uaccess(struct kvm_vcpu *vcpu, bool is_write, u64 id,
if
(
is_write
)
params
.
regval
=
*
reg
;
params
.
is_write
=
is_write
;
params
.
is_aarch32
=
false
;
params
.
is_32bit
=
false
;
r
=
find_reg_by_id
(
sysreg
,
&
params
,
gic_v3_icc_reg_descs
,
ARRAY_SIZE
(
gic_v3_icc_reg_descs
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment