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
4e5dc64c
Commit
4e5dc64c
authored
Oct 02, 2020
by
Marc Zyngier
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'kvm-arm64/pt-new' and 'kvm-arm64/pmu-5.9' into kvmarm-master/next
Signed-off-by:
Marc Zyngier
<
maz@kernel.org
>
parents
14ef9d04
ffd1b63a
030bdf36
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
30 additions
and
21 deletions
+30
-21
Documentation/virt/kvm/devices/vcpu.rst
Documentation/virt/kvm/devices/vcpu.rst
+13
-13
arch/arm64/kvm/hyp/pgtable.c
arch/arm64/kvm/hyp/pgtable.c
+16
-7
arch/arm64/kvm/mmu.c
arch/arm64/kvm/mmu.c
+1
-1
No files found.
Documentation/virt/kvm/devices/vcpu.rst
View file @
4e5dc64c
...
...
@@ -67,25 +67,25 @@ irqchip.
:Returns:
======= ======================================================
-ENODEV
:
PMUv3 not supported or GIC not initialized
-ENXIO
:
PMUv3 not properly configured or in-kernel irqchip not
-ENODEV
PMUv3 not supported or GIC not initialized
-ENXIO
PMUv3 not properly configured or in-kernel irqchip not
configured as required prior to calling this attribute
-EBUSY
:
PMUv3 already initialized
-EINVAL
:
Invalid filter range
-EBUSY
PMUv3 already initialized
-EINVAL
Invalid filter range
======= ======================================================
Request the installation of a PMU event filter described as follows:
Request the installation of a PMU event filter described as follows:
:
struct kvm_pmu_event_filter {
__u16 base_event;
__u16 nevents;
struct kvm_pmu_event_filter {
__u16 base_event;
__u16 nevents;
#define KVM_PMU_EVENT_ALLOW 0
#define KVM_PMU_EVENT_DENY 1
#define KVM_PMU_EVENT_ALLOW 0
#define KVM_PMU_EVENT_DENY 1
__u8 action;
__u8 pad[3];
};
__u8 action;
__u8 pad[3];
};
A filter range is defined as the range [@base_event, @base_event + @nevents),
together with an @action (KVM_PMU_EVENT_ALLOW or KVM_PMU_EVENT_DENY). The
...
...
arch/arm64/kvm/hyp/pgtable.c
View file @
4e5dc64c
...
...
@@ -694,6 +694,7 @@ struct stage2_attr_data {
kvm_pte_t
attr_set
;
kvm_pte_t
attr_clr
;
kvm_pte_t
pte
;
u32
level
;
};
static
int
stage2_attr_walker
(
u64
addr
,
u64
end
,
u32
level
,
kvm_pte_t
*
ptep
,
...
...
@@ -706,6 +707,7 @@ static int stage2_attr_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
if
(
!
kvm_pte_valid
(
pte
))
return
0
;
data
->
level
=
level
;
data
->
pte
=
pte
;
pte
&=
~
data
->
attr_clr
;
pte
|=
data
->
attr_set
;
...
...
@@ -723,7 +725,8 @@ static int stage2_attr_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
static
int
stage2_update_leaf_attrs
(
struct
kvm_pgtable
*
pgt
,
u64
addr
,
u64
size
,
kvm_pte_t
attr_set
,
kvm_pte_t
attr_clr
,
kvm_pte_t
*
orig_pte
)
kvm_pte_t
attr_clr
,
kvm_pte_t
*
orig_pte
,
u32
*
level
)
{
int
ret
;
kvm_pte_t
attr_mask
=
KVM_PTE_LEAF_ATTR_LO
|
KVM_PTE_LEAF_ATTR_HI
;
...
...
@@ -743,20 +746,24 @@ static int stage2_update_leaf_attrs(struct kvm_pgtable *pgt, u64 addr,
if
(
orig_pte
)
*
orig_pte
=
data
.
pte
;
if
(
level
)
*
level
=
data
.
level
;
return
0
;
}
int
kvm_pgtable_stage2_wrprotect
(
struct
kvm_pgtable
*
pgt
,
u64
addr
,
u64
size
)
{
return
stage2_update_leaf_attrs
(
pgt
,
addr
,
size
,
0
,
KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W
,
NULL
);
KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W
,
NULL
,
NULL
);
}
kvm_pte_t
kvm_pgtable_stage2_mkyoung
(
struct
kvm_pgtable
*
pgt
,
u64
addr
)
{
kvm_pte_t
pte
=
0
;
stage2_update_leaf_attrs
(
pgt
,
addr
,
1
,
KVM_PTE_LEAF_ATTR_LO_S2_AF
,
0
,
&
pte
);
&
pte
,
NULL
);
dsb
(
ishst
);
return
pte
;
}
...
...
@@ -765,7 +772,7 @@ kvm_pte_t kvm_pgtable_stage2_mkold(struct kvm_pgtable *pgt, u64 addr)
{
kvm_pte_t
pte
=
0
;
stage2_update_leaf_attrs
(
pgt
,
addr
,
1
,
0
,
KVM_PTE_LEAF_ATTR_LO_S2_AF
,
&
pte
);
&
pte
,
NULL
);
/*
* "But where's the TLBI?!", you scream.
* "Over in the core code", I sigh.
...
...
@@ -778,7 +785,7 @@ kvm_pte_t kvm_pgtable_stage2_mkold(struct kvm_pgtable *pgt, u64 addr)
bool
kvm_pgtable_stage2_is_young
(
struct
kvm_pgtable
*
pgt
,
u64
addr
)
{
kvm_pte_t
pte
=
0
;
stage2_update_leaf_attrs
(
pgt
,
addr
,
1
,
0
,
0
,
&
pte
);
stage2_update_leaf_attrs
(
pgt
,
addr
,
1
,
0
,
0
,
&
pte
,
NULL
);
return
pte
&
KVM_PTE_LEAF_ATTR_LO_S2_AF
;
}
...
...
@@ -786,6 +793,7 @@ int kvm_pgtable_stage2_relax_perms(struct kvm_pgtable *pgt, u64 addr,
enum
kvm_pgtable_prot
prot
)
{
int
ret
;
u32
level
;
kvm_pte_t
set
=
0
,
clr
=
0
;
if
(
prot
&
KVM_PGTABLE_PROT_R
)
...
...
@@ -797,8 +805,9 @@ int kvm_pgtable_stage2_relax_perms(struct kvm_pgtable *pgt, u64 addr,
if
(
prot
&
KVM_PGTABLE_PROT_X
)
clr
|=
KVM_PTE_LEAF_ATTR_HI_S2_XN
;
ret
=
stage2_update_leaf_attrs
(
pgt
,
addr
,
1
,
set
,
clr
,
NULL
);
kvm_call_hyp
(
__kvm_tlb_flush_vmid_ipa
,
pgt
->
mmu
,
addr
,
0
);
ret
=
stage2_update_leaf_attrs
(
pgt
,
addr
,
1
,
set
,
clr
,
NULL
,
&
level
);
if
(
!
ret
)
kvm_call_hyp
(
__kvm_tlb_flush_vmid_ipa
,
pgt
->
mmu
,
addr
,
level
);
return
ret
;
}
...
...
arch/arm64/kvm/mmu.c
View file @
4e5dc64c
...
...
@@ -742,7 +742,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
struct
kvm_memory_slot
*
memslot
,
unsigned
long
hva
,
unsigned
long
fault_status
)
{
int
ret
;
int
ret
=
0
;
bool
write_fault
,
writable
,
force_pte
=
false
;
bool
exec_fault
;
bool
device
=
false
;
...
...
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