mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
TODO:
1. Fix IO-APIC ID to not conflict with LAPIC IDS.
2. Fix i8259 device model (seems to work already though!).
3. Add INTSRC overrides in MPBIOS and ACPI tables so
that PCI legacy IRQ routing always ends up at an
IO-APIC input with level trigger. Restricting link
routing to {5,6,10,11} and setting overrides for all
four of those would work.
Signed-off-by: Keir Fraser <keir@xensource.com>
193 lines
4.1 KiB
C
193 lines
4.1 KiB
C
/******************************************************************************
|
|
* xc_misc.c
|
|
*
|
|
* Miscellaneous control interface functions.
|
|
*/
|
|
|
|
#include "xc_private.h"
|
|
#include <xen/hvm/hvm_op.h>
|
|
|
|
int xc_readconsolering(int xc_handle,
|
|
char **pbuffer,
|
|
unsigned int *pnr_chars,
|
|
int clear)
|
|
{
|
|
int ret;
|
|
DECLARE_SYSCTL;
|
|
char *buffer = *pbuffer;
|
|
unsigned int nr_chars = *pnr_chars;
|
|
|
|
sysctl.cmd = XEN_SYSCTL_readconsole;
|
|
set_xen_guest_handle(sysctl.u.readconsole.buffer, buffer);
|
|
sysctl.u.readconsole.count = nr_chars;
|
|
sysctl.u.readconsole.clear = clear;
|
|
|
|
if ( (ret = lock_pages(buffer, nr_chars)) != 0 )
|
|
return ret;
|
|
|
|
if ( (ret = do_sysctl(xc_handle, &sysctl)) == 0 )
|
|
*pnr_chars = sysctl.u.readconsole.count;
|
|
|
|
unlock_pages(buffer, nr_chars);
|
|
|
|
return ret;
|
|
}
|
|
|
|
int xc_physinfo(int xc_handle,
|
|
xc_physinfo_t *put_info)
|
|
{
|
|
int ret;
|
|
DECLARE_SYSCTL;
|
|
|
|
sysctl.cmd = XEN_SYSCTL_physinfo;
|
|
|
|
if ( (ret = do_sysctl(xc_handle, &sysctl)) != 0 )
|
|
return ret;
|
|
|
|
memcpy(put_info, &sysctl.u.physinfo, sizeof(*put_info));
|
|
|
|
return 0;
|
|
}
|
|
|
|
int xc_sched_id(int xc_handle,
|
|
int *sched_id)
|
|
{
|
|
int ret;
|
|
DECLARE_SYSCTL;
|
|
|
|
sysctl.cmd = XEN_SYSCTL_sched_id;
|
|
|
|
if ( (ret = do_sysctl(xc_handle, &sysctl)) != 0 )
|
|
return ret;
|
|
|
|
*sched_id = sysctl.u.sched_id.sched_id;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int xc_perfc_control(int xc_handle,
|
|
uint32_t opcode,
|
|
xc_perfc_desc_t *desc,
|
|
xc_perfc_val_t *val,
|
|
int *nbr_desc,
|
|
int *nbr_val)
|
|
{
|
|
int rc;
|
|
DECLARE_SYSCTL;
|
|
|
|
sysctl.cmd = XEN_SYSCTL_perfc_op;
|
|
sysctl.u.perfc_op.cmd = opcode;
|
|
set_xen_guest_handle(sysctl.u.perfc_op.desc, desc);
|
|
set_xen_guest_handle(sysctl.u.perfc_op.val, val);
|
|
|
|
rc = do_sysctl(xc_handle, &sysctl);
|
|
|
|
if (nbr_desc)
|
|
*nbr_desc = sysctl.u.perfc_op.nr_counters;
|
|
if (nbr_val)
|
|
*nbr_val = sysctl.u.perfc_op.nr_vals;
|
|
|
|
return rc;
|
|
}
|
|
|
|
int xc_hvm_set_pci_intx_level(
|
|
int xc_handle, domid_t dom,
|
|
uint8_t domain, uint8_t bus, uint8_t device, uint8_t intx,
|
|
unsigned int level)
|
|
{
|
|
DECLARE_HYPERCALL;
|
|
struct xen_hvm_set_pci_intx_level arg;
|
|
int rc;
|
|
|
|
hypercall.op = __HYPERVISOR_hvm_op;
|
|
hypercall.arg[0] = HVMOP_set_pci_intx_level;
|
|
hypercall.arg[1] = (unsigned long)&arg;
|
|
|
|
arg.domid = dom;
|
|
arg.domain = domain;
|
|
arg.bus = bus;
|
|
arg.device = device;
|
|
arg.intx = intx;
|
|
arg.level = level;
|
|
|
|
if ( mlock(&arg, sizeof(arg)) != 0 )
|
|
{
|
|
PERROR("Could not lock memory");
|
|
return -1;
|
|
}
|
|
|
|
rc = do_xen_hypercall(xc_handle, &hypercall);
|
|
|
|
safe_munlock(&arg, sizeof(arg));
|
|
|
|
return rc;
|
|
}
|
|
|
|
int xc_hvm_set_isa_irq_level(
|
|
int xc_handle, domid_t dom,
|
|
uint8_t isa_irq,
|
|
unsigned int level)
|
|
{
|
|
DECLARE_HYPERCALL;
|
|
struct xen_hvm_set_isa_irq_level arg;
|
|
int rc;
|
|
|
|
hypercall.op = __HYPERVISOR_hvm_op;
|
|
hypercall.arg[0] = HVMOP_set_isa_irq_level;
|
|
hypercall.arg[1] = (unsigned long)&arg;
|
|
|
|
arg.domid = dom;
|
|
arg.isa_irq = isa_irq;
|
|
arg.level = level;
|
|
|
|
if ( mlock(&arg, sizeof(arg)) != 0 )
|
|
{
|
|
PERROR("Could not lock memory");
|
|
return -1;
|
|
}
|
|
|
|
rc = do_xen_hypercall(xc_handle, &hypercall);
|
|
|
|
safe_munlock(&arg, sizeof(arg));
|
|
|
|
return rc;
|
|
}
|
|
|
|
int xc_hvm_set_pci_link_route(
|
|
int xc_handle, domid_t dom, uint8_t link, uint8_t isa_irq)
|
|
{
|
|
DECLARE_HYPERCALL;
|
|
struct xen_hvm_set_pci_link_route arg;
|
|
int rc;
|
|
|
|
hypercall.op = __HYPERVISOR_hvm_op;
|
|
hypercall.arg[0] = HVMOP_set_pci_link_route;
|
|
hypercall.arg[1] = (unsigned long)&arg;
|
|
|
|
arg.domid = dom;
|
|
arg.link = link;
|
|
arg.isa_irq = isa_irq;
|
|
|
|
if ( mlock(&arg, sizeof(arg)) != 0 )
|
|
{
|
|
PERROR("Could not lock memory");
|
|
return -1;
|
|
}
|
|
|
|
rc = do_xen_hypercall(xc_handle, &hypercall);
|
|
|
|
safe_munlock(&arg, sizeof(arg));
|
|
|
|
return rc;
|
|
}
|
|
|
|
/*
|
|
* Local variables:
|
|
* mode: C
|
|
* c-set-style: "BSD"
|
|
* c-basic-offset: 4
|
|
* tab-width: 4
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*/
|