[GOOD] BUILD 0.1.0.551 DATE 9/03/2011 AT 9:25 AM
==================================================== Mainly changed: HAL.FSs + Updated 'mount' call in floppy driver, now done after controller is initialized + Added 'detect' function for FAT file systems + Implemented 'initdr' driver, however still bugged + Improved logger
This commit is contained in:
80
Kernel/hal/filesys/fat/fat.c
Normal file
80
Kernel/hal/filesys/fat/fat.c
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* fat.c
|
||||
*
|
||||
* Created on: Aug 31, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
|
||||
#include <fileio.h>
|
||||
#include <debugio.h>
|
||||
#include "fat.h"
|
||||
|
||||
// Buffer should contain boot sector
|
||||
uint32 FatDetect (void* buffer)
|
||||
{
|
||||
FatBootSector* boot = (FatBootSector*)buffer;
|
||||
uint32 correct_features = 0;
|
||||
uint32 total_features = 0;
|
||||
|
||||
// Try the asm 'jmp' instruction
|
||||
if ((boot->bpb.AsmJmp[0] == 0x6B || boot->bpb.AsmJmp[0]==0xEB) && boot->bpb.AsmJmp[2] == 0x90)
|
||||
correct_features++;
|
||||
total_features ++;
|
||||
|
||||
// Try the OemId. First char is often 'm' or 'M' (mkdosfs or MSDOS??/MSWIN??)
|
||||
if (boot->bpb.OemId[0] == 'm' || boot->bpb.OemId[0] == 'M') correct_features++;
|
||||
total_features ++;
|
||||
|
||||
// Try the bytes per sector. Most often, it is 512.
|
||||
if (boot->bpb.BytesPerSector == 512) correct_features++;
|
||||
total_features ++;
|
||||
|
||||
// Try the sectors per cluster. This is always a power of 2.
|
||||
uint8 sectclust = boot->bpb.SectorsPerCluster;
|
||||
uint8 count = 0;
|
||||
while (sectclust) { count += sectclust&1; sectclust>>=1; }
|
||||
if (count != 1) return 0;
|
||||
|
||||
// Number of fats, can be 2 or (rarely) 1. Important feature.
|
||||
if (boot->bpb.FatsCount == 1 || boot->bpb.FatsCount == 2) correct_features+=2;
|
||||
total_features+=2;
|
||||
|
||||
// This tells us what type of disk this is. Usually values are above 0xf0.
|
||||
if (boot->bpb.MediaDescriptorType >= 0xF0) correct_features++;
|
||||
total_features++;
|
||||
|
||||
// Calculate number of clusters
|
||||
uint32 clusters = (boot->bpb.TotalSectors * boot->bpb.SectorsPerCluster);
|
||||
if (clusters == 0) clusters = (boot->bpb.TotalSectorsLarge * boot->bpb.SectorsPerCluster);
|
||||
// Calculate fat type
|
||||
uint32 fat = (clusters < 4085) ? 12 : 16 ;
|
||||
if (clusters > 65524) fat = 32;
|
||||
|
||||
|
||||
// Try the extended info
|
||||
if (fat == 32) {
|
||||
if (boot->ext.fat32.Signature == 0x28 || boot->ext.fat32.Signature == 0x29) correct_features++;
|
||||
total_features++;
|
||||
}
|
||||
|
||||
else {
|
||||
if (boot->ext.fat16.Signature == 0x28 || boot->ext.fat16.Signature == 0x29) correct_features++;
|
||||
total_features++;
|
||||
}
|
||||
|
||||
Log("Fat", "Correct features: %u out of %u. Type should be fat%u.\n", correct_features, total_features, fat);
|
||||
// See what we have.
|
||||
if (correct_features > (total_features/2)) return 0; // insuficcient correct features?
|
||||
|
||||
return fat; // return FAT type
|
||||
}
|
||||
|
||||
|
||||
void FatInstall()
|
||||
{
|
||||
FileSystem fat12 = {0, "fat12", Fat12Detect, 0,0,0,0,0,0,0,0};
|
||||
FileSystem fat16 = {0, "fat16", Fat16Detect, 0,0,0,0,0,0,0,0};
|
||||
FileSystem fat32 = {0, "fat32", Fat32Detect, 0,0,0,0,0,0,0,0};
|
||||
|
||||
VfsInstallFs(&fat12); VfsInstallFs(&fat16); VfsInstallFs(&fat32);
|
||||
}
|
135
Kernel/hal/filesys/fat/fat.h
Normal file
135
Kernel/hal/filesys/fat/fat.h
Normal file
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* fat.h
|
||||
*
|
||||
* Created on: Aug 31, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
|
||||
#ifndef FAT_H_
|
||||
#define FAT_H_
|
||||
|
||||
#include <fileio.h>
|
||||
|
||||
/*******************************************************
|
||||
* FAT: Bios Parameter Block *
|
||||
*******************************************************/
|
||||
typedef struct {
|
||||
uint8 AsmJmp[3];
|
||||
char OemId[8];
|
||||
uint16 BytesPerSector;
|
||||
uint8 SectorsPerCluster;
|
||||
uint16 ReservedSectors;
|
||||
uint8 FatsCount;
|
||||
uint16 DirectoryEntriesCount;
|
||||
uint16 TotalSectors;
|
||||
uint8 MediaDescriptorType;
|
||||
uint32 SectorsPerFat;
|
||||
uint16 SectorsPerTrack;
|
||||
uint16 Heads;
|
||||
uint32 HiddenSectors;
|
||||
uint32 TotalSectorsLarge;
|
||||
} __attribute__((packed)) FatBiosParameterBlock ;
|
||||
|
||||
/*******************************************************
|
||||
* FAT12/FAT16: Extended boot record *
|
||||
*******************************************************/
|
||||
typedef struct {
|
||||
uint8 DriveNumber; // Useless
|
||||
uint8 NtFlags;
|
||||
uint8 Signature; // Must be 0x28/0x29
|
||||
uint32 VolumeIdSerial;
|
||||
char VolumeLabel[11];
|
||||
char SystemId[8];
|
||||
} __attribute__((packed)) Fat16ExtendedBootRecord; // fat12 or 16
|
||||
|
||||
/*******************************************************
|
||||
* FAT32: Extended boot record *
|
||||
*******************************************************/
|
||||
typedef struct {
|
||||
uint32 SectorsPerFat;
|
||||
uint16 Flags;
|
||||
uint16 FatVersion; // High byte=major version, low=minor
|
||||
uint32 RootDirectoryCluster;
|
||||
uint16 FsInfoCluster;
|
||||
uint16 BackupBootSectorCluster;
|
||||
uint8 Reserved[12]; // Should be set to 0 when formatting
|
||||
uint8 DriveNumber;
|
||||
uint8 NtFlags;
|
||||
uint8 Signature; // Must be 0x28/0x29
|
||||
uint32 VolumeIdSerial;
|
||||
char VolumeLabel[11];
|
||||
char SystemId[8]; // Always "FAT32 "
|
||||
} __attribute__((packed)) Fat32ExtendedBootRecord;
|
||||
|
||||
/*******************************************************
|
||||
* FAT: Extended boot record (union of above 2 fields) *
|
||||
*******************************************************/
|
||||
union FatExtendedBootRecord
|
||||
{
|
||||
Fat16ExtendedBootRecord fat16;
|
||||
Fat32ExtendedBootRecord fat32;
|
||||
};
|
||||
|
||||
/*******************************************************
|
||||
* FAT: Complete boot sector info *
|
||||
*******************************************************/
|
||||
typedef struct {
|
||||
FatBiosParameterBlock bpb;
|
||||
union FatExtendedBootRecord ext;
|
||||
} __attribute__((packed)) FatBootSector;
|
||||
|
||||
|
||||
/*******************************************************
|
||||
* FAT: Directory entry *
|
||||
*******************************************************/
|
||||
typedef struct {
|
||||
char FileName[8];
|
||||
char FileExt[3];
|
||||
uint8 Attributes;
|
||||
uint8 _reserved;
|
||||
uint8 CreateTimeFine; // hundreds (0.01) of a second, up to 199
|
||||
uint16 CreateTime; // 15-11 hour; 10-5 mins; 4-0 secs/2;
|
||||
uint16 CreateDate; // 15-9 year (since 1980); 8-5 mon; 4-0 day
|
||||
uint16 AccessDate;
|
||||
|
||||
uint16 FirstClusterHigh; // Fat32; EA-index in fat12,fat16
|
||||
|
||||
uint16 LastModifiedTime;
|
||||
uint16 LastModifiedDate;
|
||||
|
||||
uint16 FirstClusterLow;
|
||||
uint32 Size;
|
||||
} __attribute__((packed)) FatDirectoryEntry;
|
||||
|
||||
|
||||
/*******************************************************
|
||||
* FAT: Long file name entry *
|
||||
*******************************************************/
|
||||
typedef struct {
|
||||
uint8 SequenceNo;
|
||||
uint16 Name1[5]; // Encoded in UTF-16
|
||||
uint8 Attributes; // Should be 0xF;
|
||||
uint8 _reserved;
|
||||
uint16 Name2[6];
|
||||
uint16 FirstCluster;// Should be 0x0000
|
||||
uint16 Name3[2];
|
||||
} FatLongFileName;
|
||||
|
||||
|
||||
/*******************************************************
|
||||
* FAT: Directory entry (union of above 2 fields) *
|
||||
*******************************************************/
|
||||
union FatDirEntryUnion {
|
||||
FatDirectoryEntry d;
|
||||
FatLongFileName lfn;
|
||||
};
|
||||
|
||||
|
||||
extern uint32 FatDetect (void* buffer);
|
||||
extern void FatInstall();
|
||||
|
||||
extern uint32 Fat12Detect (DevReadRoutine r, uint32 blocksz);
|
||||
extern uint32 Fat16Detect (DevReadRoutine r, uint32 blocksz);
|
||||
extern uint32 Fat32Detect (DevReadRoutine r, uint32 blocksz);
|
||||
|
||||
#endif /* FAT_H_ */
|
25
Kernel/hal/filesys/fat/fat12.c
Normal file
25
Kernel/hal/filesys/fat/fat12.c
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* fat12.c
|
||||
*
|
||||
* Created on: Aug 29, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
#include <fileio.h>
|
||||
#include <memory.h>
|
||||
#include "fat.h"
|
||||
|
||||
uint32 Fat12Detect (DevReadRoutine r, uint32 blocksz)
|
||||
{
|
||||
if (!r) return 0;
|
||||
|
||||
// Allocate buffer and call read routine
|
||||
void* buffer = kmalloc(blocksz);
|
||||
if (!(*r)(0,buffer)) return 0;
|
||||
|
||||
// Result of detection
|
||||
uint32 res = FatDetect(buffer);
|
||||
|
||||
// Cleanup
|
||||
kfree(buffer);
|
||||
return (res == 12);
|
||||
}
|
26
Kernel/hal/filesys/fat/fat16.c
Normal file
26
Kernel/hal/filesys/fat/fat16.c
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* fat16.c
|
||||
*
|
||||
* Created on: Aug 31, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
#include <fileio.h>
|
||||
#include <memory.h>
|
||||
#include "fat.h"
|
||||
|
||||
uint32 Fat16Detect (DevReadRoutine r, uint32 blocksz)
|
||||
{
|
||||
if (!r) return 0;
|
||||
|
||||
// Allocate buffer and call read routine
|
||||
void* buffer = kmalloc(blocksz);
|
||||
if (!(*r)(0,buffer)) return 0;
|
||||
|
||||
// Result of detection
|
||||
uint32 res = FatDetect(buffer);
|
||||
|
||||
// Cleanup
|
||||
kfree(buffer);
|
||||
return (res == 16);
|
||||
}
|
||||
|
26
Kernel/hal/filesys/fat/fat32.c
Normal file
26
Kernel/hal/filesys/fat/fat32.c
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* fat32.c
|
||||
*
|
||||
* Created on: Aug 31, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
#include <fileio.h>
|
||||
#include <memory.h>
|
||||
#include "fat.h"
|
||||
|
||||
uint32 Fat32Detect (DevReadRoutine r, uint32 blocksz)
|
||||
{
|
||||
if (!r) return 0;
|
||||
|
||||
// Allocate buffer and call read routine
|
||||
void* buffer = kmalloc(blocksz);
|
||||
if (!(*r)(0,buffer)) return 0;
|
||||
|
||||
// Result of detection
|
||||
uint32 res = FatDetect(buffer);
|
||||
|
||||
// Cleanup
|
||||
kfree(buffer);
|
||||
return (res == 32);
|
||||
}
|
||||
|
@ -1,8 +0,0 @@
|
||||
/*
|
||||
* fat12.c
|
||||
*
|
||||
* Created on: Aug 29, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
|
||||
|
202
Kernel/hal/filesys/initrd/initrd.c
Normal file
202
Kernel/hal/filesys/initrd/initrd.c
Normal file
@ -0,0 +1,202 @@
|
||||
/*
|
||||
* initrd.c
|
||||
*
|
||||
* Created on: Sep 1, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
|
||||
#define LUXMAGIC 0xCC23AA90
|
||||
#define OEMSTR "luxram"
|
||||
|
||||
#include <fileio.h>
|
||||
#include <stdlib.h>
|
||||
#include <multiboot.h>
|
||||
#include <memory.h>
|
||||
#include <debugio.h>
|
||||
#include "initrd.h"
|
||||
|
||||
|
||||
luxDEVICE *luxDevices;
|
||||
uint32 luxDeviceCount;
|
||||
|
||||
luxFILE *luxFiles;
|
||||
uint32 luxFileCount;
|
||||
uint32 luxFilesAllocated;
|
||||
|
||||
|
||||
/**************************************
|
||||
* DEVICE 'FAKE' READ ROUTINE *
|
||||
**************************************/
|
||||
uint32 luxDevRead (uint32 UNUSED(offset), void* UNUSED(buffer))
|
||||
{
|
||||
return LUXMAGIC;
|
||||
}
|
||||
|
||||
/**************************************
|
||||
* INITIALIZATION ROUTINE *
|
||||
**************************************/
|
||||
void luxInitrdInstall (MultibootInfo* info)
|
||||
{
|
||||
// Install filesystem
|
||||
FileSystem fs = {0, "luxinitrd", luxDetect, 0, 0,
|
||||
luxOpen, luxClose, luxRead, 0, luxTest, luxReadDir};
|
||||
|
||||
VfsInstallFs(&fs);
|
||||
|
||||
|
||||
// See what modules are loaded in the multiboot info
|
||||
if ((info->Flags & 8) == 0 || info->ModulesCount == 0) return; // nothing was loaded
|
||||
|
||||
uint32 i;
|
||||
MultibootModule* modules = (MultibootModule*) info->ModulesAddress;
|
||||
luxDevices = kmalloc(sizeof(luxDEVICE) * info->ModulesCount);
|
||||
luxDeviceCount = 0;
|
||||
|
||||
for (i = 0; i < info->ModulesCount; i++) {
|
||||
|
||||
// Check magic number, to make sure module is a initrd image
|
||||
luxHeader* head = (luxHeader*) modules[i].ModuleStart;
|
||||
if (head->Magic != LUXMAGIC) {
|
||||
Log("Initrd", "Magic = 0x%x [bad] ModuleStart = 0x%x\n", head->Magic, modules[i].ModuleStart);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Set up entry
|
||||
luxDevices[luxDeviceCount].Data = (void*) modules[i].ModuleStart;
|
||||
luxDevices[luxDeviceCount].Size = modules[i].ModuleEnd - modules[i].ModuleStart;
|
||||
|
||||
// Register virtual device. Instead of blocksize, we give the dev no, so we can identify it later
|
||||
VfsMount("initrd", luxDevRead, 0, luxDeviceCount);
|
||||
++luxDeviceCount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**************************************
|
||||
* OTHER USEFUL ROUTINES *
|
||||
**************************************/
|
||||
uint32 luxGetFileSlot()
|
||||
{
|
||||
// Find an empty slot
|
||||
uint32 i = 0;
|
||||
for (i = 0; i < luxFileCount; i++)
|
||||
if (luxFiles[i].Id == 0xffffffff) return i;
|
||||
|
||||
// Nothing found? Allocate more slots if necessary
|
||||
if (luxFileCount >= luxFilesAllocated)
|
||||
{
|
||||
luxFilesAllocated += 4;
|
||||
luxFiles = kmrealloc(luxFiles, luxFilesAllocated);
|
||||
}
|
||||
|
||||
// Give last slot
|
||||
++luxFileCount;
|
||||
return (luxFileCount-1);
|
||||
}
|
||||
|
||||
// Navigates and returns the directory entry that contains the file/folder
|
||||
luxDirectoryEntry* luxGetFile (string path, uint32 dev)
|
||||
{
|
||||
luxHeader* root = (luxHeader*) luxDevices[dev].Data;
|
||||
luxDirectory* current = root->Root;
|
||||
luxDirectoryEntry rt = {"root", 0xB68, 0, 0, 0, {0,0}, {0,0}, {0,0}, (uint32)&root->Root};
|
||||
|
||||
if (path[0] != '\\')
|
||||
return &rt;
|
||||
|
||||
path = path + 1;
|
||||
|
||||
|
||||
while (path)
|
||||
{
|
||||
// Trim the next path separator
|
||||
string tmp = strchr(path, '\\');
|
||||
if (tmp) {
|
||||
*tmp = 0; tmp = tmp + 1;
|
||||
if (!*tmp) tmp = 0;
|
||||
}
|
||||
|
||||
// Find the folder/file in current directory
|
||||
uint32 i, found = 0xffffffff;
|
||||
for (i = 0; i < current->Count && found == 0xffffffff; i++)
|
||||
if (strcmp(path, current->Entries[i].Name) == 0) found = i;
|
||||
|
||||
// Check if the file/folder was found
|
||||
if (found == 0xffffffff) return NULL;
|
||||
|
||||
// Return entry pointer if done
|
||||
if (!tmp) return ¤t->Entries[found];
|
||||
|
||||
// Go inside
|
||||
current = (luxDirectory*) (current->Entries[found].Offset + (uint32)root);
|
||||
path = tmp;
|
||||
}
|
||||
|
||||
// We shouldn't get here
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**************************************
|
||||
* FILE SYSTEM INTERFACE ROUTINES *
|
||||
**************************************/
|
||||
uint32 luxDetect (DevReadRoutine rd, uint32 blocksz)
|
||||
{
|
||||
// Check magic result, which is returned by our device read function
|
||||
void* buffer = kmalloc(blocksz);
|
||||
uint32 result = (*rd)(0, buffer);
|
||||
kfree(buffer);
|
||||
|
||||
return (result == LUXMAGIC);
|
||||
}
|
||||
|
||||
// Returns element count read
|
||||
uint32 luxRead (const MountPoint* UNUSED(mp), FILE* f, uint32 elemsz, uint32 n, uint8* buffer)
|
||||
{
|
||||
uint32 temp = Min(n*elemsz, luxFiles[f->Id].Size);
|
||||
|
||||
memcpy(buffer, luxFiles[f->Id].Pos, temp);
|
||||
luxFiles[f->Id].Size -= temp;
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
FILE* luxOpen (const MountPoint* mp, FILE* f, string path)
|
||||
{
|
||||
f->Id = luxGetFileSlot();
|
||||
luxDirectoryEntry* entry = luxGetFile(path, mp->BlockSize);
|
||||
|
||||
f->Name = entry->Name;
|
||||
f->Flags = entry->Flags;
|
||||
f->GroupId = entry->GroupId;
|
||||
f->OwnerId = entry->OwnerId;
|
||||
f->Size = entry->Size;
|
||||
|
||||
luxFiles[f->Id].Id = f->Id;
|
||||
luxFiles[f->Id].Pos = luxFiles[f->Id].Start = entry->Offset + luxDevices[mp->BlockSize].Data;
|
||||
luxFiles[f->Id].Size = entry->Size;
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
DirectoryEntry* luxTest (const MountPoint* mp, string path)
|
||||
{
|
||||
return (DirectoryEntry*) luxGetFile(path, mp->BlockSize);
|
||||
}
|
||||
|
||||
FILE* luxClose (const MountPoint* UNUSED(mp), FILE* f)
|
||||
{
|
||||
luxFiles[f->Id].Id = NULL;
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
DirectoryEntry* luxReadDir (const MountPoint* UNUSED(mp), FILE* f, uint32 index)
|
||||
{
|
||||
luxDirectory* dir = luxFiles[f->Id].Start;
|
||||
|
||||
if (index > dir->Count) return NULL;
|
||||
return (DirectoryEntry*) &dir->Entries[index];
|
||||
}
|
||||
|
56
Kernel/hal/filesys/initrd/initrd.h
Normal file
56
Kernel/hal/filesys/initrd/initrd.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* initdr.h
|
||||
*
|
||||
* Created on: Sep 1, 2011
|
||||
* Author: Tiberiu
|
||||
*/
|
||||
|
||||
#ifndef INITDR_H_
|
||||
#define INITDR_H_
|
||||
|
||||
#include <types.h>
|
||||
#include <fileio.h>
|
||||
|
||||
typedef struct {
|
||||
char Name[256];
|
||||
uint32 Flags, OwnerId, GroupId, Size;
|
||||
TimeSystem TimeCreated, TimeModified, TimeAccessed;
|
||||
uint32 Offset;
|
||||
} luxDirectoryEntry;
|
||||
|
||||
typedef struct {
|
||||
uint32 Count;
|
||||
luxDirectoryEntry* Entries;
|
||||
} luxDirectory;
|
||||
|
||||
typedef struct {
|
||||
uint32 Magic;
|
||||
char Oem[6];
|
||||
luxDirectory* Root;
|
||||
} luxHeader;
|
||||
|
||||
typedef struct {
|
||||
uint32 DeviceId;
|
||||
uint32 Size;
|
||||
void* Data;
|
||||
} luxDEVICE;
|
||||
|
||||
typedef struct {
|
||||
uint32 Id;
|
||||
uint32 Size;
|
||||
void* Start;
|
||||
void* Pos;
|
||||
} luxFILE;
|
||||
|
||||
|
||||
extern uint32 luxDevRead (uint32 offset, void* buffer);
|
||||
extern void luxInitrdInstall (MultibootInfo* info);
|
||||
extern uint32 luxDetect (DevReadRoutine rd, uint32 blocksz);
|
||||
extern uint32 luxRead (const MountPoint* mp, FILE* f, uint32 elemsz, uint32 n, uint8* buffer);
|
||||
extern FILE* luxOpen (const MountPoint* mp, FILE* f, string path);
|
||||
extern DirectoryEntry* luxTest (const MountPoint* mp, string path);
|
||||
extern FILE* luxClose (const MountPoint* mp, FILE* f);
|
||||
extern DirectoryEntry* luxReadDir (const MountPoint* mp, FILE* f, uint32 index);
|
||||
|
||||
|
||||
#endif /* INITDR_H_ */
|
@ -8,32 +8,35 @@
|
||||
#include "keyboard/keyboard.h"
|
||||
#include "mouse/mouse.h"
|
||||
|
||||
#include "filesys/fat/fat.h"
|
||||
|
||||
#include <fileio.h>
|
||||
#include <debugio.h>
|
||||
|
||||
void HalInitialize()
|
||||
{
|
||||
// Initialize cpu
|
||||
GdtInstall(); Log("%#[HAL] %#Installed GDT\n", ColorYellow, ColorLightGreen);
|
||||
IdtInstall(); Log("%#[HAL] %#Installed IDT\n", ColorYellow, ColorLightGreen);
|
||||
IsrsInstall(); Log("%#[HAL] %#Installed ISRs\n", ColorYellow, ColorLightGreen);
|
||||
IrqInstall(); Log("%#[HAL] %#Installed IRQs\n", ColorYellow, ColorLightGreen);
|
||||
GdtInstall(); Log("HAL", "Installed GDT\n");
|
||||
IdtInstall(); Log("HAL", "Installed IDT\n");
|
||||
IsrsInstall(); Log("HAL", "Installed ISRs\n");
|
||||
IrqInstall(); Log("HAL", "Installed IRQs\n");
|
||||
|
||||
// Start interrupts
|
||||
asm volatile ("sti");
|
||||
Log("%#[HAL] %#Interrupts are started...\n", ColorYellow, ColorLightMagenta);
|
||||
Log("HAL", "%#Interrupts are started...\n", ColorLightMagenta);
|
||||
|
||||
// Install keyboard
|
||||
IrqInstallHandler(0, TimeHandler);
|
||||
IrqInstallHandler(1, KeyboardHandler);
|
||||
IrqInstallHandler(12, MouseHandler);
|
||||
|
||||
KeyboardInstallA(); Log("%#[HAL] %#Installing keyboard... %#[1/2] ", ColorYellow, ColorLightGray, ColorLightGreen);
|
||||
KeyboardInstallB(); Log("%#[2/2]\n", ColorLightGreen);
|
||||
KeyboardInstallA(); Log("HAL", "Installing keyboard... %#[1/2] ", ColorLightGreen);
|
||||
KeyboardInstallB(); Log("HAL", "%#[2/2]\n", ColorLightGreen);
|
||||
|
||||
// Install mouse driver
|
||||
MouseInstall(); Log("%#[HAL] %#Installed mouse driver\n", ColorYellow, ColorLightGreen);
|
||||
MouseInstall(); Log("HAL", "Installed mouse driver\n");
|
||||
|
||||
// Install VFS
|
||||
VfsInstall();
|
||||
FatInstall();
|
||||
}
|
||||
|
@ -11,13 +11,20 @@
|
||||
#include <debugio.h>
|
||||
#include "keyboard/keyboard.h"
|
||||
|
||||
void SystemPanic()
|
||||
{
|
||||
asm("cli");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
void SystemReboot()
|
||||
{
|
||||
Log("Rebooting system...\n");
|
||||
Log("System", "Rebooting system...\n");
|
||||
|
||||
KeyboardWaitOutport();
|
||||
outportb (0x64, 0xFE);
|
||||
|
||||
asm("cli");
|
||||
asm("hlt");
|
||||
SystemPanic();
|
||||
}
|
||||
|
||||
|
@ -13,9 +13,6 @@ MountPoint* mpArray;
|
||||
uint32 mpCount;
|
||||
uint32 mpAllocated;
|
||||
|
||||
#define LogVfs(...) { Log("%#[Vfs] ", ColorLightBlue); Log(__VA_ARGS__); }
|
||||
#define ErrorVfs(...) { Error("%#[Vfs] ", ColorLightBlue); Error(__VA_ARGS__); }
|
||||
|
||||
void VfsInstall ()
|
||||
{
|
||||
fsArray = (FileSystem*) kmalloc(MAX_FS_COUNT * sizeof(FileSystem));
|
||||
@ -25,13 +22,13 @@ void VfsInstall ()
|
||||
mpCount = 0;
|
||||
mpAllocated = 32;
|
||||
|
||||
LogVfs("%#VFS now in business.\n", ColorLightGreen);
|
||||
Log("VFS", "%#VFS now in business.\n", ColorLightGreen);
|
||||
}
|
||||
|
||||
uint8 VfsInstallFs (FileSystem* fs)
|
||||
{
|
||||
if (fsCount >= MAX_FS_COUNT) {
|
||||
ErrorVfs("%#Failed to install file system '%s': FS count reached.\n", ColorLightRed, fs->Name);
|
||||
Error("VFS", "%#Failed to install file system '%s': FS count reached.\n", ColorLightRed, fs->Name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -39,7 +36,7 @@ uint8 VfsInstallFs (FileSystem* fs)
|
||||
fsArray[fsCount].Id = fsCount;
|
||||
|
||||
++fsCount;
|
||||
LogVfs("Installed file system %#.\n", ColorWhite, fs->Name);
|
||||
Log("VFS", "Installed file system %#%s.\n", ColorWhite, fs->Name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -47,7 +44,7 @@ uint32 VfsFindDevice (string dev)
|
||||
{
|
||||
uint32 i;
|
||||
for (i = 0; i < mpCount; i++)
|
||||
if (strcmp(dev, mpArray[i].Name) == 0)
|
||||
if (mpArray[i].Id != BAD && strcmp(dev, mpArray[i].Name) == 0)
|
||||
return i;
|
||||
|
||||
return BAD;
|
||||
@ -75,10 +72,11 @@ uint8 VfsMount (string Name, DevReadRoutine R, DevWriteRoutine W, uint32 BlockSi
|
||||
|
||||
// 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 (fsArray[i].Detect && fsArray[i].Detect(R, BlockSize))
|
||||
fsId = i;
|
||||
|
||||
if (fsId == BAD) {
|
||||
ErrorVfs("%#Failed to mount device %s: no file system found.\n", ColorLightRed, Name)
|
||||
Error("VFS", "%#Failed to mount device %s: no file system found.\n", ColorLightRed, Name)
|
||||
return 0; // No file system, no good
|
||||
}
|
||||
|
||||
@ -131,14 +129,22 @@ uint8 VfsMount (string Name, DevReadRoutine R, DevWriteRoutine W, uint32 BlockSi
|
||||
if (!success) return 0;
|
||||
}
|
||||
|
||||
memcpy(mpArray[mpCount].Name, Name, sizeof(char) * 128);
|
||||
memcpy(mpArray[mpIndex].Name, Name, sizeof(char) * MAX_MOUNTPOINTNAME_LEN);
|
||||
|
||||
LogVfs("Mounted device %#%s", ColorWhite, Name);
|
||||
// Tell file system to mount the device
|
||||
if (fsArray[mpArray[mpIndex].FsId].MountDevice)
|
||||
fsArray[mpArray[mpIndex].FsId].MountDevice(&mpArray[mpIndex]);
|
||||
|
||||
Log("VFS", "Mounted device %#%s%# using the %#%s%# file system.\n", ColorWhite, Name,
|
||||
ColorLightGray, ColorWhite, fsArray[fsId].Name, ColorLightGray);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void VfsUnmount (uint32 dev_id)
|
||||
{
|
||||
if (fsArray[mpArray[dev_id].FsId].UnmountDevice)
|
||||
fsArray[mpArray[dev_id].FsId].UnmountDevice(&mpArray[dev_id]);
|
||||
|
||||
mpArray[dev_id].Id = BAD;
|
||||
mpCount--;
|
||||
}
|
||||
|
Reference in New Issue
Block a user