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
nexedi
linux
Commits
4e5dc64c
Commit
4e5dc64c
authored
4 years ago
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
...
...
This diff is collapsed.
Click to expand it.
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
;
}
...
...
This diff is collapsed.
Click to expand it.
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
;
...
...
This diff is collapsed.
Click to expand it.
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