mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/ioreq: Make x86's send_invalidate_req() common
As the IOREQ is a common feature now and we also need to invalidate qemu/demu mapcache on Arm when the required condition occurs this patch moves this function to the common code (and remames it to ioreq_signal_mapcache_invalidate). This patch also moves per-domain qemu_mapcache_invalidate variable out of the arch sub-struct (and drops "qemu" prefix). We don't put this variable inside the #ifdef CONFIG_IOREQ_SERVER at the end of struct domain, but in the hole next to the group of 5 bools further up which is more efficient. The subsequent patch will add mapcache invalidation handling on Arm. Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com> CC: Julien Grall <julien.grall@arm.com> Reviewed-by: Paul Durrant <paul@xen.org> Acked-by: Jan Beulich <jbeulich@suse.com> [On Arm only] Tested-by: Wei Chen <Wei.Chen@arm.com>
This commit is contained in:
1 parent
ec1635ed87
commit
f677df3111
7 files changed
+25
-20
No files matched your search
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
#include <xen/lib.h>
|
||||
#include <xen/hypercall.h>
|
||||
#include <xen/ioreq.h>
|
||||
#include <xen/nospec.h>
|
||||
|
||||
#include <asm/hvm/emulate.h>
|
||||
@@ -47,7 +48,7 @@ static long hvm_memory_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
rc = compat_memory_op(cmd, arg);
|
||||
|
||||
if ( (cmd & MEMOP_CMD_MASK) == XENMEM_decrease_reservation )
|
||||
curr->domain->arch.hvm.qemu_mapcache_invalidate = true;
|
||||
curr->domain->mapcache_invalidate = true;
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -326,9 +327,9 @@ int hvm_hypercall(struct cpu_user_regs *regs)
|
||||
|
||||
HVM_DBG_LOG(DBG_LEVEL_HCALL, "hcall%lu -> %lx", eax, regs->rax);
|
||||
|
||||
if ( unlikely(currd->arch.hvm.qemu_mapcache_invalidate) &&
|
||||
test_and_clear_bool(currd->arch.hvm.qemu_mapcache_invalidate) )
|
||||
send_invalidate_req();
|
||||
if ( unlikely(currd->mapcache_invalidate) &&
|
||||
test_and_clear_bool(currd->mapcache_invalidate) )
|
||||
ioreq_signal_mapcache_invalidate();
|
||||
|
||||
return curr->hcall_preempted ? HVM_HCALL_preempted : HVM_HCALL_completed;
|
||||
}
|
||||
|
||||
@@ -64,20 +64,6 @@ void send_timeoffset_req(unsigned long timeoff)
|
||||
gprintk(XENLOG_ERR, "Unsuccessful timeoffset update\n");
|
||||
}
|
||||
|
||||
/* Ask ioemu mapcache to invalidate mappings. */
|
||||
void send_invalidate_req(void)
|
||||
{
|
||||
ioreq_t p = {
|
||||
.type = IOREQ_TYPE_INVALIDATE,
|
||||
.size = 4,
|
||||
.dir = IOREQ_WRITE,
|
||||
.data = ~0UL, /* flush all */
|
||||
};
|
||||
|
||||
if ( ioreq_broadcast(&p, false) != 0 )
|
||||
gprintk(XENLOG_ERR, "Unsuccessful map-cache invalidate\n");
|
||||
}
|
||||
|
||||
bool hvm_emulate_one_insn(hvm_emulate_validate_t *validate, const char *descr)
|
||||
{
|
||||
struct hvm_emulate_ctxt ctxt;
|
||||
|
||||
@@ -35,6 +35,20 @@
|
||||
#include <public/hvm/ioreq.h>
|
||||
#include <public/hvm/params.h>
|
||||
|
||||
/* Ask ioemu mapcache to invalidate mappings. */
|
||||
void ioreq_signal_mapcache_invalidate(void)
|
||||
{
|
||||
ioreq_t p = {
|
||||
.type = IOREQ_TYPE_INVALIDATE,
|
||||
.size = 4,
|
||||
.dir = IOREQ_WRITE,
|
||||
.data = ~0UL, /* flush all */
|
||||
};
|
||||
|
||||
if ( ioreq_broadcast(&p, false) != 0 )
|
||||
gprintk(XENLOG_ERR, "Unsuccessful map-cache invalidate\n");
|
||||
}
|
||||
|
||||
static void set_ioreq_server(struct domain *d, unsigned int id,
|
||||
struct ioreq_server *s)
|
||||
{
|
||||
|
||||
@@ -120,7 +120,6 @@ struct hvm_domain {
|
||||
|
||||
struct viridian_domain *viridian;
|
||||
|
||||
bool_t qemu_mapcache_invalidate;
|
||||
bool_t is_s3_suspended;
|
||||
|
||||
/*
|
||||
|
||||
@@ -97,7 +97,6 @@ bool relocate_portio_handler(
|
||||
unsigned int size);
|
||||
|
||||
void send_timeoffset_req(unsigned long timeoff);
|
||||
void send_invalidate_req(void);
|
||||
bool handle_mmio_with_translation(unsigned long gla, unsigned long gpfn,
|
||||
struct npfec);
|
||||
bool handle_pio(uint16_t port, unsigned int size, int dir);
|
||||
|
||||
@@ -103,6 +103,7 @@ struct ioreq_server *ioreq_server_select(struct domain *d,
|
||||
int ioreq_send(struct ioreq_server *s, ioreq_t *proto_p,
|
||||
bool buffered);
|
||||
unsigned int ioreq_broadcast(ioreq_t *p, bool buffered);
|
||||
void ioreq_signal_mapcache_invalidate(void);
|
||||
|
||||
void ioreq_domain_init(struct domain *d);
|
||||
|
||||
|
||||
@@ -444,6 +444,11 @@ struct domain
|
||||
* unpaused for the first time by the systemcontroller.
|
||||
*/
|
||||
bool creation_finished;
|
||||
/*
|
||||
* Indicates that mapcache invalidation request should be sent to
|
||||
* the device emulator.
|
||||
*/
|
||||
bool mapcache_invalidate;
|
||||
|
||||
/* Which guest this guest has privileges on */
|
||||
struct domain *target;
|
||||
|
||||