1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-30 00:00:11 +01:00

lib/ips/intc: change waitForInterrupt() interface

Return -1 on failure, change type to `int`. int/2 bits should still
be enough to track overflowed interrupts.
This commit is contained in:
daniel-k 2018-01-16 14:47:53 +01:00
parent 82204990cd
commit 80bc9af0e7
2 changed files with 14 additions and 7 deletions

View file

@ -56,7 +56,9 @@ public:
int disableInterrupt(IrqPort irq)
{ return disableInterrupt(1 << irq.num); }
uint64_t waitForInterrupt(int irq);
int waitForInterrupt(int irq);
int waitForInterrupt(IrqPort irq)
{ return waitForInterrupt(irq.num); }
private:
struct Interrupt {

View file

@ -124,7 +124,7 @@ InterruptController::disableInterrupt(InterruptController::IrqMaskType mask)
return true;
}
uint64_t InterruptController::waitForInterrupt(int irq)
int InterruptController::waitForInterrupt(int irq)
{
assert(irq < maxIrqs);
@ -134,21 +134,26 @@ uint64_t InterruptController::waitForInterrupt(int irq)
uint32_t isr, mask = 1 << irq;
do {
// poll status register
isr = XIntc_In32(base + XIN_ISR_OFFSET);
pthread_testcancel();
} while ((isr & mask) != mask);
// acknowledge interrupt
XIntc_Out32(base + XIN_IAR_OFFSET, mask);
// we can only tell that there has been (at least) one interrupt
return 1;
}
else {
uint64_t cnt;
ssize_t ret = read(efds[irq], &cnt, sizeof(cnt));
if (ret != sizeof(cnt))
return 0;
uint64_t count;
return cnt;
// block until there has been an interrupt, read number of interrupts
ssize_t ret = read(efds[irq], &count, sizeof(count));
if (ret != sizeof(count))
return -1;
return static_cast<int>(count);
}
}