projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'linux-watchdog-5.15-rc1' of git://www.linux-watchdog.org/linux-watchdog
[linux-2.6-microblaze.git]
/
arch
/
arm64
/
kvm
/
psci.c
diff --git
a/arch/arm64/kvm/psci.c
b/arch/arm64/kvm/psci.c
index
db4056e
..
74c47d4
100644
(file)
--- a/
arch/arm64/kvm/psci.c
+++ b/
arch/arm64/kvm/psci.c
@@
-59,6
+59,12
@@
static void kvm_psci_vcpu_off(struct kvm_vcpu *vcpu)
kvm_vcpu_kick(vcpu);
}
kvm_vcpu_kick(vcpu);
}
+static inline bool kvm_psci_valid_affinity(struct kvm_vcpu *vcpu,
+ unsigned long affinity)
+{
+ return !(affinity & ~MPIDR_HWID_BITMASK);
+}
+
static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)
{
struct vcpu_reset_state *reset_state;
static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)
{
struct vcpu_reset_state *reset_state;
@@
-66,9
+72,9
@@
static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)
struct kvm_vcpu *vcpu = NULL;
unsigned long cpu_id;
struct kvm_vcpu *vcpu = NULL;
unsigned long cpu_id;
- cpu_id = smccc_get_arg1(source_vcpu)
& MPIDR_HWID_BITMASK
;
- if (
vcpu_mode_is_32bit(source_vcpu
))
-
cpu_id &= ~((u32) 0)
;
+ cpu_id = smccc_get_arg1(source_vcpu);
+ if (
!kvm_psci_valid_affinity(source_vcpu, cpu_id
))
+
return PSCI_RET_INVALID_PARAMS
;
vcpu = kvm_mpidr_to_vcpu(kvm, cpu_id);
vcpu = kvm_mpidr_to_vcpu(kvm, cpu_id);
@@
-126,6
+132,9
@@
static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu)
target_affinity = smccc_get_arg1(vcpu);
lowest_affinity_level = smccc_get_arg2(vcpu);
target_affinity = smccc_get_arg1(vcpu);
lowest_affinity_level = smccc_get_arg2(vcpu);
+ if (!kvm_psci_valid_affinity(vcpu, target_affinity))
+ return PSCI_RET_INVALID_PARAMS;
+
/* Determine target affinity mask */
target_affinity_mask = psci_affinity_mask(lowest_affinity_level);
if (!target_affinity_mask)
/* Determine target affinity mask */
target_affinity_mask = psci_affinity_mask(lowest_affinity_level);
if (!target_affinity_mask)