forked from Minki/linux
909b3fdb0d
For MSI-X capable devices the hypervisor wants to write protect the MSI-X table and PBA, yet it can't assume that resources have been assigned to their final values at device enumeration time. Thus have pciback do that notification, as having the device controlled by it is a prerequisite to assigning the device to guests anyway. This is the kernel part of hypervisor side commit 4245d33 ("x86/MSI: add mechanism to fully protect MSI-X table from PV guest accesses") on the master branch of git://xenbits.xen.org/xen.git. CC: stable@vger.kernel.org Signed-off-by: Jan Beulich <jbeulich@suse.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
82 lines
1.5 KiB
C
82 lines
1.5 KiB
C
#include <linux/kernel.h>
|
|
#include <linux/string.h>
|
|
#include <linux/bug.h>
|
|
#include <linux/export.h>
|
|
#include <asm/hypervisor.h>
|
|
#include <asm/xen/hypercall.h>
|
|
|
|
int xen_event_channel_op_compat(int cmd, void *arg)
|
|
{
|
|
struct evtchn_op op;
|
|
int rc;
|
|
|
|
op.cmd = cmd;
|
|
memcpy(&op.u, arg, sizeof(op.u));
|
|
rc = _hypercall1(int, event_channel_op_compat, &op);
|
|
|
|
switch (cmd) {
|
|
case EVTCHNOP_close:
|
|
case EVTCHNOP_send:
|
|
case EVTCHNOP_bind_vcpu:
|
|
case EVTCHNOP_unmask:
|
|
/* no output */
|
|
break;
|
|
|
|
#define COPY_BACK(eop) \
|
|
case EVTCHNOP_##eop: \
|
|
memcpy(arg, &op.u.eop, sizeof(op.u.eop)); \
|
|
break
|
|
|
|
COPY_BACK(bind_interdomain);
|
|
COPY_BACK(bind_virq);
|
|
COPY_BACK(bind_pirq);
|
|
COPY_BACK(status);
|
|
COPY_BACK(alloc_unbound);
|
|
COPY_BACK(bind_ipi);
|
|
#undef COPY_BACK
|
|
|
|
default:
|
|
WARN_ON(rc != -ENOSYS);
|
|
break;
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
EXPORT_SYMBOL_GPL(xen_event_channel_op_compat);
|
|
|
|
int xen_physdev_op_compat(int cmd, void *arg)
|
|
{
|
|
struct physdev_op op;
|
|
int rc;
|
|
|
|
op.cmd = cmd;
|
|
memcpy(&op.u, arg, sizeof(op.u));
|
|
rc = _hypercall1(int, physdev_op_compat, &op);
|
|
|
|
switch (cmd) {
|
|
case PHYSDEVOP_IRQ_UNMASK_NOTIFY:
|
|
case PHYSDEVOP_set_iopl:
|
|
case PHYSDEVOP_set_iobitmap:
|
|
case PHYSDEVOP_apic_write:
|
|
/* no output */
|
|
break;
|
|
|
|
#define COPY_BACK(pop, fld) \
|
|
case PHYSDEVOP_##pop: \
|
|
memcpy(arg, &op.u.fld, sizeof(op.u.fld)); \
|
|
break
|
|
|
|
COPY_BACK(irq_status_query, irq_status_query);
|
|
COPY_BACK(apic_read, apic_op);
|
|
COPY_BACK(ASSIGN_VECTOR, irq_op);
|
|
#undef COPY_BACK
|
|
|
|
default:
|
|
WARN_ON(rc != -ENOSYS);
|
|
break;
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
EXPORT_SYMBOL_GPL(xen_physdev_op_compat);
|