[GOOD] BUILD 0.1.0.470 DATE 8/30/2011 AT 6:40 PM
==================================================== Mainly changed: HAL.VFS + Designed virtual file system + Completed the VFS + Added verbose mode for VFS + Updated shell script, now shows build number when building ? TODO: Implement one file system (most likely FAT12) ? TODO: Mount floppy device
This commit is contained in:
8
Kernel/hal/filesys/fat12.c
Normal file
8
Kernel/hal/filesys/fat12.c
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
* fat12.c
|
||||
*
|
||||
* Created on: Aug 29, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "keyboard/keyboard.h"
|
||||
#include "mouse/mouse.h"
|
||||
|
||||
#include <fileio.h>
|
||||
#include <debugio.h>
|
||||
|
||||
void HalInitialize()
|
||||
@ -32,4 +33,7 @@ void HalInitialize()
|
||||
|
||||
// Install mouse driver
|
||||
MouseInstall(); Log("%#[HAL] %#Installed mouse driver\n", ColorYellow, ColorLightGreen);
|
||||
|
||||
// Install VFS
|
||||
VfsInstall();
|
||||
}
|
||||
|
@ -8,13 +8,9 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <multiboot.h>
|
||||
#include <debugio.h>
|
||||
#include <memory.h>
|
||||
|
||||
#include <../drivers/cmos/cmos.h>
|
||||
|
||||
#include "keyboard/keyboard.h"
|
||||
|
||||
void SystemReboot()
|
||||
{
|
||||
Log("Rebooting system...\n");
|
208
Kernel/hal/vfs.c
208
Kernel/hal/vfs.c
@ -1,40 +1,208 @@
|
||||
#include<fileio.h>
|
||||
#include<storage.h>
|
||||
#include <memory.h>
|
||||
#include <stdlib.h>
|
||||
#include <fileio.h>
|
||||
#include <debugio.h>
|
||||
|
||||
#define MAX_FS_COUNT 64
|
||||
#define BAD 0xffffffff
|
||||
|
||||
uint32 FsRead(FsNode *node, uint32 offset, uint32 size, uint8 *buffer)
|
||||
FileSystem* fsArray;
|
||||
uint32 fsCount;
|
||||
|
||||
MountPoint* mpArray;
|
||||
uint32 mpCount;
|
||||
uint32 mpAllocated;
|
||||
|
||||
#define LogVfs(...) { Log("%#[Vfs] ", ColorLightBlue); Log(__VA_ARGS__); }
|
||||
#define ErrorVfs(...) { Error("%#[Vfs] ", ColorLightBlue); Error(__VA_ARGS__); }
|
||||
|
||||
void VfsInstall ()
|
||||
{
|
||||
if (node->Read != NULL) return node->Read(node, offset, size, buffer);
|
||||
return NULL;
|
||||
fsArray = (FileSystem*) kmalloc(MAX_FS_COUNT * sizeof(FileSystem));
|
||||
fsCount = 0;
|
||||
|
||||
mpArray = (MountPoint*) kmalloc(32 * sizeof(MountPoint));
|
||||
mpCount = 0;
|
||||
mpAllocated = 32;
|
||||
|
||||
LogVfs("%#VFS now in business.\n", ColorLightGreen);
|
||||
}
|
||||
|
||||
uint32 FsWrite(FsNode *node, uint32 offset, uint32 size, uint8 *buffer)
|
||||
uint8 VfsInstallFs (FileSystem* fs)
|
||||
{
|
||||
if (node->Write != NULL) return node->Write(node, offset, size, buffer);
|
||||
return NULL;
|
||||
if (fsCount >= MAX_FS_COUNT) {
|
||||
ErrorVfs("%#Failed to install file system '%s': FS count reached.\n", ColorLightRed, fs->Name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(&fsArray[fsCount], fs, sizeof(FileSystem));
|
||||
fsArray[fsCount].Id = fsCount;
|
||||
|
||||
++fsCount;
|
||||
LogVfs("Installed file system %#.\n", ColorWhite, fs->Name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void FsOpen(FsNode *node, uint8 read, uint8 write)
|
||||
uint32 VfsFindDevice (string dev)
|
||||
{
|
||||
if (node->Open != NULL) return node->Open(node, read, write);
|
||||
uint32 i;
|
||||
for (i = 0; i < mpCount; i++)
|
||||
if (strcmp(dev, mpArray[i].Name) == 0)
|
||||
return i;
|
||||
|
||||
return BAD;
|
||||
}
|
||||
|
||||
void FsClose(FsNode *node)
|
||||
|
||||
// Returns mount point index, removes dev name from path
|
||||
uint32 VfsParsePath (string* path)
|
||||
{
|
||||
if (node->Close != NULL) return node->Close();
|
||||
// Sanity check
|
||||
if (!path || !(*path)) return BAD;
|
||||
|
||||
string dev = *path, p = strchr(*path, ':');
|
||||
if (p == NULL) return BAD; // invalid path
|
||||
|
||||
// Split string
|
||||
*path = p+1; *p = '\0';
|
||||
|
||||
return VfsFindDevice(dev);
|
||||
}
|
||||
|
||||
DirectoryEntry *FsReadDir(FsNode *node, uint32 index)
|
||||
uint8 VfsMount (string Name, DevReadRoutine R, DevWriteRoutine W, uint32 BlockSize)
|
||||
{
|
||||
if (node->ReadDir != NULL && (node->Flags&7) == FsDirectory)
|
||||
return node->ReadDir(node, index);
|
||||
return NULL;
|
||||
uint32 i, fsId = BAD, mpIndex = BAD;
|
||||
|
||||
// Try to figure out the file system
|
||||
for (i = 0; i < fsCount && fsId == BAD; i++)
|
||||
if (fsArray->Detect && fsArray->Detect(R, BlockSize)) fsId = i;
|
||||
|
||||
if (fsId == BAD) {
|
||||
ErrorVfs("%#Failed to mount device %s: no file system found.\n", ColorLightRed, Name)
|
||||
return 0; // No file system, no good
|
||||
}
|
||||
|
||||
// Try to find an empty slot to fill
|
||||
for (i = 0; i < mpCount && mpIndex == BAD; i++)
|
||||
if (mpArray[i].Id == BAD) mpIndex = i;
|
||||
|
||||
// No empty slots?
|
||||
if (mpIndex == BAD)
|
||||
{
|
||||
// Make sure we have enough space
|
||||
if (mpCount == mpAllocated) {
|
||||
mpAllocated += 4;
|
||||
mpArray = kmrealloc(mpArray, mpAllocated * sizeof(MountPoint));
|
||||
}
|
||||
|
||||
mpIndex = mpCount++;
|
||||
}
|
||||
|
||||
// Add to mount point list, set up data
|
||||
mpArray[mpIndex].Id = mpIndex;
|
||||
mpArray[mpIndex].FsId = fsId;
|
||||
mpArray[mpIndex].BlockSize = BlockSize;
|
||||
mpArray[mpIndex].Read = R;
|
||||
mpArray[mpIndex].Write = W;
|
||||
|
||||
// Change name if it already exists
|
||||
uint32 find = VfsFindDevice(Name);
|
||||
if (find != BAD)
|
||||
{
|
||||
uint32 len = strlen(Name);
|
||||
uint8 success = 0;
|
||||
Name[len+1] = '\0';
|
||||
|
||||
// Try to find a number index
|
||||
for (find = '0'; find <= '9' && !success; find++)
|
||||
{
|
||||
Name[len] = find;
|
||||
if (VfsFindDevice(Name) == BAD) success = 1;
|
||||
}
|
||||
|
||||
// What? Haven't found anything yet? Try the alphabet
|
||||
for (find = 'a'; find <= 'z' && !success; find++)
|
||||
{
|
||||
Name[len] = find;
|
||||
if (VfsFindDevice(Name) == BAD) success = 1;
|
||||
}
|
||||
|
||||
// Still nothing? How in the world is this even possible ?!?!?!
|
||||
if (!success) return 0;
|
||||
}
|
||||
|
||||
memcpy(mpArray[mpCount].Name, Name, sizeof(char) * 128);
|
||||
|
||||
LogVfs("Mounted device %#%s", ColorWhite, Name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
FsNode *FsFindDir(FsNode *node, char *name)
|
||||
void VfsUnmount (uint32 dev_id)
|
||||
{
|
||||
if (node->FindDir != NULL && (node->Flags&7) == FsDirectory)
|
||||
return node->FindDir(node, name);
|
||||
return NULL;
|
||||
mpArray[dev_id].Id = BAD;
|
||||
mpCount--;
|
||||
}
|
||||
|
||||
// Returns pointer to FILE structure that was inputed if success, null otherwise
|
||||
FILE* VfsOpen (FILE* file, string path)
|
||||
{
|
||||
if (!file) return NULL;
|
||||
|
||||
// Parse string
|
||||
uint32 dev = VfsParsePath(&path);
|
||||
file->DeviceId = dev;
|
||||
|
||||
// Device not found, or Open routine doesn't exist
|
||||
if (dev == BAD || !fsArray[mpArray[dev].FsId].Open) return NULL;
|
||||
|
||||
// Ask the FS to do the 'opening'
|
||||
return fsArray[mpArray[dev].FsId].Open(&mpArray[dev],file,path);
|
||||
}
|
||||
|
||||
DirectoryEntry* VfsTest (string path)
|
||||
{
|
||||
// Parse string
|
||||
uint32 dev = VfsParsePath(&path);
|
||||
|
||||
// Device not found, or Open routine doesn't exist
|
||||
if (dev == BAD || !fsArray[mpArray[dev].FsId].Test) return NULL;
|
||||
|
||||
// Ask the FS to do the 'opening'
|
||||
return fsArray[mpArray[dev].FsId].Test(&mpArray[dev],path);
|
||||
}
|
||||
|
||||
FILE* VfsClose (FILE* file)
|
||||
{
|
||||
if (!file) return NULL;
|
||||
MountPoint* mp = &(mpArray[file->DeviceId]);
|
||||
|
||||
if (!fsArray[mp->FsId].Close) return NULL;
|
||||
return fsArray[mp->FsId].Close(mp,file);
|
||||
}
|
||||
|
||||
uint32 VfsRead (FILE* file, uint32 bsz, uint32 n, uint8* buffer)
|
||||
{
|
||||
if (!file) return NULL;
|
||||
MountPoint* mp = &(mpArray[file->DeviceId]);
|
||||
|
||||
if (!fsArray[mp->FsId].Read) return NULL;
|
||||
return fsArray[mp->FsId].Read(mp, file, bsz, n, buffer);
|
||||
}
|
||||
|
||||
uint32 VfsWrite (FILE* file, uint32 bsz, uint32 n, uint8* buffer)
|
||||
{
|
||||
if (!file) return NULL;
|
||||
MountPoint* mp = &(mpArray[file->DeviceId]);
|
||||
|
||||
if (!fsArray[mp->FsId].Write) return NULL;
|
||||
return fsArray[mp->FsId].Write(mp, file, bsz, n, buffer);
|
||||
}
|
||||
|
||||
DirectoryEntry* VfsReadDirectory (FILE* handle, uint32 index)
|
||||
{
|
||||
if (!handle) return NULL;
|
||||
MountPoint* mp = &(mpArray[handle->DeviceId]);
|
||||
|
||||
if (!fsArray[mp->FsId].ReadDirectory) return NULL;
|
||||
return fsArray[mp->FsId].ReadDirectory(mp, handle, index);
|
||||
}
|
||||
|
Reference in New Issue
Block a user