Use a bool to check if an irq was acknowledged by the MFP, else we don't call the handler.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26725 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -44,7 +44,7 @@ public:
|
|||||||
|
|
||||||
virtual void EnableIOInterrupt(int irq) = 0;
|
virtual void EnableIOInterrupt(int irq) = 0;
|
||||||
virtual void DisableIOInterrupt(int irq) = 0;
|
virtual void DisableIOInterrupt(int irq) = 0;
|
||||||
virtual void AcknowledgeIOInterrupt(int irq) = 0;
|
virtual bool AcknowledgeIOInterrupt(int irq) = 0;
|
||||||
|
|
||||||
virtual void SetHardwareRTC(uint32 seconds) = 0;
|
virtual void SetHardwareRTC(uint32 seconds) = 0;
|
||||||
virtual uint32 GetHardwareRTC() = 0;
|
virtual uint32 GetHardwareRTC() = 0;
|
||||||
|
|||||||
@@ -272,9 +272,10 @@ dprintf("handling I/O interrupts done\n");
|
|||||||
default:
|
default:
|
||||||
// vectors >= 64 are user defined vectors, used for IRQ
|
// vectors >= 64 are user defined vectors, used for IRQ
|
||||||
if (vector >= 64) {
|
if (vector >= 64) {
|
||||||
M68KPlatform::Default()->AcknowledgeIOInterrupt(vector);
|
if (M68KPlatform::Default()->AcknowledgeIOInterrupt(vector)) {
|
||||||
ret = int_io_interrupt_handler(vector, true);
|
ret = int_io_interrupt_handler(vector, true);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dprintf("unhandled exception type 0x%x\n", vector);
|
dprintf("unhandled exception type 0x%x\n", vector);
|
||||||
print_iframe(iframe);
|
print_iframe(iframe);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public:
|
|||||||
|
|
||||||
void EnableIOInterrupt(int irq);
|
void EnableIOInterrupt(int irq);
|
||||||
void DisableIOInterrupt(int irq);
|
void DisableIOInterrupt(int irq);
|
||||||
void AcknowledgeIOInterrupt(int irq);
|
bool AcknowledgeIOInterrupt(int irq);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32 fBase;
|
uint32 fBase;
|
||||||
@@ -70,7 +70,7 @@ public:
|
|||||||
|
|
||||||
virtual void EnableIOInterrupt(int irq);
|
virtual void EnableIOInterrupt(int irq);
|
||||||
virtual void DisableIOInterrupt(int irq);
|
virtual void DisableIOInterrupt(int irq);
|
||||||
virtual void AcknowledgeIOInterrupt(int irq);
|
virtual bool AcknowledgeIOInterrupt(int irq);
|
||||||
|
|
||||||
virtual void SetHardwareRTC(uint32 seconds);
|
virtual void SetHardwareRTC(uint32 seconds);
|
||||||
virtual uint32 GetHardwareRTC();
|
virtual uint32 GetHardwareRTC();
|
||||||
@@ -148,7 +148,7 @@ M68KAtari::MFP::DisableIOInterrupt(int irq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
bool
|
||||||
M68KAtari::MFP::AcknowledgeIOInterrupt(int irq)
|
M68KAtari::MFP::AcknowledgeIOInterrupt(int irq)
|
||||||
{
|
{
|
||||||
uint8 bit = 1 << (irq % 8);
|
uint8 bit = 1 << (irq % 8);
|
||||||
@@ -158,7 +158,9 @@ M68KAtari::MFP::AcknowledgeIOInterrupt(int irq)
|
|||||||
if (val & bit) {
|
if (val & bit) {
|
||||||
val &= ~bit;
|
val &= ~bit;
|
||||||
outb(reg, val);
|
outb(reg, val);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -303,13 +305,14 @@ M68KAtari::DisableIOInterrupt(int irq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
bool
|
||||||
M68KAtari::AcknowledgeIOInterrupt(int irq)
|
M68KAtari::AcknowledgeIOInterrupt(int irq)
|
||||||
{
|
{
|
||||||
MFP *mfp = MFPForIrq(irq);
|
MFP *mfp = MFPForIrq(irq);
|
||||||
|
|
||||||
if (mfp)
|
if (mfp)
|
||||||
mfp->AcknowledgeIOInterrupt(irq - mfp->Vector());
|
return mfp->AcknowledgeIOInterrupt(irq - mfp->Vector());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user