88 lines
2.0 KiB
C#
88 lines
2.0 KiB
C#
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: IoIrq.cs - Process Code
|
|
//
|
|
|
|
using System;
|
|
using System.Threading;
|
|
|
|
using Microsoft.Singularity.V1.Threads;
|
|
|
|
namespace Microsoft.Singularity.Io
|
|
{
|
|
[CLSCompliant(false)]
|
|
public sealed class IoIrq : IoRange
|
|
{
|
|
private readonly byte irq;
|
|
private InterruptHandle handle;
|
|
|
|
internal IoIrq(byte irq)
|
|
{
|
|
this.irq = irq;
|
|
}
|
|
|
|
~IoIrq()
|
|
{
|
|
if (handle.id != UIntPtr.Zero)
|
|
{
|
|
ReleaseInterrupt();
|
|
}
|
|
}
|
|
|
|
public byte Irq
|
|
{
|
|
get { return irq; }
|
|
}
|
|
|
|
public bool RegisterInterrupt()
|
|
{
|
|
InterruptHandle handleOnStack;
|
|
bool success = InterruptHandle.Create(irq, out handleOnStack);
|
|
handle = handleOnStack;
|
|
return success;
|
|
}
|
|
|
|
public bool ReleaseInterrupt()
|
|
{
|
|
bool ret = InterruptHandle.Dispose(handle);
|
|
handle = new InterruptHandle();
|
|
return ret;
|
|
}
|
|
|
|
public bool WaitForInterrupt()
|
|
{
|
|
if (handle.id != UIntPtr.Zero)
|
|
{
|
|
return InterruptHandle.Wait(handle);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void Pulse()
|
|
{
|
|
if (handle.id != UIntPtr.Zero)
|
|
{
|
|
InterruptHandle.Pulse(handle);
|
|
}
|
|
}
|
|
|
|
public bool AckInterrupt()
|
|
{
|
|
if (handle.id != UIntPtr.Zero)
|
|
{
|
|
return InterruptHandle.Ack(handle);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return String.Format("IRQ:{0,2:x2}", irq);
|
|
}
|
|
}
|
|
}
|