diff options
author | Alexis211 <alexis211@gmail.com> | 2009-09-06 18:05:31 +0200 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-09-06 18:05:31 +0200 |
commit | d95452c5452b4ca7418505fa5597f000596fcb78 (patch) | |
tree | 3f8ce8a72620648a03cf882332ed3d10cf96bc2b /Source | |
parent | 6e83d6c7b9fc36f7e7826451899c564a34a2c761 (diff) | |
download | Melon-d95452c5452b4ca7418505fa5597f000596fcb78.tar.gz Melon-d95452c5452b4ca7418505fa5597f000596fcb78.zip |
Added read() and write() functions to Partition::
These functions make it possible to read or write bytes on a partition
without worrying of sectors.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/Kernel/Core/common.wtf.h | 10 | ||||
-rw-r--r-- | Source/Kernel/Core/cppsupport.wtf.cpp | 37 | ||||
-rw-r--r-- | Source/Kernel/Core/kmain.wtf.cpp | 10 | ||||
-rw-r--r-- | Source/Kernel/Core/types.wtf.h | 19 | ||||
-rw-r--r-- | Source/Kernel/Makefile | 2 | ||||
-rwxr-xr-x | Source/Kernel/Melon.ke | bin | 111884 -> 112107 bytes | |||
-rw-r--r-- | Source/Kernel/VFS/Partition.class.cpp | 41 | ||||
-rw-r--r-- | Source/Kernel/VFS/Partition.class.h | 4 |
8 files changed, 107 insertions, 16 deletions
diff --git a/Source/Kernel/Core/common.wtf.h b/Source/Kernel/Core/common.wtf.h index d3e5abe..ac541d6 100644 --- a/Source/Kernel/Core/common.wtf.h +++ b/Source/Kernel/Core/common.wtf.h @@ -7,15 +7,7 @@ #define NULL 0 -typedef unsigned int addr_t; -typedef unsigned long long u64int; -typedef unsigned int u32int; -typedef unsigned short u16int; -typedef unsigned char u8int; -typedef long long s64int; -typedef int s32int; -typedef short s16int; -typedef char s8int; +#include <Core/types.wtf.h> #include <Core/CMem.ns.h> #include <Core/Sys.ns.h> diff --git a/Source/Kernel/Core/cppsupport.wtf.cpp b/Source/Kernel/Core/cppsupport.wtf.cpp index d495dff..16cd122 100644 --- a/Source/Kernel/Core/cppsupport.wtf.cpp +++ b/Source/Kernel/Core/cppsupport.wtf.cpp @@ -1,6 +1,43 @@ //This file just contains a few methods required for some C++ things to work +#include <Core/types.wtf.h> extern "C" void __cxa_pure_virtual() {} //Required when using abstract classes void *__dso_handle; //Required when using global objects extern "C" int __cxa_atexit(void (*f)(void*), void *p, void *d) { return 0; } + +//Functions for quad divisions/modulo. Taken and arranged from klibc include/asm/div64.h +//These only work with 32-bit divisors and only return 32-bit remainder. +//TODO : think of some correct quad div/mod algorithms +extern "C" { +inline u64int doDiv(u64int dividend, u32int divisor, u32int *remainder) { + union { + u64int v64; + u32int v32[2]; + } d = { dividend }; + u32int upper; + + upper = d.v32[1]; + d.v32[1] = 0; + if (upper >= divisor) { + d.v32[1] = upper / divisor; + upper %= divisor; + } + asm ("divl %2" : "=a" (d.v32[0]), "=d" (*remainder) : + "rm" (divisor), "0" (d.v32[0]), "1" (upper)); + return d.v64; +} + +u64int __udivdi3(u64int dividend, u64int b) { + u32int divisor, remainder; + divisor = b; + return doDiv(dividend, divisor, &remainder); +} + +u64int __umoddi3(u64int dividend, u64int b) { + u32int divisor, remainder; + divisor = b; + doDiv(dividend, divisor, &remainder); + return remainder; +} +} diff --git a/Source/Kernel/Core/kmain.wtf.cpp b/Source/Kernel/Core/kmain.wtf.cpp index a657cac..cac2da9 100644 --- a/Source/Kernel/Core/kmain.wtf.cpp +++ b/Source/Kernel/Core/kmain.wtf.cpp @@ -88,8 +88,7 @@ void kmain(multiboot_info_t* mbd, u32int magic) { PROCESSING(kvt, "Creating heap..."); Mem::createHeap(); OK(kvt); - INFO(kvt); *kvt << "Free frames : " << (s32int)PhysMem::free() << "/" << - (s32int)PhysMem::total() << "\n"; + INFO(kvt); *kvt << "Free frames : " << (s32int)PhysMem::free() << "/" << (s32int)PhysMem::total() << "\n"; PROCESSING(kvt, "Registering vgaout..."); Dev::registerDevice(vgaout); OK(kvt); @@ -145,14 +144,14 @@ void kmain(multiboot_info_t* mbd, u32int magic) { } else if (tmp == "uptime") { *kvt << " - Uptime : " << (s32int)(Time::uptime()) << "s.\n"; } else if (tmp == "part") { - *kvt << " * Dev ID\tClass Name\n"; + *kvt << " * ID\tClass Name\n"; for (u32int i = 0; i < Part::devices.size(); i++) { - *kvt << " - " << (s32int)i << "\t\t"; + *kvt << " - " << (s32int)i << "\t"; if (Part::devices[i] == 0) { *kvt << "[none]\n"; } else { *kvt << Part::devices[i]->getClass(); - kvt->setCursorCol(41); + kvt->setCursorCol(33); *kvt << Part::devices[i]->getName() << "\n"; for (u32int j = 0; j < Part::partitions.size(); j++) { if (Part::partitions[j]->getDevice() == Part::devices[i]) { @@ -162,7 +161,6 @@ void kmain(multiboot_info_t* mbd, u32int magic) { } } } - *kvt << "\n"; } } else if (!tmp.empty()) { *kvt << " - Unrecognized command: " << tmp << "\n"; diff --git a/Source/Kernel/Core/types.wtf.h b/Source/Kernel/Core/types.wtf.h new file mode 100644 index 0000000..ca6f73d --- /dev/null +++ b/Source/Kernel/Core/types.wtf.h @@ -0,0 +1,19 @@ +#ifndef DEF_TYPES_WTF_H +#define DEF_TYPES_WTF_H + +//This file defines base types. It's made to be used also by C programs + +typedef unsigned int addr_t; +typedef unsigned long long u64int; +typedef unsigned int u32int; +typedef unsigned short u16int; +typedef unsigned char u8int; +typedef long long s64int; +typedef int s32int; +typedef short s16int; +typedef char s8int; + +#define U64 unsigned long long +#define S64 long long + +#endif diff --git a/Source/Kernel/Makefile b/Source/Kernel/Makefile index c0bb18b..87f1594 100644 --- a/Source/Kernel/Makefile +++ b/Source/Kernel/Makefile @@ -4,7 +4,7 @@ CC = gcc CXX = g++ LD = ld LDFLAGS = -T Link.ld -Map Map.txt --oformat=elf32-i386 -CFLAGS = -nostdlib -nostartfiles -nodefaultlibs -fno-builtin -fno-stack-protector -Wall -Wextra -Werror +CFLAGS = -nostdlib -nostartfiles -nodefaultlibs -fno-builtin -fno-stack-protector -Wall -Wextra -Werror -I . CXXFLAGS = -nostartfiles -nostdlib -fno-exceptions -fno-rtti -I . -Wall -Werror -Wno-write-strings -funsigned-char ASM = nasm ASMFLAGS = -f elf diff --git a/Source/Kernel/Melon.ke b/Source/Kernel/Melon.ke Binary files differindex a244f2c..c643803 100755 --- a/Source/Kernel/Melon.ke +++ b/Source/Kernel/Melon.ke diff --git a/Source/Kernel/VFS/Partition.class.cpp b/Source/Kernel/VFS/Partition.class.cpp index 0c7832b..1032dee 100644 --- a/Source/Kernel/VFS/Partition.class.cpp +++ b/Source/Kernel/VFS/Partition.class.cpp @@ -17,6 +17,47 @@ bool Partition::writeBlocks(u64int startblock, u32int count, u8int *data) { return m_device->writeBlocks(startblock - m_startblock, count, data); } +bool Partition::read(u64int start, u32int length, u8int *data) { + u32int blksz = m_device->blockSize(); + u64int startBlock = start / blksz; + u32int offset = start % blksz; + u32int blocks = (length + offset) / blksz; + if ((length + offset) % blksz != 0) blocks++; + + u8int* buff = new u8int [blocks * blksz]; //THIS MAY FAIL :D + if (buff == 0) return false; + + if (!readBlocks(startBlock, blocks, buff)) return false; + memcpy(data, buff + offset, length); + + delete [] buff; + return true; +} + +bool Partition::write(u64int start, u32int length, u8int *data) { + u32int blksz = m_device->blockSize(); + u64int startBlock = start / blksz; + u32int offset = start % blksz; + u32int blocks = (length + offset) / blksz; + if ((length + offset) % blksz != 0) blocks++; + u64int lastBlock = startBlock + (u64int)blocks - 1; + + u8int* buff = new u8int [blocks * blksz]; + if (buff == 0) return false; + + if (offset != 0) { + if (!readBlocks(startBlock, 1, buff)) return false; + } + if (lastBlock != startBlock and (length + offset) % blksz != 0) { + if (!readBlocks(lastBlock, 1, buff + ((blocks - 1) * blksize))) return false; + } + memcpy(buff + offset, data, length); + if (!writeBlocks(startBlock, blocks, buff)) return false; + + delete[] buff; + return true; +} + //Accessors BlockDevice* Partition::getDevice() { return m_device; } u64int Partition::getStartBlock() { return m_startblock; } diff --git a/Source/Kernel/VFS/Partition.class.h b/Source/Kernel/VFS/Partition.class.h index e9087bf..8df1c4f 100644 --- a/Source/Kernel/VFS/Partition.class.h +++ b/Source/Kernel/VFS/Partition.class.h @@ -15,6 +15,10 @@ class Partition { bool readBlocks(u64int startblock, u32int count, u8int *data); bool writeBlocks(u64int startblock, u32int count, u8int *data); + //These two just use the readBlocks && writeBlocks defined above + bool read(u64int start, u32int length, u8int *data); + bool write(u64int start, u32int length, u8int *data); + //Accessors : BlockDevice* getDevice(); u64int getStartBlock(); |