|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [v4][PATCH 6/9] xen:x86:: support xc_reserved_device_memory_map in compat case
We also need to make sure xc_reserved_device_memory_map can
work in compat case.
Mostly refer to that complete xc_reserved_device_memory_map
hypercall definition, just work with struct
compat_reserved_device_memory_map and struct
compat_reserved_device_memory.
Signed-off-by: Tiejun Chen <tiejun.chen@xxxxxxxxx>
---
xen/arch/x86/x86_64/compat/mm.c | 62 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 69c6195..887a778 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -215,6 +215,68 @@ int compat_arch_memory_op(unsigned long cmd,
XEN_GUEST_HANDLE_PARAM(void) arg)
break;
}
+ case XENMEM_reserved_device_memory_map:
+ {
+ struct compat_reserved_device_memory_map map;
+ unsigned int i = 0;
+ static unsigned int nr_entries = 0;
+ static struct compat_reserved_device_memory *rmrr_map;
+ struct acpi_rmrr_unit *rmrr;
+
+ if ( copy_from_guest(&map, arg, 1) )
+ return -EFAULT;
+
+ if ( !nr_entries )
+ /* Currently we just need to cover RMRR. */
+ list_for_each_entry( rmrr, &acpi_rmrr_units, list )
+ nr_entries++;
+
+ if ( !nr_entries )
+ return -ENOENT;
+ else
+ {
+ if ( rmrr_map == NULL )
+ {
+ rmrr_map = xmalloc_array(compat_reserved_device_memory_t,
+ nr_entries);
+ if ( rmrr_map == NULL )
+ {
+ return -ENOMEM;
+ }
+
+ list_for_each_entry( rmrr, &acpi_rmrr_units, list )
+ {
+ rmrr_map[i].pfn = rmrr->base_address >> PAGE_SHIFT;
+ rmrr_map[i].count = PAGE_ALIGN(rmrr->end_address -
+ rmrr->base_address) /
+ PAGE_SIZE;
+ i++;
+ }
+ }
+ }
+
+ if ( map.nr_entries < nr_entries )
+ {
+ map.nr_entries = nr_entries;
+ if ( copy_to_guest(arg, &map, 1) )
+ return -EFAULT;
+ return -ENOBUFS;
+ }
+
+ map.nr_entries = nr_entries;
+
+ for ( i = 0; i < map.nr_entries; ++i )
+ {
+ if ( copy_to_compat_offset(map.buffer, i, rmrr_map + i, 1) )
+ return -EFAULT;
+ }
+
+ if ( copy_to_guest(arg, &map, 1) )
+ return -EFAULT;
+
+ break;
+ }
+
default:
rc = -ENOSYS;
break;
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |