mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 03:59:52 +00:00
xive: Add trace events
I have been keeping those logging messages in an ugly form for while. Make them clean ! Beware not to activate all of them, this is really verbose. Signed-off-by: Cédric Le Goater <clg@kaod.org> Message-Id: <20201123163717.1368450-1-clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
728aa6f6ff
commit
4e960974d4
@ -24,6 +24,7 @@
|
||||
#include "hw/ppc/xive.h"
|
||||
#include "hw/ppc/xive_regs.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "trace.h"
|
||||
|
||||
/*
|
||||
* XIVE Virtualization Controller BAR and Thread Managment BAR that we
|
||||
@ -556,6 +557,8 @@ static int spapr_xive_claim_irq(SpaprInterruptController *intc, int lisn,
|
||||
|
||||
assert(lisn < xive->nr_irqs);
|
||||
|
||||
trace_spapr_xive_claim_irq(lisn, lsi);
|
||||
|
||||
if (xive_eas_is_valid(&xive->eat[lisn])) {
|
||||
error_setg(errp, "IRQ %d is not free", lisn);
|
||||
return -EBUSY;
|
||||
@ -581,6 +584,8 @@ static void spapr_xive_free_irq(SpaprInterruptController *intc, int lisn)
|
||||
SpaprXive *xive = SPAPR_XIVE(intc);
|
||||
assert(lisn < xive->nr_irqs);
|
||||
|
||||
trace_spapr_xive_free_irq(lisn);
|
||||
|
||||
xive->eat[lisn].w &= cpu_to_be64(~EAS_VALID);
|
||||
}
|
||||
|
||||
@ -647,6 +652,8 @@ static void spapr_xive_set_irq(SpaprInterruptController *intc, int irq, int val)
|
||||
{
|
||||
SpaprXive *xive = SPAPR_XIVE(intc);
|
||||
|
||||
trace_spapr_xive_set_irq(irq, val);
|
||||
|
||||
if (spapr_xive_in_kernel(xive)) {
|
||||
kvmppc_xive_source_set_irq(&xive->source, irq, val);
|
||||
} else {
|
||||
@ -894,6 +901,8 @@ static target_ulong h_int_get_source_info(PowerPCCPU *cpu,
|
||||
target_ulong flags = args[0];
|
||||
target_ulong lisn = args[1];
|
||||
|
||||
trace_spapr_xive_get_source_info(flags, lisn);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1009,6 +1018,8 @@ static target_ulong h_int_set_source_config(PowerPCCPU *cpu,
|
||||
uint8_t end_blk;
|
||||
uint32_t end_idx;
|
||||
|
||||
trace_spapr_xive_set_source_config(flags, lisn, target, priority, eisn);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1114,6 +1125,8 @@ static target_ulong h_int_get_source_config(PowerPCCPU *cpu,
|
||||
uint8_t nvt_blk;
|
||||
uint32_t end_idx, nvt_idx;
|
||||
|
||||
trace_spapr_xive_get_source_config(flags, lisn);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1188,6 +1201,8 @@ static target_ulong h_int_get_queue_info(PowerPCCPU *cpu,
|
||||
uint8_t end_blk;
|
||||
uint32_t end_idx;
|
||||
|
||||
trace_spapr_xive_get_queue_info(flags, target, priority);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1275,6 +1290,8 @@ static target_ulong h_int_set_queue_config(PowerPCCPU *cpu,
|
||||
uint8_t end_blk, nvt_blk;
|
||||
uint32_t end_idx, nvt_idx;
|
||||
|
||||
trace_spapr_xive_set_queue_config(flags, target, priority, qpage, qsize);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1442,6 +1459,8 @@ static target_ulong h_int_get_queue_config(PowerPCCPU *cpu,
|
||||
uint8_t end_blk;
|
||||
uint32_t end_idx;
|
||||
|
||||
trace_spapr_xive_get_queue_config(flags, target, priority);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1535,6 +1554,10 @@ static target_ulong h_int_set_os_reporting_line(PowerPCCPU *cpu,
|
||||
target_ulong opcode,
|
||||
target_ulong *args)
|
||||
{
|
||||
target_ulong flags = args[0];
|
||||
|
||||
trace_spapr_xive_set_os_reporting_line(flags);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1571,6 +1594,10 @@ static target_ulong h_int_get_os_reporting_line(PowerPCCPU *cpu,
|
||||
target_ulong opcode,
|
||||
target_ulong *args)
|
||||
{
|
||||
target_ulong flags = args[0];
|
||||
|
||||
trace_spapr_xive_get_os_reporting_line(flags);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1623,6 +1650,8 @@ static target_ulong h_int_esb(PowerPCCPU *cpu,
|
||||
hwaddr mmio_addr;
|
||||
XiveSource *xsrc = &xive->source;
|
||||
|
||||
trace_spapr_xive_esb(flags, lisn, offset, data);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1692,6 +1721,8 @@ static target_ulong h_int_sync(PowerPCCPU *cpu,
|
||||
target_ulong flags = args[0];
|
||||
target_ulong lisn = args[1];
|
||||
|
||||
trace_spapr_xive_sync(flags, lisn);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
@ -1757,6 +1788,8 @@ static target_ulong h_int_reset(PowerPCCPU *cpu,
|
||||
SpaprXive *xive = spapr->xive;
|
||||
target_ulong flags = args[0];
|
||||
|
||||
trace_spapr_xive_reset(flags);
|
||||
|
||||
if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
|
||||
return H_FUNCTION;
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "hw/ppc/spapr_xive.h"
|
||||
#include "hw/ppc/xive.h"
|
||||
#include "kvm_ppc.h"
|
||||
#include "trace.h"
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
@ -163,6 +164,8 @@ int kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp)
|
||||
|
||||
vcpu_id = kvm_arch_vcpu_id(tctx->cs);
|
||||
|
||||
trace_kvm_xive_cpu_connect(vcpu_id);
|
||||
|
||||
ret = kvm_vcpu_enable_cap(tctx->cs, KVM_CAP_PPC_IRQ_XIVE, 0, xive->fd,
|
||||
vcpu_id, 0);
|
||||
if (ret < 0) {
|
||||
@ -308,6 +311,8 @@ uint64_t kvmppc_xive_esb_rw(XiveSource *xsrc, int srcno, uint32_t offset,
|
||||
return xive_esb_rw(xsrc, srcno, offset, data, 1);
|
||||
}
|
||||
|
||||
trace_kvm_xive_source_reset(srcno);
|
||||
|
||||
/*
|
||||
* Special Load EOI handling for LSI sources. Q bit is never set
|
||||
* and the interrupt should be re-triggered if the level is still
|
||||
|
@ -203,3 +203,36 @@ heathrow_set_irq(int num, int level) "set_irq: num=0x%02x level=%d"
|
||||
# bcm2835_ic.c
|
||||
bcm2835_ic_set_gpu_irq(int irq, int level) "GPU irq #%d level %d"
|
||||
bcm2835_ic_set_cpu_irq(int irq, int level) "CPU irq #%d level %d"
|
||||
|
||||
# spapr_xive.c
|
||||
spapr_xive_claim_irq(uint32_t lisn, bool lsi) "lisn=0x%x lsi=%d"
|
||||
spapr_xive_free_irq(uint32_t lisn) "lisn=0x%x"
|
||||
spapr_xive_set_irq(uint32_t lisn, uint32_t val) "lisn=0x%x val=%d"
|
||||
spapr_xive_get_source_info(uint64_t flags, uint64_t lisn) "flags=0x%"PRIx64" lisn=0x%"PRIx64
|
||||
spapr_xive_set_source_config(uint64_t flags, uint64_t lisn, uint64_t target, uint64_t priority, uint64_t eisn) "flags=0x%"PRIx64" lisn=0x%"PRIx64" target=0x%"PRIx64" priority=0x%"PRIx64" eisn=0x%"PRIx64
|
||||
spapr_xive_get_source_config(uint64_t flags, uint64_t lisn) "flags=0x%"PRIx64" lisn=0x%"PRIx64
|
||||
spapr_xive_get_queue_info(uint64_t flags, uint64_t target, uint64_t priority) "flags=0x%"PRIx64" target=0x%"PRIx64" priority=0x%"PRIx64
|
||||
spapr_xive_set_queue_config(uint64_t flags, uint64_t target, uint64_t priority, uint64_t qpage, uint64_t qsize) "flags=0x%"PRIx64" target=0x%"PRIx64" priority=0x%"PRIx64" qpage=0x%"PRIx64" qsize=0x%"PRIx64
|
||||
spapr_xive_get_queue_config(uint64_t flags, uint64_t target, uint64_t priority) "flags=0x%"PRIx64" target=0x%"PRIx64" priority=0x%"PRIx64
|
||||
spapr_xive_set_os_reporting_line(uint64_t flags) "flags=0x%"PRIx64
|
||||
spapr_xive_get_os_reporting_line(uint64_t flags) "flags=0x%"PRIx64
|
||||
spapr_xive_esb(uint64_t flags, uint64_t lisn, uint64_t offset, uint64_t data) "flags=0x%"PRIx64" lisn=0x%"PRIx64" offset=0x%"PRIx64" data=0x%"PRIx64
|
||||
spapr_xive_sync(uint64_t flags, uint64_t lisn) "flags=0x%"PRIx64" lisn=0x%"PRIx64
|
||||
spapr_xive_reset(uint64_t flags) "flags=0x%"PRIx64
|
||||
|
||||
# spapr_xive_kvm.c
|
||||
kvm_xive_cpu_connect(uint32_t id) "connect CPU%d to KVM device"
|
||||
kvm_xive_source_reset(uint32_t srcno) "IRQ 0x%x"
|
||||
|
||||
# xive.c
|
||||
xive_tctx_accept(uint32_t index, uint8_t ring, uint8_t ipb, uint8_t pipr, uint8_t cppr, uint8_t nsr) "target=%d ring=0x%x IBP=0x%02x PIPR=0x%02x CPPR=0x%02x NSR=0x%02x ACK"
|
||||
xive_tctx_notify(uint32_t index, uint8_t ring, uint8_t ipb, uint8_t pipr, uint8_t cppr, uint8_t nsr) "target=%d ring=0x%x IBP=0x%02x PIPR=0x%02x CPPR=0x%02x NSR=0x%02x raise !"
|
||||
xive_tctx_set_cppr(uint32_t index, uint8_t ring, uint8_t ipb, uint8_t pipr, uint8_t cppr, uint8_t nsr) "target=%d ring=0x%x IBP=0x%02x PIPR=0x%02x new CPPR=0x%02x NSR=0x%02x"
|
||||
xive_source_esb_read(uint64_t addr, uint32_t srcno, uint64_t value) "@0x0x%"PRIx64" IRQ 0x%x val=0x0x%"PRIx64
|
||||
xive_source_esb_write(uint64_t addr, uint32_t srcno, uint64_t value) "@0x0x%"PRIx64" IRQ 0x%x val=0x0x%"PRIx64
|
||||
xive_router_end_notify(uint8_t end_blk, uint32_t end_idx, uint32_t end_data) "END 0x%02x/0x%04x -> enqueue 0x%08x"
|
||||
xive_router_end_escalate(uint8_t end_blk, uint32_t end_idx, uint8_t esc_blk, uint32_t esc_idx, uint32_t end_data) "END 0x%02x/0x%04x -> escalate END 0x%02x/0x%04x data 0x%08x"
|
||||
xive_tctx_tm_write(uint64_t offset, unsigned int size, uint64_t value) "@0x0x%"PRIx64" sz=%d val=0x%" PRIx64
|
||||
xive_tctx_tm_read(uint64_t offset, unsigned int size, uint64_t value) "@0x0x%"PRIx64" sz=%d val=0x%" PRIx64
|
||||
xive_presenter_notify(uint8_t nvt_blk, uint32_t nvt_idx, uint8_t ring) "found NVT 0x%x/0x%x ring=0x%x"
|
||||
xive_end_source_read(uint8_t end_blk, uint32_t end_idx, uint64_t addr) "END 0x%x/0x%x @0x0x%"PRIx64
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "hw/irq.h"
|
||||
#include "hw/ppc/xive.h"
|
||||
#include "hw/ppc/xive_regs.h"
|
||||
#include "trace.h"
|
||||
|
||||
/*
|
||||
* XIVE Thread Interrupt Management context
|
||||
@ -93,6 +94,10 @@ static uint64_t xive_tctx_accept(XiveTCTX *tctx, uint8_t ring)
|
||||
|
||||
/* Drop Exception bit */
|
||||
regs[TM_NSR] &= ~mask;
|
||||
|
||||
trace_xive_tctx_accept(tctx->cs->cpu_index, ring,
|
||||
regs[TM_IPB], regs[TM_PIPR],
|
||||
regs[TM_CPPR], regs[TM_NSR]);
|
||||
}
|
||||
|
||||
return (nsr << 8) | regs[TM_CPPR];
|
||||
@ -113,12 +118,21 @@ static void xive_tctx_notify(XiveTCTX *tctx, uint8_t ring)
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
trace_xive_tctx_notify(tctx->cs->cpu_index, ring,
|
||||
regs[TM_IPB], regs[TM_PIPR],
|
||||
regs[TM_CPPR], regs[TM_NSR]);
|
||||
qemu_irq_raise(xive_tctx_output(tctx, ring));
|
||||
}
|
||||
}
|
||||
|
||||
static void xive_tctx_set_cppr(XiveTCTX *tctx, uint8_t ring, uint8_t cppr)
|
||||
{
|
||||
uint8_t *regs = &tctx->regs[ring];
|
||||
|
||||
trace_xive_tctx_set_cppr(tctx->cs->cpu_index, ring,
|
||||
regs[TM_IPB], regs[TM_PIPR],
|
||||
cppr, regs[TM_NSR]);
|
||||
|
||||
if (cppr > XIVE_PRIORITY_MAX) {
|
||||
cppr = 0xff;
|
||||
}
|
||||
@ -508,6 +522,8 @@ void xive_tctx_tm_write(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
|
||||
{
|
||||
const XiveTmOp *xto;
|
||||
|
||||
trace_xive_tctx_tm_write(offset, size, value);
|
||||
|
||||
/*
|
||||
* TODO: check V bit in Q[0-3]W2
|
||||
*/
|
||||
@ -545,6 +561,7 @@ uint64_t xive_tctx_tm_read(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
|
||||
unsigned size)
|
||||
{
|
||||
const XiveTmOp *xto;
|
||||
uint64_t ret;
|
||||
|
||||
/*
|
||||
* TODO: check V bit in Q[0-3]W2
|
||||
@ -560,7 +577,8 @@ uint64_t xive_tctx_tm_read(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
|
||||
"@%"HWADDR_PRIx"\n", offset);
|
||||
return -1;
|
||||
}
|
||||
return xto->read_handler(xptr, tctx, offset, size);
|
||||
ret = xto->read_handler(xptr, tctx, offset, size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -568,13 +586,17 @@ uint64_t xive_tctx_tm_read(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
|
||||
*/
|
||||
xto = xive_tm_find_op(offset, size, false);
|
||||
if (xto) {
|
||||
return xto->read_handler(xptr, tctx, offset, size);
|
||||
ret = xto->read_handler(xptr, tctx, offset, size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Finish with raw access to the register values
|
||||
*/
|
||||
return xive_tm_raw_read(tctx, offset, size);
|
||||
ret = xive_tm_raw_read(tctx, offset, size);
|
||||
out:
|
||||
trace_xive_tctx_tm_read(offset, size, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *xive_tctx_ring_print(uint8_t *ring)
|
||||
@ -1005,6 +1027,8 @@ static uint64_t xive_source_esb_read(void *opaque, hwaddr addr, unsigned size)
|
||||
offset);
|
||||
}
|
||||
|
||||
trace_xive_source_esb_read(addr, srcno, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1030,6 +1054,8 @@ static void xive_source_esb_write(void *opaque, hwaddr addr,
|
||||
uint32_t srcno = addr >> xsrc->esb_shift;
|
||||
bool notify = false;
|
||||
|
||||
trace_xive_source_esb_write(addr, srcno, value);
|
||||
|
||||
/* In a two pages ESB MMIO setting, trigger page only triggers */
|
||||
if (xive_source_is_trigger_page(xsrc, addr)) {
|
||||
notify = xive_source_esb_trigger(xsrc, srcno);
|
||||
@ -1507,6 +1533,7 @@ static bool xive_presenter_notify(XiveFabric *xfb, uint8_t format,
|
||||
|
||||
/* handle CPU exception delivery */
|
||||
if (count) {
|
||||
trace_xive_presenter_notify(nvt_blk, nvt_idx, match.ring);
|
||||
xive_tctx_ipb_update(match.tctx, match.ring, priority_to_ipb(priority));
|
||||
}
|
||||
|
||||
@ -1558,6 +1585,7 @@ static void xive_router_end_notify(XiveRouter *xrtr, uint8_t end_blk,
|
||||
}
|
||||
|
||||
if (!xive_end_is_valid(&end)) {
|
||||
trace_xive_router_end_notify(end_blk, end_idx, end_data);
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "XIVE: END %x/%x is invalid\n",
|
||||
end_blk, end_idx);
|
||||
return;
|
||||
@ -1683,6 +1711,10 @@ do_escalation:
|
||||
}
|
||||
}
|
||||
|
||||
trace_xive_router_end_escalate(end_blk, end_idx,
|
||||
(uint8_t) xive_get_field32(END_W4_ESC_END_BLOCK, end.w4),
|
||||
(uint32_t) xive_get_field32(END_W4_ESC_END_INDEX, end.w4),
|
||||
(uint32_t) xive_get_field32(END_W5_ESC_END_DATA, end.w5));
|
||||
/*
|
||||
* The END trigger becomes an Escalation trigger
|
||||
*/
|
||||
@ -1796,6 +1828,8 @@ static uint64_t xive_end_source_read(void *opaque, hwaddr addr, unsigned size)
|
||||
end_blk = xive_router_get_block_id(xsrc->xrtr);
|
||||
end_idx = addr >> (xsrc->esb_shift + 1);
|
||||
|
||||
trace_xive_end_source_read(end_blk, end_idx, addr);
|
||||
|
||||
if (xive_router_get_end(xsrc->xrtr, end_blk, end_idx, &end)) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "XIVE: No END %x/%x\n", end_blk,
|
||||
end_idx);
|
||||
|
Loading…
Reference in New Issue
Block a user