Code Review
/
kvmfornfv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
These changes are the raw update to qemu-2.6.
[kvmfornfv.git]
/
qemu
/
hw
/
intc
/
xics.c
diff --git
a/qemu/hw/intc/xics.c
b/qemu/hw/intc/xics.c
index
924b1ae
..
8659be0
100644
(file)
--- a/
qemu/hw/intc/xics.c
+++ b/
qemu/hw/intc/xics.c
@@
-25,6
+25,10
@@
*
*/
*
*/
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "qemu-common.h"
+#include "cpu.h"
#include "hw/hw.h"
#include "trace.h"
#include "qemu/timer.h"
#include "hw/hw.h"
#include "trace.h"
#include "qemu/timer.h"
@@
-88,24
+92,24
@@
static void xics_common_reset(DeviceState *d)
device_reset(DEVICE(icp->ics));
}
device_reset(DEVICE(icp->ics));
}
-static void xics_prop_get_nr_irqs(Object *obj, Visitor *v,
- void *opaque,
const char *name,
Error **errp)
+static void xics_prop_get_nr_irqs(Object *obj, Visitor *v,
const char *name,
+ void *opaque, Error **errp)
{
XICSState *icp = XICS_COMMON(obj);
int64_t value = icp->nr_irqs;
{
XICSState *icp = XICS_COMMON(obj);
int64_t value = icp->nr_irqs;
- visit_type_int(v,
&value, nam
e, errp);
+ visit_type_int(v,
name, &valu
e, errp);
}
}
-static void xics_prop_set_nr_irqs(Object *obj, Visitor *v,
- void *opaque,
const char *name,
Error **errp)
+static void xics_prop_set_nr_irqs(Object *obj, Visitor *v,
const char *name,
+ void *opaque, Error **errp)
{
XICSState *icp = XICS_COMMON(obj);
XICSStateClass *info = XICS_COMMON_GET_CLASS(icp);
Error *error = NULL;
int64_t value;
{
XICSState *icp = XICS_COMMON(obj);
XICSStateClass *info = XICS_COMMON_GET_CLASS(icp);
Error *error = NULL;
int64_t value;
- visit_type_int(v,
&value, nam
e, &error);
+ visit_type_int(v,
name, &valu
e, &error);
if (error) {
error_propagate(errp, error);
return;
if (error) {
error_propagate(errp, error);
return;
@@
-122,17
+126,17
@@
static void xics_prop_set_nr_irqs(Object *obj, Visitor *v,
}
static void xics_prop_get_nr_servers(Object *obj, Visitor *v,
}
static void xics_prop_get_nr_servers(Object *obj, Visitor *v,
-
void *opaque, const char *nam
e,
+
const char *name, void *opaqu
e,
Error **errp)
{
XICSState *icp = XICS_COMMON(obj);
int64_t value = icp->nr_servers;
Error **errp)
{
XICSState *icp = XICS_COMMON(obj);
int64_t value = icp->nr_servers;
- visit_type_int(v,
&value, nam
e, errp);
+ visit_type_int(v,
name, &valu
e, errp);
}
static void xics_prop_set_nr_servers(Object *obj, Visitor *v,
}
static void xics_prop_set_nr_servers(Object *obj, Visitor *v,
-
void *opaque, const char *nam
e,
+
const char *name, void *opaqu
e,
Error **errp)
{
XICSState *icp = XICS_COMMON(obj);
Error **errp)
{
XICSState *icp = XICS_COMMON(obj);
@@
-140,7
+144,7
@@
static void xics_prop_set_nr_servers(Object *obj, Visitor *v,
Error *error = NULL;
int64_t value;
Error *error = NULL;
int64_t value;
- visit_type_int(v,
&value, nam
e, &error);
+ visit_type_int(v,
name, &valu
e, &error);
if (error) {
error_propagate(errp, error);
return;
if (error) {
error_propagate(errp, error);
return;
@@
-711,7
+715,7
@@
static int ics_find_free_block(ICSState *ics, int num, int alignnum)
return -1;
}
return -1;
}
-int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
+int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi
, Error **errp
)
{
ICSState *ics = &icp->ics[src];
int irq;
{
ICSState *ics = &icp->ics[src];
int irq;
@@
-719,14
+723,14
@@
int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
if (irq_hint) {
assert(src == xics_find_source(icp, irq_hint));
if (!ICS_IRQ_FREE(ics, irq_hint - ics->offset)) {
if (irq_hint) {
assert(src == xics_find_source(icp, irq_hint));
if (!ICS_IRQ_FREE(ics, irq_hint - ics->offset)) {
-
trace_xics_alloc_failed_hint(src
, irq_hint);
+
error_setg(errp, "can't allocate IRQ %d: already in use"
, irq_hint);
return -1;
}
irq = irq_hint;
} else {
irq = ics_find_free_block(ics, 1, 1);
if (irq < 0) {
return -1;
}
irq = irq_hint;
} else {
irq = ics_find_free_block(ics, 1, 1);
if (irq < 0) {
-
trace_xics_alloc_failed_no_left(src
);
+
error_setg(errp, "can't allocate IRQ: no IRQ left"
);
return -1;
}
irq += ics->offset;
return -1;
}
irq += ics->offset;
@@
-739,10
+743,11
@@
int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
}
/*
}
/*
- * Allocate block of conse
qutive IRQs, returns a number of the first
.
+ * Allocate block of conse
cutive IRQs, and return the number of the first IRQ in the block
.
* If align==true, aligns the first IRQ number to num.
*/
* If align==true, aligns the first IRQ number to num.
*/
-int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align)
+int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align,
+ Error **errp)
{
int i, first = -1;
ICSState *ics = &icp->ics[src];
{
int i, first = -1;
ICSState *ics = &icp->ics[src];
@@
-762,6
+767,10
@@
int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align)
} else {
first = ics_find_free_block(ics, num, 1);
}
} else {
first = ics_find_free_block(ics, num, 1);
}
+ if (first < 0) {
+ error_setg(errp, "can't find a free %d-IRQ block", num);
+ return -1;
+ }
if (first >= 0) {
for (i = first; i < first + num; ++i) {
if (first >= 0) {
for (i = first; i < first + num; ++i) {
@@
-848,7
+857,7
@@
static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPRMachineState *spapr,
uint32_t xirr = icp_accept(ss);
args[0] = xirr;
uint32_t xirr = icp_accept(ss);
args[0] = xirr;
- args[1] = cpu_get_
real
_ticks();
+ args[1] = cpu_get_
host
_ticks();
return H_SUCCESS;
}
return H_SUCCESS;
}