157 lines
4.4 KiB
C#
157 lines
4.4 KiB
C#
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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;
|
|
}
|
|
}
|
|
}
|
|
}
|