singrdk/base/Kernel/Singularity/V1/Services/PciPortHandle.cs

157 lines
4.4 KiB
C#
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity - Singularity ABI
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: PciPortHandle.cs
//
// Note:
//
using System;
using System.Runtime.CompilerServices;
using Microsoft.Singularity;
using Microsoft.Singularity.Io;
using Microsoft.Singularity.Memory;
using System.Threading;
namespace Microsoft.Singularity.V1.Services
{
[CLSCompliant(false)]
public struct PciPortHandle
{
// Internal methods
UIntPtr id;
internal PciPortHandle(UIntPtr id)
{
this.id = id;
}
///////////////////////////////////////////////////////////////////////
//
// ABI Exposed
//
[ExternalEntryPoint]
public static unsafe bool CreateImpl(PciPortHandle* handle)
{
return Create(out *handle);
}
public static bool Create(out PciPortHandle handle)
{
IoConfig config = Thread.CurrentProcess.IoConfig;
PciConfig pciConfig = config as PciConfig;
if (pciConfig != null) {
handle = new PciPortHandle(
Thread.CurrentProcess.AllocateHandle(pciConfig.PciPort)
);
return true;
}
else {
handle = new PciPortHandle();
return false;
}
}
[ExternalEntryPoint]
public static bool Dispose(PciPortHandle handle)
{
if (handle.id != UIntPtr.Zero) {
Thread.CurrentProcess.ReleaseHandle(handle.id);
}
return false;
}
[ExternalEntryPoint]
public static unsafe
bool Read8Impl(PciPortHandle handle, int offset, byte* value)
{
if (handle.id != UIntPtr.Zero) {
PciPort p = HandleTable.GetHandle(handle.id) as PciPort;
*value = p.Read8(offset);
return true;
}
else {
*value = 0;
return false;
}
}
[ExternalEntryPoint]
public static unsafe
bool Read16Impl(PciPortHandle handle, int offset, ushort* value)
{
if (handle.id != UIntPtr.Zero) {
PciPort p = HandleTable.GetHandle(handle.id) as PciPort;
*value = p.Read16(offset);
return true;
}
else {
*value = 0;
return false;
}
}
[ExternalEntryPoint]
public static unsafe
bool Read32Impl(PciPortHandle handle, int offset, uint* value)
{
if (handle.id != UIntPtr.Zero) {
PciPort p = HandleTable.GetHandle(handle.id) as PciPort;
*value = p.Read32(offset);
return true;
}
else {
*value = 0;
return false;
}
}
[ExternalEntryPoint]
public static
bool Write8(PciPortHandle handle, int offset, byte value)
{
if (handle.id != UIntPtr.Zero) {
PciPort p = HandleTable.GetHandle(handle.id) as PciPort;
p.Write8(offset, value);
return true;
}
else {
return false;
}
}
[ExternalEntryPoint]
public static
bool Write16(PciPortHandle handle, int offset, ushort value)
{
if (handle.id != UIntPtr.Zero) {
PciPort p = HandleTable.GetHandle(handle.id) as PciPort;
p.Write16(offset, value);
return true;
}
else {
return false;
}
}
[ExternalEntryPoint]
public static
bool Write32(PciPortHandle handle, int offset, uint value)
{
if (handle.id != UIntPtr.Zero) {
PciPort p = HandleTable.GetHandle(handle.id) as PciPort;
p.Write32(offset, value);
return true;
}
else {
return false;
}
}
}
}