aboutsummaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorEric Auger <eric.auger@linaro.org>2015-12-21 11:27:39 -0500
committerChristoffer Dall <christoffer.dall@linaro.org>2016-05-20 09:40:02 -0400
commite5c3029467cfa0acd89cfbd9cee1ae848e5eb8b0 (patch)
tree52b18772ccfa5ee46ec0ec4420888c71ab441213 /virt
parente2c1f9abff83ee0ad0f78e03918c7edf070edb39 (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.c38
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: