summaryrefslogtreecommitdiff
path: root/Kernel/Devices/DiskDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/Devices/DiskDevice.cpp')
-rw-r--r--Kernel/Devices/DiskDevice.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/Kernel/Devices/DiskDevice.cpp b/Kernel/Devices/DiskDevice.cpp
new file mode 100644
index 0000000000..3c2b210641
--- /dev/null
+++ b/Kernel/Devices/DiskDevice.cpp
@@ -0,0 +1,42 @@
+#include <Kernel/Devices/DiskDevice.h>
+
+DiskDevice::DiskDevice()
+{
+}
+
+DiskDevice::~DiskDevice()
+{
+}
+
+bool DiskDevice::read(DiskOffset offset, unsigned length, byte* out) const
+{
+ ASSERT((offset % block_size()) == 0);
+ ASSERT((length % block_size()) == 0);
+ dword first_block = offset / block_size();
+ dword end_block = (offset + length) / block_size();
+ byte* outptr = out;
+ for (unsigned bi = first_block; bi < end_block; ++bi) {
+ if (!read_block(bi, outptr))
+ return false;
+ outptr += block_size();
+ }
+ return true;
+}
+
+bool DiskDevice::write(DiskOffset offset, unsigned length, const byte* in)
+{
+ ASSERT((offset % block_size()) == 0);
+ ASSERT((length % block_size()) == 0);
+ dword first_block = offset / block_size();
+ dword end_block = (offset + length) / block_size();
+ ASSERT(first_block <= 0xffffffff);
+ ASSERT(end_block <= 0xffffffff);
+ const byte* inptr = in;
+ for (unsigned bi = first_block; bi < end_block; ++bi) {
+ if (!write_block(bi, inptr))
+ return false;
+ inptr += block_size();
+ }
+ return true;
+}
+