////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: IdeDiskContract.cs
//
// Defines Message contracts for communications over channels with the Disk Device Driver
using System;
using System.Runtime.Remoting;
using System.Runtime.InteropServices;
using Microsoft.SingSharp;
using Microsoft.Singularity;
using Microsoft.Singularity.Channels;
using Microsoft.Singularity.Directory;
using Microsoft.Singularity.Io;
namespace Microsoft.Singularity.Io
{
public enum DiskAttributes : uint {
ReadOnly = 0x01,
Removable = 0x02,
}
public contract DiskDeviceContract : DeviceContract
{
///
/// Retrieve the device name.
///
in message GetDeviceName();
out message AckGetDeviceName(char* opt(ExHeap[])data);
///
/// Retrieve sector offset of first sector on disk or partition.
///
in message GetStartSector();
out message AckGetStartSector(ulong startSector);
///
/// Retrieve number of sectors available on drive or partition.
///
in message GetSectorCount();
out message AckGetSectorCount(ulong sectorCount);
///
/// Query for system identifier from partition table for
/// partition. This method is only applicable to partitioned
/// drives.
///
in message GetSystemId();
out message SystemId(byte systemId);
out message NoSystemId();
in message GetDiskAttributes();
out message AckGetDiskAttributes(DiskAttributes flags);
///
/// Read data from disk.
/// Relative sector on disk or partition to read data from.
///
in message Read(byte []! in ExHeap data,
ulong offset,
ulong length,
ulong sectorId);
out message AckRead(byte []! in ExHeap data);
out message NakRead();
///
/// Write data to disk.
/// Relative sector on disk or partition to write data to.
///
in message Write(byte []! in ExHeap data,
ulong offset,
ulong length,
ulong sectorId);
out message AckWrite(byte []! in ExHeap data);
out message NakWrite();
in message NoOp();
out message AckNoOp();
in message ReadPerf(int numMB, int chunkSize);
out message AckReadPerf(long cycles, long ticks);
out message Success();
override state Start: one {
Success! -> Ready;
}
state Ready: one
{
GetDeviceName? -> DoGetDeviceName;
GetDiskAttributes? -> DoGetDiskAttributes;
GetStartSector? -> DoGetStartSector;
GetSectorCount? -> DoGetSectorCount;
GetSystemId? -> DoGetSystemId;
Read? -> DoRead;
Write? -> DoWrite;
NoOp? -> DoNoOp;
ReadPerf? -> DoReadPerf;
}
state DoGetDeviceName: one
{
AckGetDeviceName! -> Ready;
}
state DoGetDiskAttributes: one
{
AckGetDiskAttributes! -> Ready;
}
state DoGetStartSector: one
{
AckGetStartSector! -> Ready;
}
state DoGetSectorCount: one
{
AckGetSectorCount! -> Ready;
}
state DoGetSystemId: one
{
SystemId! -> Ready;
NoSystemId! -> Ready;
}
state DoRead: one
{
AckRead! -> Ready;
NakRead! -> Ready;
}
state DoReadPerf: one
{
AckReadPerf! -> Ready;
}
state DoWrite: one
{
AckWrite! -> Ready;
NakWrite! -> Ready;
}
state DoNoOp: one
{
AckNoOp! -> Ready;
}
}
}