diff options
Diffstat (limited to 'drivers/xen/sys-hypervisor.c')
-rw-r--r-- | drivers/xen/sys-hypervisor.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/drivers/xen/sys-hypervisor.c b/drivers/xen/sys-hypervisor.c index cb29d1ccf0d9..1267d6fcc0c7 100644 --- a/drivers/xen/sys-hypervisor.c +++ b/drivers/xen/sys-hypervisor.c | |||
@@ -293,37 +293,48 @@ static ssize_t pagesize_show(struct hyp_sysfs_attr *attr, char *buffer) | |||
293 | 293 | ||
294 | HYPERVISOR_ATTR_RO(pagesize); | 294 | HYPERVISOR_ATTR_RO(pagesize); |
295 | 295 | ||
296 | /* eventually there will be several more features to export */ | ||
297 | static ssize_t xen_feature_show(int index, char *buffer) | 296 | static ssize_t xen_feature_show(int index, char *buffer) |
298 | { | 297 | { |
299 | int ret = -ENOMEM; | 298 | ssize_t ret; |
300 | struct xen_feature_info *info; | 299 | struct xen_feature_info info; |
301 | 300 | ||
302 | info = kmalloc(sizeof(struct xen_feature_info), GFP_KERNEL); | 301 | info.submap_idx = index; |
303 | if (info) { | 302 | ret = HYPERVISOR_xen_version(XENVER_get_features, &info); |
304 | info->submap_idx = index; | 303 | if (!ret) |
305 | ret = HYPERVISOR_xen_version(XENVER_get_features, info); | 304 | ret = sprintf(buffer, "%08x", info.submap); |
306 | if (!ret) | ||
307 | ret = sprintf(buffer, "%d\n", info->submap); | ||
308 | kfree(info); | ||
309 | } | ||
310 | 305 | ||
311 | return ret; | 306 | return ret; |
312 | } | 307 | } |
313 | 308 | ||
314 | static ssize_t writable_pt_show(struct hyp_sysfs_attr *attr, char *buffer) | 309 | static ssize_t features_show(struct hyp_sysfs_attr *attr, char *buffer) |
315 | { | 310 | { |
316 | return xen_feature_show(XENFEAT_writable_page_tables, buffer); | 311 | ssize_t len; |
312 | int i; | ||
313 | |||
314 | len = 0; | ||
315 | for (i = XENFEAT_NR_SUBMAPS-1; i >= 0; i--) { | ||
316 | int ret = xen_feature_show(i, buffer + len); | ||
317 | if (ret < 0) { | ||
318 | if (len == 0) | ||
319 | len = ret; | ||
320 | break; | ||
321 | } | ||
322 | len += ret; | ||
323 | } | ||
324 | if (len > 0) | ||
325 | buffer[len++] = '\n'; | ||
326 | |||
327 | return len; | ||
317 | } | 328 | } |
318 | 329 | ||
319 | HYPERVISOR_ATTR_RO(writable_pt); | 330 | HYPERVISOR_ATTR_RO(features); |
320 | 331 | ||
321 | static struct attribute *xen_properties_attrs[] = { | 332 | static struct attribute *xen_properties_attrs[] = { |
322 | &capabilities_attr.attr, | 333 | &capabilities_attr.attr, |
323 | &changeset_attr.attr, | 334 | &changeset_attr.attr, |
324 | &virtual_start_attr.attr, | 335 | &virtual_start_attr.attr, |
325 | &pagesize_attr.attr, | 336 | &pagesize_attr.attr, |
326 | &writable_pt_attr.attr, | 337 | &features_attr.attr, |
327 | NULL | 338 | NULL |
328 | }; | 339 | }; |
329 | 340 | ||