mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/mm: Make x86's XENMEM_resource_ioreq_server handling common
As x86 implementation of XENMEM_resource_ioreq_server can be re-used on Arm later on, this patch makes it common and removes arch_acquire_resource (and the corresponding option) as unneeded. Also re-order #include-s alphabetically. This support is going to be used on Arm to be able run device emulator outside of Xen hypervisor. Signed-off-by: Julien Grall <julien.grall@arm.com> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Paul Durrant <paul@xen.org> [On Arm only] Tested-by: Wei Chen <Wei.Chen@arm.com>
This commit is contained in:
1 parent
fe5df63c08
commit
e22906cf81
6 files changed
+51
-73
No files matched your search
@@ -6,7 +6,6 @@ config X86
|
||||
select ACPI
|
||||
select ACPI_LEGACY_TABLES_LOOKUP
|
||||
select ARCH_SUPPORTS_INT128
|
||||
select ARCH_ACQUIRE_RESOURCE
|
||||
select COMPAT
|
||||
select CORE_PARKING
|
||||
select HAS_ALTERNATIVE
|
||||
|
||||
@@ -4587,50 +4587,6 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
|
||||
return err || s > e ? err : _handle_iomem_range(s, e, p);
|
||||
}
|
||||
|
||||
int arch_acquire_resource(struct domain *d, unsigned int type,
|
||||
unsigned int id, unsigned long frame,
|
||||
unsigned int nr_frames, xen_pfn_t mfn_list[])
|
||||
{
|
||||
int rc;
|
||||
|
||||
switch ( type )
|
||||
{
|
||||
#ifdef CONFIG_HVM
|
||||
case XENMEM_resource_ioreq_server:
|
||||
{
|
||||
ioservid_t ioservid = id;
|
||||
unsigned int i;
|
||||
|
||||
rc = -EINVAL;
|
||||
if ( !is_hvm_domain(d) )
|
||||
break;
|
||||
|
||||
if ( id != (unsigned int)ioservid )
|
||||
break;
|
||||
|
||||
rc = 0;
|
||||
for ( i = 0; i < nr_frames; i++ )
|
||||
{
|
||||
mfn_t mfn;
|
||||
|
||||
rc = hvm_get_ioreq_server_frame(d, id, frame + i, &mfn);
|
||||
if ( rc )
|
||||
break;
|
||||
|
||||
mfn_list[i] = mfn_x(mfn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
default:
|
||||
rc = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
long arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -22,9 +22,6 @@ config GRANT_TABLE
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config ARCH_ACQUIRE_RESOURCE
|
||||
bool
|
||||
|
||||
config HAS_ALTERNATIVE
|
||||
bool
|
||||
|
||||
|
||||
+51
-12
@@ -8,22 +8,23 @@
|
||||
*/
|
||||
|
||||
#include <xen/domain_page.h>
|
||||
#include <xen/types.h>
|
||||
#include <xen/errno.h>
|
||||
#include <xen/event.h>
|
||||
#include <xen/grant_table.h>
|
||||
#include <xen/guest_access.h>
|
||||
#include <xen/hypercall.h>
|
||||
#include <xen/iocap.h>
|
||||
#include <xen/ioreq.h>
|
||||
#include <xen/lib.h>
|
||||
#include <xen/mem_access.h>
|
||||
#include <xen/mm.h>
|
||||
#include <xen/numa.h>
|
||||
#include <xen/paging.h>
|
||||
#include <xen/param.h>
|
||||
#include <xen/perfc.h>
|
||||
#include <xen/sched.h>
|
||||
#include <xen/event.h>
|
||||
#include <xen/paging.h>
|
||||
#include <xen/iocap.h>
|
||||
#include <xen/guest_access.h>
|
||||
#include <xen/hypercall.h>
|
||||
#include <xen/errno.h>
|
||||
#include <xen/numa.h>
|
||||
#include <xen/mem_access.h>
|
||||
#include <xen/trace.h>
|
||||
#include <xen/grant_table.h>
|
||||
#include <xen/types.h>
|
||||
#include <asm/current.h>
|
||||
#include <asm/hardirq.h>
|
||||
#include <asm/p2m.h>
|
||||
@@ -1091,6 +1092,40 @@ static int acquire_grant_table(struct domain *d, unsigned int id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acquire_ioreq_server(struct domain *d,
|
||||
unsigned int id,
|
||||
unsigned long frame,
|
||||
unsigned int nr_frames,
|
||||
xen_pfn_t mfn_list[])
|
||||
{
|
||||
#ifdef CONFIG_IOREQ_SERVER
|
||||
ioservid_t ioservid = id;
|
||||
unsigned int i;
|
||||
int rc;
|
||||
|
||||
if ( !is_hvm_domain(d) )
|
||||
return -EINVAL;
|
||||
|
||||
if ( id != (unsigned int)ioservid )
|
||||
return -EINVAL;
|
||||
|
||||
for ( i = 0; i < nr_frames; i++ )
|
||||
{
|
||||
mfn_t mfn;
|
||||
|
||||
rc = hvm_get_ioreq_server_frame(d, id, frame + i, &mfn);
|
||||
if ( rc )
|
||||
return rc;
|
||||
|
||||
mfn_list[i] = mfn_x(mfn);
|
||||
}
|
||||
|
||||
return 0;
|
||||
#else
|
||||
return -EOPNOTSUPP;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int acquire_resource(
|
||||
XEN_GUEST_HANDLE_PARAM(xen_mem_acquire_resource_t) arg)
|
||||
{
|
||||
@@ -1149,9 +1184,13 @@ static int acquire_resource(
|
||||
mfn_list);
|
||||
break;
|
||||
|
||||
case XENMEM_resource_ioreq_server:
|
||||
rc = acquire_ioreq_server(d, xmar.id, xmar.frame, xmar.nr_frames,
|
||||
mfn_list);
|
||||
break;
|
||||
|
||||
default:
|
||||
rc = arch_acquire_resource(d, xmar.type, xmar.id, xmar.frame,
|
||||
xmar.nr_frames, mfn_list);
|
||||
rc = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -640,8 +640,4 @@ static inline bool arch_mfn_in_directmap(unsigned long mfn)
|
||||
return mfn <= (virt_to_mfn(eva - 1) + 1);
|
||||
}
|
||||
|
||||
int arch_acquire_resource(struct domain *d, unsigned int type,
|
||||
unsigned int id, unsigned long frame,
|
||||
unsigned int nr_frames, xen_pfn_t mfn_list[]);
|
||||
|
||||
#endif /* __ASM_X86_MM_H__ */
|
||||
@@ -612,13 +612,4 @@ static inline void put_page_alloc_ref(struct page_info *page)
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef CONFIG_ARCH_ACQUIRE_RESOURCE
|
||||
static inline int arch_acquire_resource(
|
||||
struct domain *d, unsigned int type, unsigned int id, unsigned long frame,
|
||||
unsigned int nr_frames, xen_pfn_t mfn_list[])
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif /* !CONFIG_ARCH_ACQUIRE_RESOURCE */
|
||||
|
||||
#endif /* __XEN_MM_H__ */
|
||||