diff options
author | Eric Auger <eric.auger@linaro.org> | 2015-12-21 11:27:39 -0500 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2016-05-20 09:40:02 -0400 |
commit | e5c3029467cfa0acd89cfbd9cee1ae848e5eb8b0 (patch) | |
tree | 52b18772ccfa5ee46ec0ec4420888c71ab441213 /virt | |
parent | e2c1f9abff83ee0ad0f78e03918c7edf070edb39 (diff) |
KVM: arm/arm64: vgic-new: vgic_kvm_device: KVM_DEV_ARM_VGIC_GRP_ADDR
This patch implements the KVM_DEV_ARM_VGIC_GRP_ADDR group which
enables to set the base address of GIC regions as seen by the guest.
Signed-off-by: Eric Auger <eric.auger@linaro.org>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/arm/vgic/vgic-kvm-device.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/virt/kvm/arm/vgic/vgic-kvm-device.c b/virt/kvm/arm/vgic/vgic-kvm-device.c index 082829a764dd..a7090970be72 100644 --- a/virt/kvm/arm/vgic/vgic-kvm-device.c +++ b/virt/kvm/arm/vgic/vgic-kvm-device.c | |||
@@ -112,6 +112,17 @@ static int vgic_set_common_attr(struct kvm_device *dev, | |||
112 | int r; | 112 | int r; |
113 | 113 | ||
114 | switch (attr->group) { | 114 | switch (attr->group) { |
115 | case KVM_DEV_ARM_VGIC_GRP_ADDR: { | ||
116 | u64 __user *uaddr = (u64 __user *)(long)attr->addr; | ||
117 | u64 addr; | ||
118 | unsigned long type = (unsigned long)attr->attr; | ||
119 | |||
120 | if (copy_from_user(&addr, uaddr, sizeof(addr))) | ||
121 | return -EFAULT; | ||
122 | |||
123 | r = kvm_vgic_addr(dev->kvm, type, &addr, true); | ||
124 | return (r == -ENODEV) ? -ENXIO : r; | ||
125 | } | ||
115 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: { | 126 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: { |
116 | u32 __user *uaddr = (u32 __user *)(long)attr->addr; | 127 | u32 __user *uaddr = (u32 __user *)(long)attr->addr; |
117 | u32 val; | 128 | u32 val; |
@@ -164,6 +175,19 @@ static int vgic_get_common_attr(struct kvm_device *dev, | |||
164 | int r = -ENXIO; | 175 | int r = -ENXIO; |
165 | 176 | ||
166 | switch (attr->group) { | 177 | switch (attr->group) { |
178 | case KVM_DEV_ARM_VGIC_GRP_ADDR: { | ||
179 | u64 __user *uaddr = (u64 __user *)(long)attr->addr; | ||
180 | u64 addr; | ||
181 | unsigned long type = (unsigned long)attr->attr; | ||
182 | |||
183 | r = kvm_vgic_addr(dev->kvm, type, &addr, false); | ||
184 | if (r) | ||
185 | return (r == -ENODEV) ? -ENXIO : r; | ||
186 | |||
187 | if (copy_to_user(uaddr, &addr, sizeof(addr))) | ||
188 | return -EFAULT; | ||
189 | break; | ||
190 | } | ||
167 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: { | 191 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: { |
168 | u32 __user *uaddr = (u32 __user *)(long)attr->addr; | 192 | u32 __user *uaddr = (u32 __user *)(long)attr->addr; |
169 | 193 | ||
@@ -227,6 +251,13 @@ static int vgic_v2_has_attr(struct kvm_device *dev, | |||
227 | struct kvm_device_attr *attr) | 251 | struct kvm_device_attr *attr) |
228 | { | 252 | { |
229 | switch (attr->group) { | 253 | switch (attr->group) { |
254 | case KVM_DEV_ARM_VGIC_GRP_ADDR: | ||
255 | switch (attr->attr) { | ||
256 | case KVM_VGIC_V2_ADDR_TYPE_DIST: | ||
257 | case KVM_VGIC_V2_ADDR_TYPE_CPU: | ||
258 | return 0; | ||
259 | } | ||
260 | break; | ||
230 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: | 261 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: |
231 | return 0; | 262 | return 0; |
232 | case KVM_DEV_ARM_VGIC_GRP_CTRL: | 263 | case KVM_DEV_ARM_VGIC_GRP_CTRL: |
@@ -267,6 +298,13 @@ static int vgic_v3_has_attr(struct kvm_device *dev, | |||
267 | struct kvm_device_attr *attr) | 298 | struct kvm_device_attr *attr) |
268 | { | 299 | { |
269 | switch (attr->group) { | 300 | switch (attr->group) { |
301 | case KVM_DEV_ARM_VGIC_GRP_ADDR: | ||
302 | switch (attr->attr) { | ||
303 | case KVM_VGIC_V3_ADDR_TYPE_DIST: | ||
304 | case KVM_VGIC_V3_ADDR_TYPE_REDIST: | ||
305 | return 0; | ||
306 | } | ||
307 | break; | ||
270 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: | 308 | case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: |
271 | return 0; | 309 | return 0; |
272 | case KVM_DEV_ARM_VGIC_GRP_CTRL: | 310 | case KVM_DEV_ARM_VGIC_GRP_CTRL: |