Cosmos/source2/Kernel/System/Hardware/Cosmos.Hardware/BlockDevice/BlockDevice.cs
kudzu_cp 95393c0c6e
2011-03-03 05:23:44 +00:00

57 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Cosmos.Hardware.BlockDevice {
// This class should not support selecting a device or sub device.
// Each instance must control exactly one device. For example with ATA
// master/slave, each one needs its own device instance. For ATA
// this complicates things a bit because they share IO ports, but this
// is an intentional decision.
public abstract class BlockDevice : Device {
// TODO: Need to protect this from changes except by Hardware ring
static public List<BlockDevice> Devices = new List<BlockDevice>();
public byte[] NewBlockArray(UInt32 aBlockCount) {
return new byte[aBlockCount * mBlockSize];
}
//TODO:UInt64
protected UInt32 mBlockCount = 0;
public UInt32 BlockCount {
get { return mBlockCount; }
}
//TODO:UInt64
protected UInt32 mBlockSize = 0;
public UInt32 BlockSize {
get { return mBlockSize; }
}
//TODO:UInt64
// Only allow reading and writing whole blocks becuase many of the hardware
// command work that way and we dont want to add complexity at the BlockDevice level.
public abstract void ReadBlock(UInt32 aBlockNo, UInt32 aBlockCount, byte[] aData);
//TODO:UInt64
public abstract void WriteBlock(UInt32 aBlockNo, UInt32 aBlockCount, byte[] aData);
protected void CheckDataSize(byte[] aData, UInt32 aBlockCount) {
var xBlockSize = mBlockSize;
var xDataLength = aData.Length;
var xDataSize = aBlockCount * mBlockSize;
if (aData.Length != aBlockCount * mBlockSize) {
throw new Exception("Invalid data size.");
}
}
//TODO:UInt64
protected void CheckBlockNo(UInt32 aBlockNo, UInt32 aBlockCount) {
if (aBlockNo + aBlockCount >= mBlockCount) {
throw new Exception("Invalid block number.");
}
}
}
}