From: John Hodge Date: Sat, 10 Oct 2009 00:33:55 +0000 (+0800) Subject: Various Changes X-Git-Tag: rel0.06~389 X-Git-Url: https://git.ucc.asn.au/?p=tpg%2Facess2.git;a=commitdiff_plain;h=466eda7c917791866a29c253c6c22197faf41bf7 Various Changes - Fixes to network driver (still doesn't work) - Added EXT2 Driver (required changes to HDD driver and VFS Driver interface) > Seems to cause a Triple Fault - Features and bugfixes for libc - Implemented alternative directories for libraries in ld-acess - Implemented usermode mount support (no unmount yet) --- diff --git a/Kernel/Makefile b/Kernel/Makefile index ae42dce5..195d3110 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -16,11 +16,12 @@ ASFLAGS += -D ARCH=\"$(ARCH)\" LDFLAGS += -T arch/$(ARCHDIR)/link.ld OBJ = $(addprefix arch/$(ARCHDIR)/,$(A_OBJ)) -OBJ += heap.o messages.o debug.o modules.o lib.o syscalls.o system.o threads.o +OBJ += heap.o messages.o debug.o modules.o lib.o syscalls.o system.o threads.o drvutil.o OBJ += binary.o bin/elf.o OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/dir.o vfs/io.o vfs/mount.o vfs/memfile.o vfs/nodecache.o -OBJ += vfs/fs/root.o vfs/fs/devfs.o vfs/fs/fat.o -OBJ += drv/dma.o drv/fifo.o drv/pci.o drv/ata_x86.o drv/vterm.o drv/vga.o drv/kb.o drv/fdd.o +OBJ += vfs/fs/root.o vfs/fs/devfs.o vfs/fs/fat.o vfs/fs/ext2.o +OBJ += drv/fifo.o drv/dma.o drv/pci.o drv/vterm.o drv/vga.o drv/kb.o +OBJ += $(addprefix drv/, $(addsuffix .o,$(DRIVERS))) OBJ := $(addsuffix .$(ARCH), $(OBJ)) BIN = ../Acess2.$(ARCH).bin @@ -57,5 +58,7 @@ $(BIN): $(OBJ) arch/$(ARCHDIR)/link.ld Makefile include/syscalls.h: syscalls.lst Makefile php GenSyscalls.php +Makefile: ../Makefile.cfg arch/$(ARCHDIR)/Makefile + # Dependency Files -include $(DEPFILES) diff --git a/Kernel/arch/x86/irq.c b/Kernel/arch/x86/irq.c index 848e7e9d..586768ea 100644 --- a/Kernel/arch/x86/irq.c +++ b/Kernel/arch/x86/irq.c @@ -8,7 +8,7 @@ #define MAX_CALLBACKS_PER_IRQ 4 // === TYPES === -typedef void (*tIRQ_Callback)(void); +typedef void (*tIRQ_Callback)(int); // === GLOBALS === tIRQ_Callback gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ]; @@ -30,18 +30,18 @@ void IRQ_Handler(tRegs *Regs) { //Log(" IRQ_Handler: Call %p", gIRQ_Handlers[Regs->int_num][i]); if( gIRQ_Handlers[Regs->int_num][i] ) - gIRQ_Handlers[Regs->int_num][i](); + gIRQ_Handlers[Regs->int_num][i](Regs->int_num); } - outb(0x20, 0x20); // ACK IRQ if(Regs->int_num >= 8) outb(0xA0, 0x20); // ACK IRQ (Secondary PIC) + outb(0x20, 0x20); // ACK IRQ } /** - * \fn int IRQ_AddHandler( int Num, void (*Callback)(void) ) + * \fn int IRQ_AddHandler( int Num, void (*Callback)(int) ) */ -int IRQ_AddHandler( int Num, void (*Callback)(void) ) +int IRQ_AddHandler( int Num, void (*Callback)(int) ) { int i; for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ ) diff --git a/Kernel/arch/x86/main.c b/Kernel/arch/x86/main.c index 304c3dd8..c0d75ce6 100644 --- a/Kernel/arch/x86/main.c +++ b/Kernel/arch/x86/main.c @@ -18,6 +18,7 @@ extern void MM_PreinitVirtual(); extern void MM_Install(tMBoot_Info *MBoot); extern void MM_InstallVirtual(); extern void Threads_Init(); +extern int Time_Setup(); extern Uint Proc_Clone(Uint *Err, Uint Flags); extern void Threads_Sleep(); extern void Threads_Exit(); @@ -43,6 +44,9 @@ int kmain(Uint MbMagic, tMBoot_Info *MbInfo) // Start Multitasking Threads_Init(); + // Start Timers + Time_Setup(); + Log("Starting VFS..."); // Load Virtual Filesystem VFS_Init(); diff --git a/Kernel/arch/x86/time.c b/Kernel/arch/x86/time.c index f7d02cc1..4cfa280d 100644 --- a/Kernel/arch/x86/time.c +++ b/Kernel/arch/x86/time.c @@ -69,6 +69,8 @@ void Time_Interrupt() giPartMiliseconds -= 0x80000000; } + Log("giTimestamp = %lli", giTimestamp); + Timer_CallTimers(); } @@ -112,7 +114,9 @@ void Timer_CallTimers() i < NUM_TIMERS; i ++) { + Log("%i", i); if(gTimers[i].Callback == NULL) continue; + Log("%i - %lli < %lli", i, giTimestamp, gTimers[i].FiresAfter); if(giTimestamp < gTimers[i].FiresAfter) continue; callback = gTimers[i].Callback; gTimers[i].Callback = NULL; @@ -126,6 +130,9 @@ void Timer_CallTimers() int Time_CreateTimer(int Delta, void *Callback, void *Argument) { int ret; + + if(Callback == NULL) return -1; + for(ret = 0; ret < NUM_TIMERS; ret++) @@ -134,6 +141,8 @@ int Time_CreateTimer(int Delta, void *Callback, void *Argument) gTimers[ret].Callback = Callback; gTimers[ret].FiresAfter = giTimestamp + Delta; gTimers[ret].Argument = Argument; + Log("Callback = %p", Callback); + Log("Timer %i fires at %lli", ret, gTimers[ret].FiresAfter); return ret; } return -1; diff --git a/Kernel/drv/Makefile b/Kernel/drv/Makefile index 5a55d939..44f17cde 100644 --- a/Kernel/drv/Makefile +++ b/Kernel/drv/Makefile @@ -1,22 +1,20 @@ # Acess2 Module/Driver Templater Makefile # Makefile.tpl -ARCH = i386 -CC = gcc -LD = ld +-include ../../Makefile.cfg -CPPFLAGS = -I../include -I../arch/$(ARCH)/include -DARCH=$(ARCH) -DBUILD_MODULE +CPPFLAGS = -I../include -I../arch/$(ARCHDIR)/include -DARCH=$(ARCH) -DBUILD_MODULE CFLAGS = -Wall -Werror $(CPPFLAGS) .PHONY: all clean -all: ata_x86.kmd +all: bochsvbe.kmd -%.kmd: +%.kmd: %.o $(CC) -shared -nostdlib -o $@ $< %.o: %.c $(CC) $(CFLAGS) -o $@ -c $< -ata_x86.kmd: ata_x86.o -bochsvbe.kmd: bochsvbe.o +#ata_x86.kmd: ata_x86.o +#bochsvbe.kmd: bochsvbe.o diff --git a/Kernel/drv/ata_x86.c b/Kernel/drv/ata_x86.c index c2c5205c..e57adde0 100644 --- a/Kernel/drv/ata_x86.c +++ b/Kernel/drv/ata_x86.c @@ -9,6 +9,7 @@ #include #include #include +#include // === CONSTANTS === #define MAX_ATA_DISKS 4 @@ -102,10 +103,11 @@ char *ATA_ReadDir(tVFS_Node *Node, int Pos); tVFS_Node *ATA_FindDir(tVFS_Node *Node, char *Name); Uint64 ATA_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); int ATA_IOCtl(tVFS_Node *Node, int Id, void *Data); - int ATA_Read(Uint8 Disk, Uint64 Address, Uint64 Count, void *Buffer); +Uint ATA_Read(Uint64 Address, Uint Count, void *Buffer, Uint Argument); + int ATA_ReadRaw(Uint8 Disk, Uint64 Address, Uint64 Count, void *Buffer); int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer); -void ATA_IRQHandlerPri(void); -void ATA_IRQHandlerSec(void); +void ATA_IRQHandlerPri(int unused); +void ATA_IRQHandlerSec(int unused); Uint8 ATA_int_BusMasterReadByte(int Ofs); void ATA_int_BusMasterWriteByte(int Ofs, Uint8 Value); void ATA_int_BusMasterWriteDWord(int Ofs, Uint32 Value); @@ -645,55 +647,8 @@ tVFS_Node *ATA_FindDir(tVFS_Node *Node, char *Name) * \fn Uint64 ATA_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) */ Uint64 ATA_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) -{ - int ret; - int disk, part; - Uint64 sector, count; - - disk = Node->Inode >> 8; - part = Node->Inode & 0xFF; - - // Aligned Read - if(Offset % SECTOR_SIZE == 0 && Length % SECTOR_SIZE == 0) - { - sector = Offset / SECTOR_SIZE; - count = Length / SECTOR_SIZE; - // Raw Disk? - if(part == 0xFF) - { - // Bounds Check - if( sector >= gATA_Disks[disk].Sectors ) return 0; - if( sector + count > gATA_Disks[disk].Sectors ) - count = gATA_Disks[disk].Sectors - sector; - // Read Data - ret = ATA_Read(disk, sector, count, Buffer); - } - else // Or a partition - { - //Log(" ATA_ReadFS: %i:%i 0x%llx + 0x%llx\n", disk, part, - // gATA_Disks[disk].Partitions[part].Start, - // gATA_Disks[disk].Partitions[part].Length ); - - // Bounds Check - if( sector >= gATA_Disks[disk].Partitions[part].Length ) return 0; - if( sector + count > gATA_Disks[disk].Partitions[part].Length ) - count = gATA_Disks[disk].Partitions[part].Length - sector; - // Read Disk - ret = ATA_Read(disk, - gATA_Disks[disk].Partitions[part].Start + sector, - count, - Buffer); - } - // Check return value - if(ret == 1) - return count * SECTOR_SIZE; - else { - Warning("ATA_ReadFS: RETURN 0 (Read failed with ret = %i)", ret); - return 0; - } - } - Warning("ATA_ReadFS: RETURN 0 (Non-Aligned Read 0x%llx 0x%llx)", Offset, Length); - return 0; +{ + return DrvUtil_ReadBlock(Offset, Length, Buffer, ATA_Read, SECTOR_SIZE, Node->Inode); } /** @@ -719,9 +674,46 @@ int ATA_IOCtl(tVFS_Node *Node, int Id, void *Data) // --- Disk Access --- /** - * \fn int ATA_Read(Uint8 Disk, Uint64 Address, Uint64 Count, void *Buffer) + * \fn Uint ATA_Read(Uint64 Address, Uint Count, void *Buffer, Uint Argument) + */ +Uint ATA_Read(Uint64 Address, Uint Count, void *Buffer, Uint Argument) +{ + int ret; + int disk = Argument >> 8; + int part = Argument & 0xFF; + + // Raw Disk Access + if(part == 0xFF) + { + if( Address >= gATA_Disks[disk].Sectors ) return 0; + if( Address + Count > gATA_Disks[disk].Sectors ) + Count = gATA_Disks[disk].Sectors - Address; + + ret = ATA_ReadRaw(disk, Address, Count, Buffer); + if(ret == 1) + return Count; + return 0; + } + + if( Address >= gATA_Disks[disk].Partitions[part].Length ) return 0; + if( Address + Count > gATA_Disks[disk].Partitions[part].Length ) + Count = gATA_Disks[disk].Partitions[part].Length - Address; + + ret = ATA_ReadRaw( + disk, + gATA_Disks[disk].Partitions[part].Start + Address, + Count, + Buffer); + + if(ret == 1) return Count; + + return 0; + +} +/** + * \fn int ATA_ReadRaw(Uint8 Disk, Uint64 Address, Uint64 Count, void *Buffer) */ -int ATA_Read(Uint8 Disk, Uint64 Address, Uint64 Count, void *Buffer) +int ATA_ReadRaw(Uint8 Disk, Uint64 Address, Uint64 Count, void *Buffer) { int ret; Uint offset; @@ -755,7 +747,7 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer) Uint16 base; // Check if the count is small enough - if(Count > MAX_DMA_SECTORS) return -1; + if(Count > MAX_DMA_SECTORS) return 0; // Get exclusive access to the disk controller LOCK( &giaATA_ControllerLock[ cont ] ); @@ -812,9 +804,9 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer) } /** - * \fn void ATA_IRQHandlerPri(void) + * \fn void ATA_IRQHandlerPri(int unused) */ -void ATA_IRQHandlerPri(void) +void ATA_IRQHandlerPri(int unused) { Uint8 val; @@ -829,9 +821,9 @@ void ATA_IRQHandlerPri(void) } /** - * \fn void ATA_IRQHandlerSec(void) + * \fn void ATA_IRQHandlerSec(int unused) */ -void ATA_IRQHandlerSec(void) +void ATA_IRQHandlerSec(int unused) { Uint8 val; // IRQ bit set for Secondary Controller diff --git a/Kernel/drv/bochsvbe.c b/Kernel/drv/bochsvbe.c index bbf0bbcb..2014cb85 100644 --- a/Kernel/drv/bochsvbe.c +++ b/Kernel/drv/bochsvbe.c @@ -30,34 +30,10 @@ typedef struct { Uint32 fbSize; } t_bga_mode; - -// === PROTOTYPES === -// Driver - int BGA_Install(char **Arguments); -void BGA_Uninstall(); -// Internal -void BGA_int_WriteRegister(Uint16 reg, Uint16 value); -Uint16 BGA_int_ReadRegister(Uint16 reg); -void BGA_int_SetBank(Uint16 bank); -void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp); - int BGA_int_UpdateMode(int id); - int BGA_int_FindMode(tVideo_IOCtl_Mode *info); - int BGA_int_ModeInfo(tVideo_IOCtl_Mode *info); - int BGA_int_MapFB(void *Dest); -// Filesystem -Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer); -Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer); - int BGA_Ioctl(tVFS_Node *node, int id, void *data); - // === CONSTANTS === -const t_bga_mode BGA_MODES[] = { - {}, - {640,480,8, 0, 640*480}, - {640,480,32, 0, 640*480*4}, - {800,600,8, 0, 800*600}, - {800,600,32, 0, 800*600*4}, +enum eMode_Flags { + MODEFLAG_TEXT = 1 }; -#define BGA_MODE_COUNT (sizeof(BGA_MODES)/sizeof(BGA_MODES[0])) #define BGA_LFB_MAXSIZE (1024*768*4) #define VBE_DISPI_BANK_ADDRESS 0xA0000 #define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000 @@ -80,7 +56,26 @@ enum { VBE_DISPI_INDEX_Y_OFFSET }; -// GLOBALS + +// === PROTOTYPES === +// Driver + int BGA_Install(char **Arguments); +void BGA_Uninstall(); +// Internal +void BGA_int_WriteRegister(Uint16 reg, Uint16 value); +Uint16 BGA_int_ReadRegister(Uint16 reg); +void BGA_int_SetBank(Uint16 bank); +void BGA_int_SetMode(Uint16 width, Uint16 height); + int BGA_int_UpdateMode(int id); + int BGA_int_FindMode(tVideo_IOCtl_Mode *info); + int BGA_int_ModeInfo(tVideo_IOCtl_Mode *info); + int BGA_int_MapFB(void *Dest); +// Filesystem +Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer); +Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer); + int BGA_Ioctl(tVFS_Node *node, int id, void *data); + +// === GLOBALS === MODULE_DEFINE(0, 0x0032, BochsVBE, BGA_Install, NULL, NULL); tDevFS_Driver gBGA_DriverStruct = { NULL, "BochsGA", @@ -93,6 +88,16 @@ tDevFS_Driver gBGA_DriverStruct = { int giBGA_CurrentMode = -1; int giBGA_DriverId = -1; Uint *gBGA_Framebuffer; +t_bga_mode gBGA_Modes[] = { + {}, + { 80,25, 32, MODEFLAG_TEXT, 80*25*8}, // 640 x 480 + {100,37, 32, MODEFLAG_TEXT, 100*37*8}, // 800 x 600 + {640,480,8, 0, 640*480}, + {640,480,32, 0, 640*480*4}, + {800,600,8, 0, 800*600}, + {800,600,32, 0, 800*600*4}, +}; +#define BGA_MODE_COUNT (sizeof(gBGA_Modes)/sizeof(gBGA_Modes[0])) // === CODE === /** @@ -142,7 +147,7 @@ Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer) if(giBGA_CurrentMode == -1) return -1; // Check Offset and Length against Framebuffer Size - if(off+len > BGA_MODES[giBGA_CurrentMode].fbSize) + if(off+len > gBGA_Modes[giBGA_CurrentMode].fbSize) return -1; // Copy from Framebuffer @@ -155,30 +160,58 @@ Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer) * \brief Write to the framebuffer */ Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer) -{ - Uint8 *destBuf; - - DEBUGS("BGA_Write: (off=%i, len=0x%x)\n", off, len); +{ + ENTER("xoff xlen", off, len); // Check Mode - if(giBGA_CurrentMode == -1) + if(giBGA_CurrentMode == -1) { + LEAVE('i', -1); return -1; + } + // Check Input against Frambuffer Size - if(off+len > BGA_MODES[giBGA_CurrentMode].fbSize) + if(off+len > gBGA_Modes[giBGA_CurrentMode].fbSize) { + LEAVE('i', -1); return -1; + } - destBuf = (Uint8*) ((Uint)gBGA_Framebuffer + (Uint)off); - - DEBUGS(" BGA_Write: *buffer = 0x%x\n", *(Uint*)buffer); - DEBUGS(" BGA_Write: Updating Framebuffer (0x%x - 0x%x bytes)\n", - destBuf, destBuf + (Uint)len); - - - // Copy to Frambuffer - memcpy(destBuf, buffer, len); - - DEBUGS("BGA_Write: BGA Framebuffer updated\n"); + // Text Mode + if( gBGA_Modes[giBGA_CurrentMode].flags & MODEFLAG_TEXT ) + { + tVT_Char *chars = buffer; + int pitch = gBGA_Modes[giBGA_CurrentMode].width * giVT_CharWidth; + Uint32 *dest; + dest = (void*)gBGA_Framebuffer; + dest += off * giVT_CharWidth; + len /= sizeof(tVT_Char); + while(len--) + { + VT_Font_Render( + chars->Ch, + dest, pitch, + VT_Colour12to24(chars->BGCol), + VT_Colour12to24(chars->FGCol) + ); + dest += giVT_CharWidth; + chars++; + } + } + else + { + Uint8 *destBuf = (Uint8*) ((Uint)gBGA_Framebuffer + (Uint)off); + + LOG("buffer = %p\n", buffer); + LOG("Updating Framebuffer (%p to %p)\n", + destBuf, destBuf + (Uint)len); + + + // Copy to Frambuffer + memcpy(destBuf, buffer, len); + + LOG("BGA Framebuffer updated\n"); + } + LEAVE('i', len); return len; } @@ -265,13 +298,13 @@ INT void BGA_int_SetBank(Uint16 bank) * \fn void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp) * \brief Sets the video mode from the dimensions and bpp given */ -void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp) +void BGA_int_SetMode(Uint16 width, Uint16 height) { DEBUGS("BGA_int_SetMode: (width=%i, height=%i, bpp=%i)\n", width, height, bpp); BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); BGA_int_WriteRegister(VBE_DISPI_INDEX_XRES, width); BGA_int_WriteRegister(VBE_DISPI_INDEX_YRES, height); - BGA_int_WriteRegister(VBE_DISPI_INDEX_BPP, bpp); + BGA_int_WriteRegister(VBE_DISPI_INDEX_BPP, 32); BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_NOCLEARMEM | VBE_DISPI_LFB_ENABLED); //BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_NOCLEARMEM); } @@ -282,8 +315,19 @@ void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp) */ int BGA_int_UpdateMode(int id) { + // Sanity Check if(id < 0 || id >= BGA_MODE_COUNT) return -1; - BGA_int_SetMode(BGA_MODES[id].width, BGA_MODES[id].height, BGA_MODES[id].bpp); + + // Check if it is a text mode + if( gBGA_Modes[id].flags & MODEFLAG_TEXT ) + BGA_int_SetMode( + gBGA_Modes[id].width*giVT_CharWidth, + gBGA_Modes[id].height*giVT_CharHeight); + else // Graphics? + BGA_int_SetMode( + gBGA_Modes[id].width, + gBGA_Modes[id].height); + giBGA_CurrentMode = id; return id; } @@ -304,12 +348,12 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info) for(i = 0; i < BGA_MODE_COUNT; i++) { #if DEBUG >= 2 - LogF("Mode %i (%ix%ix%i), ", i, BGA_MODES[i].width, BGA_MODES[i].height, BGA_MODES[i].bpp); + LogF("Mode %i (%ix%ix%i), ", i, gBGA_Modes[i].width, gBGA_Modes[i].height, gBGA_Modes[i].bpp); #endif - if(BGA_MODES[i].width == info->width - && BGA_MODES[i].height == info->height - && BGA_MODES[i].bpp == info->bpp) + if(gBGA_Modes[i].width == info->width + && gBGA_Modes[i].height == info->height + && gBGA_Modes[i].bpp == info->bpp) { #if DEBUG >= 2 LogF("Perfect!\n"); @@ -318,7 +362,7 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info) break; } - tmp = BGA_MODES[i].width * BGA_MODES[i].height * BGA_MODES[i].bpp; + tmp = gBGA_Modes[i].width * gBGA_Modes[i].height * gBGA_Modes[i].bpp; tmp -= rqdProduct; tmp = tmp < 0 ? -tmp : tmp; factor = tmp * 100 / rqdProduct; @@ -334,9 +378,9 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info) } } info->id = best; - info->width = BGA_MODES[best].width; - info->height = BGA_MODES[best].height; - info->bpp = BGA_MODES[best].bpp; + info->width = gBGA_Modes[best].width; + info->height = gBGA_Modes[best].height; + info->bpp = gBGA_Modes[best].bpp; return best; } @@ -352,9 +396,9 @@ int BGA_int_ModeInfo(tVideo_IOCtl_Mode *info) if(info->id < 0 || info->id >= BGA_MODE_COUNT) return -1; - info->width = BGA_MODES[info->id].width; - info->height = BGA_MODES[info->id].height; - info->bpp = BGA_MODES[info->id].bpp; + info->width = gBGA_Modes[info->id].width; + info->height = gBGA_Modes[info->id].height; + info->bpp = gBGA_Modes[info->id].bpp; return 1; } @@ -371,10 +415,10 @@ int BGA_int_MapFB(void *Dest) // Sanity Check if((Uint)Dest > 0xC0000000) return 0; - if(BGA_MODES[giBGA_CurrentMode].bpp < 15) return 0; // Only non-pallete modes are supported + if(gBGA_Modes[giBGA_CurrentMode].bpp < 15) return 0; // Only non-pallete modes are supported // Count required pages - pages = (BGA_MODES[giBGA_CurrentMode].fbSize + 0xFFF) >> 12; + pages = (gBGA_Modes[giBGA_CurrentMode].fbSize + 0xFFF) >> 12; // Check if there is space for( i = 0; i < pages; i++ ) diff --git a/Kernel/drv/fdd.c b/Kernel/drv/fdd.c index 4e271a9e..ae79ac76 100644 --- a/Kernel/drv/fdd.c +++ b/Kernel/drv/fdd.c @@ -2,7 +2,7 @@ * AcessOS 0.1 * Floppy Disk Access Code */ -#define DEBUG 0 +#define DEBUG 1 #include #include #include @@ -114,7 +114,7 @@ static int siFDD_SectorCacheSize = CACHE_SIZE; static t_floppySector sFDD_SectorCache[CACHE_SIZE]; #endif -//=== CODE === +// === CODE === /** * \fn char *FDD_ReadDir(tVFS_Node *Node, int pos) * \brief Read Directory @@ -176,7 +176,7 @@ Uint64 FDD_ReadFS(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer) int disk; Uint32 buf[128]; - ENTER("xoff xlen pbuffer", off, len, buffer) + ENTER("xoff xlen pbuffer", off, len, buffer); if(node == NULL) { LEAVE('i', -1); @@ -481,10 +481,10 @@ int FDD_IOCtl(tVFS_Node *node, int id, void *data) } /** - * \fn void fdd_handler(void) + * \fn void fdd_handler(int unused) * \brief Handles IRQ6 */ -void fdd_handler(void) +void fdd_handler(int unused) { fdd_irq6 = 1; } diff --git a/Kernel/drv/ne2000.c b/Kernel/drv/ne2000.c index e1f5990b..c25718ac 100644 --- a/Kernel/drv/ne2000.c +++ b/Kernel/drv/ne2000.c @@ -6,8 +6,18 @@ #include #include #include +#include // === CONSTANTS === +#define MEM_START 0x40 +#define MEM_END 0xC0 +#define RX_FIRST (MEM_START) +#define RX_LAST (MEM_START+RX_BUF_SIZE-1) +#define RX_BUF_SIZE 0x40 +#define TX_FIRST (MEM_START+RX_BUF_SIZE) +#define TX_LAST (MEM_END) +#define TX_BUF_SIZE 0x40 + static const struct { Uint16 Vendor; Uint16 Device; @@ -18,7 +28,7 @@ static const struct { #define NUM_COMPAT_DEVICES (sizeof(csaCOMPAT_DEVICES)/sizeof(csaCOMPAT_DEVICES[0])) enum eNe2k_Page0Read { - COMMAND = 0, //!< the master command register + CMD = 0, //!< the master command register CLDA0, //!< Current Local DMA Address 0 CLDA1, //!< Current Local DMA Address 1 BNRY, //!< Boundary Pointer (for ringbuffer) @@ -32,7 +42,7 @@ enum eNe2k_Page0Read { }; enum eNe2k_Page0Write { - PTART = 1, //!< page start (init only) + PSTART = 1, //!< page start (init only) PSTOP, //!< page stop (init only) TPSR = 4, //!< transmit page start address TBCR0, //!< transmit byte count (low) @@ -54,14 +64,20 @@ typedef struct sNe2k_Card { int NextMemPage; //!< Next Card Memory page to use + Uint8 Buffer[RX_BUF_SIZE]; + char Name[2]; // "0" - tVFS_Node *Node; - char MacAddr[6]; + tVFS_Node Node; + Uint8 MacAddr[6]; } tCard; // === PROTOTYPES === int Ne2k_Install(char **Arguments); +char *Ne2k_ReadDir(tVFS_Node *Node, int Pos); +tVFS_Node *Ne2k_FindDir(tVFS_Node *Node, char *Name); Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); +Uint8 Ne2k_int_GetWritePage(tCard *Card, Uint16 Length); +void Ne2k_IRQHandler(int IntNum); // === GLOBALS === MODULE_DEFINE(0, 0x0032, Ne2k, Ne2k_Install, NULL, NULL); @@ -69,12 +85,15 @@ tDevFS_Driver gNe2k_DriverInfo = { NULL, "ne2k", { .NumACLs = 1, - .ACLs = &gVFS_ACL_EveryoneRW, - .Flags = VFS_FFLAG_DIRECTORY + .ACLs = &gVFS_ACL_EveryoneRX, + .Flags = VFS_FFLAG_DIRECTORY, + .ReadDir = Ne2k_ReadDir, + .FindDir = Ne2k_FindDir } }; Uint16 gNe2k_BaseAddress; int giNe2k_CardCount = 0; +tCard *gpNe2k_Cards = NULL; // === CODE === /** @@ -84,6 +103,7 @@ Uint16 gNe2k_BaseAddress; int Ne2k_Install(char **Options) { int i, j, k; + int count, id, base; // --- Scan PCI Bus --- // Count Cards @@ -107,10 +127,10 @@ int Ne2k_Install(char **Options) base = PCI_AssignPort( id, 0, 0x20 ); gpNe2k_Cards[ k ].IOBase = base; gpNe2k_Cards[ k ].IRQ = PCI_GetIRQ( id ); - gpNe2k_Cards[ k ].NextMemPage = 1; + gpNe2k_Cards[ k ].NextMemPage = 64; - //Install IRQ6 Handler - IRQ_Set(gpNe2k_Cards[ k ].IRQ, Ne2k_IRQHandler); + // Install IRQ Handler + IRQ_AddHandler(gpNe2k_Cards[ k ].IRQ, Ne2k_IRQHandler); // Reset Card outb( base + 0x1F, inb(base + 0x1F) ); @@ -118,7 +138,7 @@ int Ne2k_Install(char **Options) outb( base + ISR, 0x80 ); // Initialise Card - outb( base + COMMAND, 0x21 ); // No DMA and Stop + outb( base + CMD, 0x21 ); // No DMA and Stop outb( base + DCR, 0x49 ); // Set WORD mode outb( base + IMR, 0x00 ); outb( base + ISR, 0xFF ); @@ -128,7 +148,7 @@ int Ne2k_Install(char **Options) outb( base + RBCR1, 0 ); outb( base + RSAR0, 0 ); // Clear Source Address outb( base + RSAR1, 0 ); - outb( base + COMMAND, 0x0A ); // Remote Read, Start + outb( base + CMD, 0x0A ); // Remote Read, Start // Read MAC Address gpNe2k_Cards[ k ].MacAddr[0] = inb(base+0x10); inb(base+0x10); @@ -138,16 +158,15 @@ int Ne2k_Install(char **Options) gpNe2k_Cards[ k ].MacAddr[4] = inb(base+0x10); inb(base+0x10); gpNe2k_Cards[ k ].MacAddr[5] = inb(base+0x10); inb(base+0x10); - outb( base+PSTART, 0x60); // Set Receive Start - outb( base+BNRY, 0x7F); // Set Boundary Page - outb( base+PSTOP, 0x80); // Set Stop Page + outb( base+PSTART, RX_FIRST); // Set Receive Start + outb( base+BNRY, RX_LAST-1); // Set Boundary Page + outb( base+PSTOP, RX_LAST); // Set Stop Page outb( base+ISR, 0xFF ); // Clear all ints outb( base+CMD, 0x22 ); // No DMA, Start outb( base+IMR, 0x3F ); // Set Interupt Mask outb( base+RCR, 0x8F ); // Set WRAP and allow all packet matches outb( base+TCR, 0x00 ); // Set Normal Transmitter mode outb( base+TPSR, 0x40); // Set Transmit Start - // Set MAC Address /* Ne2k_WriteReg(base, MAC0, gpNe2k_Cards[ k ].MacAddr[0]); @@ -158,10 +177,9 @@ int Ne2k_Install(char **Options) Ne2k_WriteReg(base, MAC5, gpNe2k_Cards[ k ].MacAddr[5]); */ - Log("[NE2K]: Card #%i: IRQ=%i, Base=0x%x, ", - k, gpNe2k_Cards[ k ].IRQ, gpNe2k_Cards[ k ].PortBase, - gpNe2k_Cards[ k ].Buffer); - Log("MAC Address %x:%x:%x:%x:%x:%x\n", + Log("[NE2K]: Card #%i: IRQ=%i, IOBase=0x%x", + k, gpNe2k_Cards[ k ].IRQ, gpNe2k_Cards[ k ].IOBase); + Log("MAC Address %x:%x:%x:%x:%x:%x", gpNe2k_Cards[ k ].MacAddr[0], gpNe2k_Cards[ k ].MacAddr[1], gpNe2k_Cards[ k ].MacAddr[2], gpNe2k_Cards[ k ].MacAddr[3], gpNe2k_Cards[ k ].MacAddr[4], gpNe2k_Cards[ k ].MacAddr[5] @@ -170,17 +188,39 @@ int Ne2k_Install(char **Options) // Set VFS Node gpNe2k_Cards[ k ].Name[0] = '0'+k; gpNe2k_Cards[ k ].Name[1] = '\0'; - gpNe2k_Cards[ k ].Node.NumACLs = 1; - gpNe2k_Cards[ k ].Node.ACLs = gVFS_ACL_EveryoneRW; + gpNe2k_Cards[ k ].Node.ImplPtr = &gpNe2k_Cards[ k ]; + gpNe2k_Cards[ k ].Node.NumACLs = 0; // Root Only gpNe2k_Cards[ k ].Node.CTime = now(); gpNe2k_Cards[ k ].Node.Write = Ne2k_Write; } } + gNe2k_DriverInfo.RootNode.Size = giNe2k_CardCount; DevFS_AddDevice( &gNe2k_DriverInfo ); return 0; } +/** + * \fn char *Ne2k_ReadDir(tVFS_Node *Node, int Pos) + */ +char *Ne2k_ReadDir(tVFS_Node *Node, int Pos) +{ + char ret[2]; + if(Pos < 0 || Pos >= giNe2k_CardCount) return NULL; + ret[0] = '0'+Pos; + ret[1] = '\0'; + return strdup(ret); +} + +/** + * \fn tVFS_Node *Ne2k_FindDir(tVFS_Node *Node, char *Name) + */ +tVFS_Node *Ne2k_FindDir(tVFS_Node *Node, char *Name) +{ + if(Name[0] == '\0' || Name[1] != '\0') return NULL; + + return &gpNe2k_Cards[ Name[0]-'0' ].Node; +} /** * \fn Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) @@ -188,19 +228,27 @@ int Ne2k_Install(char **Options) Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) { tCard *Card = (tCard*)Node->ImplPtr; + Uint16 *buf = Buffer; + int rem = Length; // Sanity Check Length - if(Length > 0xFFFF) return 0; + if(Length > TX_BUF_SIZE) return 0; - outb(Card->IOBase + COMMAND, 0|0x22); // Page 0, Start, NoDMA + outb(Card->IOBase + CMD, 0|0x22); // Page 0, Start, NoDMA // Send Size - outb(Card->IOBase + RBCR0, Count & 0xFF); - outb(Card->IOBase + RBCR1, Count >> 8); + outb(Card->IOBase + RBCR0, Length & 0xFF); + outb(Card->IOBase + RBCR1, Length >> 8); // Clear Remote DMA Flag outb(Card->IOBase + ISR, 0x40); // Bit 6 // Set up transfer outb(Card->IOBase + RSAR0, 0x00); // Page Offset outb(Card->IOBase + RSAR1, Ne2k_int_GetWritePage(Card, Length)); // Page Offset + // Start + outb(Card->IOBase + CMD, 0|0x12); // Page 0, Start, DMA + + // Send Data + for(rem = Length; rem; rem -= 2) + outw(Card->IOBase + 0x10, *buf++); return 0; } @@ -209,5 +257,19 @@ Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) */ Uint8 Ne2k_int_GetWritePage(tCard *Card, Uint16 Length) { + Uint8 ret = Card->NextMemPage; + + Card->NextMemPage += (Length + 0xFF) >> 8; + if(Card->NextMemPage >= TX_LAST) { + Card->NextMemPage -= TX_BUF_SIZE; + } + return ret; +} + +/** + * \fn void Ne2k_IRQHandler(int IntNum) + */ +void Ne2k_IRQHandler(int IntNum) +{ } diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 1e7138d3..0f5cf8cf 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -593,25 +593,54 @@ void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll ) # include "vterm_font_8x16.h" #endif +// === PROTOTYPES === +Uint8 *VT_Font_GetChar(Uint32 Codepoint); -int VT_Font_GetWidth(Uint32 Codepoint) -{ - return FONT_WIDTH; -} -int VT_Font_GetHeight(Uint32 Codepoint) +// === GLOBALS === +int giVT_CharWidth = FONT_WIDTH; +int giVT_CharHeight = FONT_HEIGHT; + +// === CODE === +/** + * \fn void VT_Font_Render(Uint32 Codepoint, void *Buffer, int Pitch, Uint32 BGC, Uint32 FGC) + * \brief Render a font character + */ +void VT_Font_Render(Uint32 Codepoint, void *Buffer, int Pitch, Uint32 BGC, Uint32 FGC) { - return FONT_HEIGHT; + Uint8 *font; + Uint32 *buf = Buffer; + int x, y; + font = VT_Font_GetChar(Codepoint); + + for(y = 0; y < FONT_HEIGHT; y ++) + { + for(x = 0; x < FONT_WIDTH; x ++) + { + if(*font & (1 << (FONT_WIDTH-x))) + buf[x] = FGC; + else + buf[x] = BGC; + } + buf += Pitch; + font ++; + } } /** - * \fn void VT_Font_Render(Uint32 Codepoint, void *Buffer, Uint32 BGC, Uint32 FGC) - * \brief Render a font character + * \fn Uint32 VT_Colour12to24(Uint16 Col12) + * \brief Converts a */ -void VT_Font_Render(Uint32 Codepoint, void *Buffer, Uint32 BGC, Uint32 FGC) +Uint32 VT_Colour12to24(Uint16 Col12) { - //Uint8 *font; - //Uint32 *buf = Buffer; - //font = VT_Font_GetChar(Codepoint); + Uint32 ret; + int tmp; + tmp = Col12 & 0xF; + ret = (tmp << 0) | (tmp << 4); + tmp = (Col12 & 0xF0) >> 4; + ret |= (tmp << 8) | (tmp << 12); + tmp = (Col12 & 0xF00) >> 8; + ret |= (tmp << 16) | (tmp << 20); + return ret; } /** @@ -646,3 +675,8 @@ Uint8 *VT_Font_GetChar(Uint32 Codepoint) return &VTermFont[index*FONT_HEIGHT]; } + +EXPORTAS(&giVT_CharWidth, giVT_CharWidth); +EXPORTAS(&giVT_CharHeight, giVT_CharHeight); +EXPORT(VT_Font_Render); +EXPORT(VT_Colour12to24); diff --git a/Kernel/include/common.h b/Kernel/include/common.h index 590295f5..f3401346 100644 --- a/Kernel/include/common.h +++ b/Kernel/include/common.h @@ -43,7 +43,7 @@ typedef struct sKernelSymbol { // === FUNCTIONS === // --- Core --- extern void System_Init(char *ArgString); -extern int IRQ_AddHandler(int Num, void (*Callback)(void)); +extern int IRQ_AddHandler(int Num, void (*Callback)(int)); // --- Debug --- extern void Panic(char *Msg, ...); extern void Warning(char *Msg, ...); @@ -125,6 +125,8 @@ extern int Threads_GetUID(); extern int Threads_GetGID(); extern int SpawnTask(tThreadFunction Function, void *Arg); extern Uint *Threads_GetCfgPtr(int Id); +// --- Simple Math --- +extern int DivUp(int num, int dem); #include #include diff --git a/Kernel/include/drv_pci.h b/Kernel/include/drv_pci.h index b6a1b072..b5394301 100644 --- a/Kernel/include/drv_pci.h +++ b/Kernel/include/drv_pci.h @@ -37,5 +37,6 @@ extern Uint32 PCI_GetBAR1(int id); extern Uint32 PCI_GetBAR3(int id); extern Uint32 PCI_GetBAR4(int id); extern Uint32 PCI_GetBAR5(int id); +extern Uint16 PCI_AssignPort(int id, int bar, int count); #endif diff --git a/Kernel/include/syscalls.h b/Kernel/include/syscalls.h index 743a1ca3..a615c37d 100644 --- a/Kernel/include/syscalls.h +++ b/Kernel/include/syscalls.h @@ -55,6 +55,7 @@ enum eSyscalls { SYS_TELL, // 77 - Return the current file position SYS_CHDIR, // 78 - Change current directory SYS_GETCWD, // 79 - Get current directory + SYS_MOUNT, // 80 - Mount a filesystem NUM_SYSCALLS, SYS_DEBUG = 0x100 // 0x100 - Print a debug string }; @@ -73,6 +74,6 @@ static const char *cSYSCALL_NAMES[] = { "","","","","SYS_OPEN","SYS_REOPEN", "SYS_CLOSE","SYS_READ","SYS_WRITE","SYS_IOCTL","SYS_READDIR","SYS_MKDIR", "SYS_SYMLINK","SYS_GETACL","SYS_SETACL","SYS_FINFO","SYS_SEEK","SYS_TELL", - "SYS_CHDIR","SYS_GETCWD","" + "SYS_CHDIR","SYS_GETCWD","SYS_MOUNT","" }; #endif diff --git a/Kernel/include/syscalls.inc.asm b/Kernel/include/syscalls.inc.asm index c33cd340..9f3973af 100644 --- a/Kernel/include/syscalls.inc.asm +++ b/Kernel/include/syscalls.inc.asm @@ -51,3 +51,4 @@ %define SYS_TELL 77 ; Return the current file position %define SYS_CHDIR 78 ; Change current directory %define SYS_GETCWD 79 ; Get current directory +%define SYS_MOUNT 80 ; Mount a filesystem diff --git a/Kernel/include/tpl_drv_video.h b/Kernel/include/tpl_drv_video.h index 8f22c97d..51f6ea94 100644 --- a/Kernel/include/tpl_drv_video.h +++ b/Kernel/include/tpl_drv_video.h @@ -51,8 +51,13 @@ struct sVideo_IOCtl_Mode { short id; //!< Mide ID Uint16 width; //!< Width Uint16 height; //!< Height - Uint16 bpp; //!< Bits per Pixel + Uint8 bpp; //!< Bits per Pixel + Uint8 flags; //!< Mode Flags }; +#define VIDEO_FLAG_TEXT 0x1 //!< Text Mode +#define VIDEO_FLAG_SLOW 0x2 //!< Non-accelerated mode +/** + */ struct sVideo_IOCtl_Pos { Sint16 x; Sint16 y; @@ -81,4 +86,9 @@ typedef struct sVT_Char tVT_Char; #define VT_COL_LTGREY 0x0CCC #define VT_COL_WHITE 0x0FFF +extern int giVT_CharWidth; +extern int giVT_CharHeight; +extern void VT_Font_Render(Uint32 Codepoint, void *Buffer, int Pitch, Uint32 BGC, Uint32 FGC); +extern Uint32 VT_Colour12to24(Uint16 Col12); + #endif diff --git a/Kernel/include/vfs.h b/Kernel/include/vfs.h index 4ba3f452..025a5262 100644 --- a/Kernel/include/vfs.h +++ b/Kernel/include/vfs.h @@ -79,7 +79,7 @@ typedef struct sVFS_Node { typedef struct sVFS_Driver { char *Name; Uint Flags; - tVFS_Node *(*InitDevice)(char *Device, char *Options); + tVFS_Node *(*InitDevice)(char *Device, char **Options); void (*Unmount)(tVFS_Node *Node); struct sVFS_Driver *Next; } tVFS_Driver; diff --git a/Kernel/lib.c b/Kernel/lib.c index 3399d3d8..68d48a6a 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -159,6 +159,17 @@ char *strdup(char *str) return ret; } +/** + * \fn int DivUp(int num, int dem) + * \brief Divide two numbers, rounding up + * \param num Numerator + * \param dem Denominator + */ +int DivUp(int num, int dem) +{ + return (num+dem-1)/dem; +} + /** * \fn int strpos8(char *str, Uint32 search) * \brief Search a string for a UTF-8 character diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index 5774dbe5..8d17e74d 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -152,6 +152,14 @@ void SyscallHandler(tSyscallRegs *Regs) VFS_Close( Regs->Arg1 ); break; + case SYS_SEEK: + ret = VFS_Seek( Regs->Arg1, Regs->Arg2, Regs->Arg3); + break; + + case SYS_TELL: + ret = VFS_Tell( Regs->Arg1 ); + break; + case SYS_WRITE: #if BITS < 64 ret = VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); @@ -202,6 +210,36 @@ void SyscallHandler(tSyscallRegs *Regs) ret = VFS_ChDir( (void*)Regs->Arg1 ); break; + // IO Control + case SYS_IOCTL: + ret = VFS_IOCtl( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); + break; + + // Mount a filesystem + case SYS_MOUNT: + // Only root can mount filesystems + if(Threads_GetUID() != 0) { + err = -EACCES; + ret = -1; + break; + } + // Sanity check the paths + if(!Syscall_ValidString(Regs->Arg1) + || !Syscall_ValidString(Regs->Arg2) + || !Syscall_ValidString(Regs->Arg3) + || !Syscall_ValidString(Regs->Arg4) ) { + err = -EINVAL; + ret = -1; + break; + } + ret = VFS_Mount( + (char*)Regs->Arg1, // Device + (char*)Regs->Arg2, // Mount point + (char*)Regs->Arg3, // Filesystem + (char*)Regs->Arg4 // Options + ); + break; + // -- Debug case SYS_DEBUG: Log((char*)Regs->Arg1, diff --git a/Kernel/syscalls.lst b/Kernel/syscalls.lst index 8b38f78d..9b4920a0 100644 --- a/Kernel/syscalls.lst +++ b/Kernel/syscalls.lst @@ -56,3 +56,4 @@ SYS_SEEK Seek to a new position in the file SYS_TELL Return the current file position SYS_CHDIR Change current directory SYS_GETCWD Get current directory +SYS_MOUNT Mount a filesystem diff --git a/Kernel/vfs/fs/devfs.c b/Kernel/vfs/fs/devfs.c index 9bb60ab6..6ead47e5 100644 --- a/Kernel/vfs/fs/devfs.c +++ b/Kernel/vfs/fs/devfs.c @@ -9,7 +9,7 @@ // === PROTOTYPES === int DevFS_AddDevice(tDevFS_Driver *Dev); -tVFS_Node *DevFS_InitDevice(char *Device, char *Options); +tVFS_Node *DevFS_InitDevice(char *Device, char **Options); char *DevFS_ReadDir(tVFS_Node *Node, int Pos); tVFS_Node *DevFS_FindDir(tVFS_Node *Node, char *Name); @@ -41,11 +41,11 @@ int DevFS_AddDevice(tDevFS_Driver *Dev) } /** - * \fn tVFS_Node *DevFS_InitDevice(char *Device, char *Options) + * \fn tVFS_Node *DevFS_InitDevice(char *Device, char **Options) * \brief Initialise the DevFS and detect double-mounting, or just do nothing * \stub */ -tVFS_Node *DevFS_InitDevice(char *Device, char *Options) +tVFS_Node *DevFS_InitDevice(char *Device, char **Options) { return &gDevFS_RootNode; } diff --git a/Kernel/vfs/fs/ext2.c b/Kernel/vfs/fs/ext2.c index 78c115ed..06189f88 100644 --- a/Kernel/vfs/fs/ext2.c +++ b/Kernel/vfs/fs/ext2.c @@ -7,15 +7,17 @@ * \brief Second Extended Filesystem Driver * \todo Implement file read support */ +#define DEBUG 1 #include #include +#include #include "fs_ext2.h" // === STRUCTURES === typedef struct { int FD; int CacheID; - vfs_node RootNode; + tVFS_Node RootNode; tExt2_SuperBlock SuperBlock; int BlockSize; @@ -25,35 +27,40 @@ typedef struct { } tExt2_Disk; // === PROTOTYPES === -//Interface Functions + int Ext2_Install(char **Arguments); +// Interface Functions tVFS_Node *Ext2_InitDevice(char *Device, char **Options); -void Ext2_UnMount(tVFS_Node *Node); +void Ext2_Unmount(tVFS_Node *Node); Uint64 Ext2_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer); Uint64 Ext2_Write(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer); +void Ext2_CloseFile(tVFS_Node *Node); char *Ext2_ReadDir(tVFS_Node *Node, int Pos); tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *FileName); -tVFS_Node *Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags); - int Ext2_int_GetInode(vfs_node *Node, tExt2_Inode *Inode); -tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeId, char *Name, Uint64 VfsInode); + int Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags); +// Internal Helpers + int Ext2_int_GetInode(tVFS_Node *Node, tExt2_Inode *Inode); +tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeId, char *Name); int Ext2_int_ReadInode(tExt2_Disk *Disk, Uint InodeId, tExt2_Inode *Inode); Uint64 Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum); // === SEMI-GLOBALS === +MODULE_DEFINE(0, 0x5B /*v0.90*/, EXT2, Ext2_Install, NULL); tExt2_Disk gExt2_disks[6]; int giExt2_count = 0; -tVFS_Driver gExt2_FSInfo = {NULL, - "ext2", 0, Ext2_InitDevice, Ext2_UnMount, NULL +tVFS_Driver gExt2_FSInfo = { + "ext2", 0, Ext2_InitDevice, Ext2_Unmount, NULL }; // === CODE === /** - * \fn void Ext2_Install() + * \fn int Ext2_Install(char **Arguments) * \brief Install the Ext2 Filesystem Driver */ -void Ext2_Install() +int Ext2_Install(char **Arguments) { VFS_AddDriver( &gExt2_FSInfo ); + return 1; } /** @@ -74,7 +81,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options) // Open Disk fd = VFS_Open(Device, VFS_OPENFLAG_READ|VFS_OPENFLAG_WRITE); //Open Device if(fd == -1) { - Warning"[EXT2] Unable to open '%s'\n", Device); + Warning("[EXT2] Unable to open '%s'\n", Device); return NULL; } @@ -83,7 +90,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options) // Sanity Check Magic value if(sb.s_magic != 0xEF53) { - WarningEx("EXT2", "Volume '%s' is not an EXT2 volume\n", Device); + Warning("[EXT2 ] Volume '%s' is not an EXT2 volume\n", Device); VFS_Close(fd); return NULL; } @@ -94,7 +101,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options) // Allocate Disk Information disk = malloc(sizeof(tExt2_Disk) + sizeof(tExt2_Group)*groupCount); - disk->fd = fd; + disk->FD = fd; memcpy(&disk->SuperBlock, &sb, 1024); disk->GroupCount = groupCount; @@ -106,7 +113,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options) disk->BlockSize = 1024 << sb.s_log_block_size; // Read Group Information - VFS_ReadAt(disk->fd, + VFS_ReadAt(disk->FD, sb.s_first_data_block * disk->BlockSize + 1024, sizeof(tExt2_Group)*groupCount, disk->Groups); @@ -126,7 +133,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options) Ext2_int_ReadInode(disk, 2, &inode); // Create Root Node - memset(&disk->RootNode, 0, sizeof(vfs_node)); + memset(&disk->RootNode, 0, sizeof(tVFS_Node)); disk->RootNode.Inode = 2; // Root inode ID disk->RootNode.ImplPtr = disk; // Save disk pointer disk->RootNode.Size = -1; // Fill in later (on readdir) @@ -158,7 +165,7 @@ void Ext2_Unmount(tVFS_Node *Node) { tExt2_Disk *disk = Node->ImplPtr; - VFS_Close( disk->fd ); + VFS_Close( disk->FD ); Inode_ClearCache( disk->CacheID ); memset(disk, 0, sizeof(tExt2_Disk)+disk->GroupCount*sizeof(tExt2_Group)); free(disk); @@ -186,13 +193,13 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) // Read only block if(Length <= disk->BlockSize - Offset) { - VFS_ReadAt( disk->fd, base+Offset, Length, Buffer); + VFS_ReadAt( disk->FD, base+Offset, Length, Buffer); return Length; } // Read first block remLen = Length; - VFS_ReadAt( disk->fd, base + Offset, disk->BlockSize - Offset, Buffer); + VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer); remLen -= disk->BlockSize - Offset; Buffer += disk->BlockSize - Offset; block ++; @@ -201,7 +208,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) while(remLen > disk->BlockSize) { base = Ext2_int_GetBlockAddr(disk, inode.i_block, block); - VFS_ReadAt( disk->fd, base, disk->BlockSize, Buffer); + VFS_ReadAt( disk->FD, base, disk->BlockSize, Buffer); Buffer += disk->BlockSize; remLen -= disk->BlockSize; block ++; @@ -209,7 +216,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) // Read last block base = Ext2_int_GetBlockAddr(disk, inode.i_block, block); - VFS_ReadAt( disk->fd, base, remLen, Buffer); + VFS_ReadAt( disk->FD, base, remLen, Buffer); return Length; } @@ -247,13 +254,13 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) // Write only block (if only one) if(Offset + retLen <= disk->BlockSize) { - VFS_WriteAt(disk->fd, base+Offset, retLen, Buffer); + VFS_WriteAt(disk->FD, base+Offset, retLen, Buffer); if(bNewBlocks) return Length; goto addBlocks; // Ugh! A goto, but it seems unavoidable } // Write First Block - VFS_WriteAt(disk->fd, base+Offset, disk->BlockSize-Offset, Buffer); + VFS_WriteAt(disk->FD, base+Offset, disk->BlockSize-Offset, Buffer); Buffer += disk->BlockSize-Offset; retLen -= disk->BlockSize-Offset; block ++; @@ -262,7 +269,7 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) while(retLen > disk->BlockSize) { base = Ext2_int_GetBlockAddr(disk, inode.i_block, block); - VFS_WriteAt(disk->fd, base, disk->BlockSize, Buffer); + VFS_WriteAt(disk->FD, base, disk->BlockSize, Buffer); Buffer += disk->BlockSize; retLen -= disk->BlockSize; block ++; @@ -270,26 +277,26 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) // Write last block base = Ext2_int_GetBlockAddr(disk, inode.i_block, block); - VFS_WriteAt(disk->fd, base, retLen, Buffer); + VFS_WriteAt(disk->FD, base, retLen, Buffer); if(bNewBlocks) return Length; // Writing in only allocated space } addBlocks: ///\todo Implement block allocation - WarningEx("EXT2", "File extending is not yet supported"); + Warning("[EXT2] File extending is not yet supported"); return 0; } /** - * \fn int Ext2_CloseFile(vfs_node *Node) + * \fn void Ext2_CloseFile(vfs_node *Node) * \brief Close a file (Remove it from the cache) */ -int Ext2_CloseFile(tVFS_Node *Node) +void Ext2_CloseFile(tVFS_Node *Node) { tExt2_Disk *disk = Node->ImplPtr; - inode_uncacheNode(disk->CacheID, Node->impl); - return 1; + Inode_UncacheNode(disk->CacheID, Node->Inode); + return ; } /** @@ -305,8 +312,6 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos) int block = 0, ofs = 0; int entNum = 0; tExt2_Disk *disk = Node->ImplPtr; - Uint64 vfsInode = 0; - tVFS_Node *retNode; Uint size; ENTER("pNode iPos", Node, Pos); @@ -323,7 +328,7 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos) Base = inode.i_block[0] * disk->BlockSize; while(Pos -- && size > 0) { - VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent); + VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent); ofs += dirent.rec_len; size -= dirent.rec_len; entNum ++; @@ -331,8 +336,8 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos) if(ofs >= disk->BlockSize) { block ++; if( ofs > disk->BlockSize ) { - Warning("[EXT2] Directory Entry %i of inode %i ('%s') extends over a block boundary, ignoring\n", - entNum-1, Node->impl, Node->name); + Warning("[EXT2] Directory Entry %i of inode %i extends over a block boundary, ignoring\n", + entNum-1, Node->Inode); } ofs = 0; Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block ); @@ -342,17 +347,17 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos) if(size <= 0) return NULL; // Read Entry - VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent ); + VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent ); //LOG(" Ext2_ReadDir: dirent.inode = %i\n", dirent.inode); //LOG(" Ext2_ReadDir: dirent.rec_len = %i\n", dirent.rec_len); //LOG(" Ext2_ReadDir: dirent.name_len = %i\n", dirent.name_len); - VFS_ReadAt( disk->fd, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf ); + VFS_ReadAt( disk->FD, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf ); namebuf[ dirent.name_len ] = '\0'; // Cap off string // Ignore . and .. (these are done in the VFS) if( (namebuf[0] == '.' && namebuf[1] == '\0') - || (namebuf[0] == '.' && namebuf[1] == '.' && namebuf[2]=='\0')) + || (namebuf[0] == '.' && namebuf[1] == '.' && namebuf[2]=='\0')) { LEAVE('p', VFS_SKIP); return VFS_SKIP; // Skip } @@ -390,8 +395,8 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename) // Find File while(size > 0) { - VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent); - VFS_ReadAt( disk->fd, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf ); + VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent); + VFS_ReadAt( disk->FD, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf ); namebuf[ dirent.name_len ] = '\0'; // Cap off string // If it matches, create a node and return it if(strcmp(namebuf, Filename) == 0) @@ -405,8 +410,8 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename) if(ofs >= disk->BlockSize) { block ++; if( ofs > disk->BlockSize ) { - Warnin("[EXT2 ] Directory Entry %i of inode %i ('%s') extends over a block boundary, ignoring\n", - entNum-1, Node->impl, Node->name); + Warning("[EXT2 ] Directory Entry %i of inode %i extends over a block boundary, ignoring\n", + entNum-1, Node->Inode); } ofs = 0; Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block ); @@ -417,10 +422,10 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename) } /** - * \fn tVFS_Node *Ext2_MkNod(tVFS_Node *Parent, char *Name, int Flags) + * \fn int Ext2_MkNod(tVFS_Node *Parent, char *Name, Uint Flags) * \brief Create a new node */ -tVFS_Node *Ext2_MkNod(tVFS_Node *Parent, char *Name, int Flags) +int Ext2_MkNod(tVFS_Node *Parent, char *Name, Uint Flags) { return 0; } @@ -455,7 +460,7 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name) if( !Ext2_int_ReadInode(Disk, InodeID, &inode) ) return NULL; - if( (tmpNode = inode_getCache(Disk->CacheID, InodeID)) ) + if( (tmpNode = Inode_GetCache(Disk->CacheID, InodeID)) ) return tmpNode; @@ -485,11 +490,11 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name) break; // Regular File case EXT2_S_IFREG: - retNode.flags = 0; + retNode.Flags = 0; break; // Directory case EXT2_S_IFDIR: - retNode.ReadRir = Ext2_ReadDir; + retNode.ReadDir = Ext2_ReadDir; retNode.FindDir = Ext2_FindDir; retNode.MkNod = Ext2_MkNod; //retNode.Relink = Ext2_Relink; @@ -497,12 +502,12 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name) break; // Unknown, Write protect and hide it to be safe default: - retNode.flags = VFS_FFLAG_READONLY|VFS_FFLAG_HIDDEN; + retNode.Flags = VFS_FFLAG_READONLY;//|VFS_FFLAG_HIDDEN; break; } // Check if the file should be hidden - if(Name[0] == '.') retNode.Flags |= VFS_FFLAG_HIDDEN; + //if(Name[0] == '.') retNode.Flags |= VFS_FFLAG_HIDDEN; // Set Timestamps retNode.ATime = now(); @@ -532,11 +537,11 @@ int Ext2_int_ReadInode(tExt2_Disk *Disk, Uint InodeId, tExt2_Inode *Inode) //LogF(" Ext2_int_ReadInode: group=%i, subId = %i\n", group, subId); - //Seek to Block - Absolute - vfs_seek(Disk->fd, Disk->Groups[group].bg_inode_table * Disk->BlockSize, SEEK_SET); - //Seeek to inode - Relative - vfs_seek(Disk->fd, sizeof(tExt2_Inode)*subId, SEEK_CUR); - vfs_read(Disk->fd, sizeof(tExt2_Inode), Inode); + // Read Inode + VFS_ReadAt(Disk->FD, + Disk->Groups[group].bg_inode_table * Disk->BlockSize + sizeof(tExt2_Inode)*subId, + sizeof(tExt2_Inode), + Inode); return 1; } @@ -556,7 +561,7 @@ Uint64 Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum) // Single Indirect Blocks iBlocks = malloc( Disk->BlockSize ); - VFS_ReadAt(Disk->fd, (Uint64)Blocks[12]*Disk->BlockSize, Disk->BlockSize, iBlocks); + VFS_ReadAt(Disk->FD, (Uint64)Blocks[12]*Disk->BlockSize, Disk->BlockSize, iBlocks); BlockNum -= 12; if(BlockNum < 256) { @@ -568,16 +573,16 @@ Uint64 Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum) // Double Indirect Blocks if(BlockNum < 256*256) { - VFS_ReadAt(Disk->fd, (Uint64)Blocks[13]*Disk->BlockSize, Disk->BlockSize, iBlocks); - VFS_ReadAt(Disk->fd, (Uint64)iBlocks[BlockNum/256]*Disk->BlockSize, Disk->BlockSize, iBlocks); + VFS_ReadAt(Disk->FD, (Uint64)Blocks[13]*Disk->BlockSize, Disk->BlockSize, iBlocks); + VFS_ReadAt(Disk->FD, (Uint64)iBlocks[BlockNum/256]*Disk->BlockSize, Disk->BlockSize, iBlocks); BlockNum = iBlocks[BlockNum%256]; free(iBlocks); return (Uint64)BlockNum * Disk->BlockSize; } // Triple Indirect Blocks - VFS_ReadAt(Disk->fd, (Uint64)Blocks[14]*Disk->BlockSize, Disk->BlockSize, iBlocks); - VFS_ReadAt(Disk->fd, (Uint64)iBlocks[BlockNum/(256*256)]*Disk->BlockSize, Disk->BlockSize, iBlocks); - VFS_ReadAt(Disk->fd, (Uint64)iBlocks[(BlockNum/256)%256]*Disk->BlockSize, Disk->BlockSize, iBlocks); + VFS_ReadAt(Disk->FD, (Uint64)Blocks[14]*Disk->BlockSize, Disk->BlockSize, iBlocks); + VFS_ReadAt(Disk->FD, (Uint64)iBlocks[BlockNum/(256*256)]*Disk->BlockSize, Disk->BlockSize, iBlocks); + VFS_ReadAt(Disk->FD, (Uint64)iBlocks[(BlockNum/256)%256]*Disk->BlockSize, Disk->BlockSize, iBlocks); BlockNum = iBlocks[BlockNum%256]; free(iBlocks); return (Uint64)BlockNum * Disk->BlockSize; diff --git a/Kernel/vfs/fs/fat.c b/Kernel/vfs/fs/fat.c index 01c90c24..d70fae0c 100644 --- a/Kernel/vfs/fs/fat.c +++ b/Kernel/vfs/fs/fat.c @@ -25,7 +25,7 @@ typedef struct s_lfncache { // === PROTOTYPES === int FAT_Install(char **Arguments); -tVFS_Node *FAT_InitDevice(char *device, char *options); +tVFS_Node *FAT_InitDevice(char *device, char **options); void FAT_Unmount(tVFS_Node *Node); Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer); Uint64 FAT_Write(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer); @@ -36,7 +36,7 @@ tVFS_Node *FAT_FindDir(tVFS_Node *dirNode, char *file); void FAT_CloseFile(tVFS_Node *node); // === SEMI-GLOBALS === -MODULE_DEFINE(0, 0x5B /*v0.90*/, FAT32, FAT_Install, NULL); +MODULE_DEFINE(0, 0x51 /*v0.80*/, FAT32, FAT_Install, NULL); tFAT_VolInfo gFAT_Disks[8]; int giFAT_PartCount = 0; #if CACHE_FAT @@ -61,10 +61,10 @@ int FAT_Install(char **Arguments) } /** - * \fn tVFS_Node *FAT_InitDevice(char *Device, char *options) + * \fn tVFS_Node *FAT_InitDevice(char *Device, char **options) * \brief Reads the boot sector of a disk and prepares the structures for it */ -tVFS_Node *FAT_InitDevice(char *Device, char *options) +tVFS_Node *FAT_InitDevice(char *Device, char **options) { fat_bootsect *bs; int i; diff --git a/Kernel/vfs/fs/root.c b/Kernel/vfs/fs/root.c index e27c6368..7a1dade3 100644 --- a/Kernel/vfs/fs/root.c +++ b/Kernel/vfs/fs/root.c @@ -9,7 +9,7 @@ #define MAX_FILES 64 // === PROTOTYPES === -tVFS_Node *Root_InitDevice(char *Device, char *Options); +tVFS_Node *Root_InitDevice(char *Device, char **Options); int Root_MkNod(tVFS_Node *Node, char *Name, Uint Flags); tVFS_Node *Root_FindDir(tVFS_Node *Node, char *Name); char *Root_ReadDir(tVFS_Node *Node, int Pos); @@ -33,10 +33,10 @@ tVFS_ACL RootFS_ACLs[3] = { // === CODE === /** - * \fn tVFS_Node *Root_InitDevice(char *Device, char *Options) + * \fn tVFS_Node *Root_InitDevice(char *Device, char **Options) * \brief Initialise the root filesystem */ -tVFS_Node *Root_InitDevice(char *Device, char *Options) +tVFS_Node *Root_InitDevice(char *Device, char **Options) { tRamFS_File *root; if(strcmp(Device, "root") != 0) { diff --git a/Kernel/vfs/main.c b/Kernel/vfs/main.c index bfa1fc1c..3d1f8e58 100644 --- a/Kernel/vfs/main.c +++ b/Kernel/vfs/main.c @@ -43,9 +43,12 @@ int VFS_Init() char *VFS_GetTruePath(char *Path) { tVFS_Node *node; - char *ret; + char *ret, *tmp; - node = VFS_ParsePath(Path, &ret); + tmp = VFS_GetAbsPath(Path); + if(tmp == NULL) return NULL; + node = VFS_ParsePath(tmp, &ret); + free(tmp); if(!node) return NULL; if(node->Close) node->Close(node); diff --git a/Kernel/vfs/mount.c b/Kernel/vfs/mount.c index f49c7212..c4ab833e 100644 --- a/Kernel/vfs/mount.c +++ b/Kernel/vfs/mount.c @@ -60,7 +60,7 @@ int VFS_Mount(char *Device, char *MountPoint, char *Filesystem, char *ArgString) memcpy( mnt->Options, ArgString, argLen+1 ); // Initialise Volume - mnt->RootNode = fs->InitDevice(Device, ArgString); + mnt->RootNode = fs->InitDevice(Device, NULL); //&ArgString); if(!mnt->RootNode) { free(mnt); return -2; diff --git a/Kernel/vfs/open.c b/Kernel/vfs/open.c index 1408655c..a1245f3b 100644 --- a/Kernel/vfs/open.c +++ b/Kernel/vfs/open.c @@ -73,6 +73,7 @@ char *VFS_GetAbsPath(char *Path) strcpy(ret, cwd); ret[cwdLen] = '/'; strcpy(&ret[cwdLen+1], Path); + //Log("ret = '%s'\n", ret); } // Parse Path @@ -143,7 +144,7 @@ char *VFS_GetAbsPath(char *Path) ret[iPos2] = 0; LEAVE('s', ret); - Log("VFS_GetAbsPath: RETURN '%s'", ret); + //Log("VFS_GetAbsPath: RETURN '%s'", ret); return ret; } @@ -220,7 +221,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) // Sanity Check /*if(!longestMount) { - Log("VFS_GetTruePath - ERROR: No Root Node\n"); + Log("VFS_ParsePath - ERROR: No Root Node\n"); return NULL; }*/ @@ -256,7 +257,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) free(*TruePath); *TruePath = NULL; } - Log("Permissions fail on '%s'", Path); + //Log("Permissions fail on '%s'", Path); LEAVE('n'); return NULL; } @@ -269,7 +270,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) *TruePath = NULL; } Path[nextSlash] = '/'; - Log("FindDir fail on '%s'", Path); + //Log("FindDir fail on '%s'", Path); LEAVE('n'); return NULL; } @@ -288,7 +289,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) free(*TruePath); *TruePath = NULL; } - Log("Child fail on '%s' ('%s)", Path, &Path[ofs]); + //Log("Child fail on '%s' ('%s)", Path, &Path[ofs]); Path[nextSlash] = '/'; LEAVE('n'); return NULL; @@ -466,7 +467,6 @@ int VFS_Open(char *Path, Uint Mode) if( MM_GetPhysAddr( (Uint)gaUserHandles ) == 0 ) { Uint addr, size; - Log("Allocating %i user handles", CFGINT(CFG_VFS_MAXFILES)); size = CFGINT(CFG_VFS_MAXFILES) * sizeof(tVFS_Handle); for(addr = 0; addr < size; addr += 0x1000) MM_Allocate( (Uint)gaUserHandles + addr ); @@ -573,7 +573,7 @@ int VFS_ChDir(char *New) // Set new CFGPTR(CFG_VFS_CWD) = buf; - //Log("Updated CWD to '%s'", buf); + Log("Updated CWD to '%s'", buf); return 1; } diff --git a/Makefile.cfg b/Makefile.cfg index 65d3fa04..57adb851 100644 --- a/Makefile.cfg +++ b/Makefile.cfg @@ -8,8 +8,14 @@ AS = nasm OBJDUMP = objdump RM = @rm -f STRIP = strip +MKDIR = mkdir +RMDIR = rm -rf ARCH = i386 ARCHDIR = x86 +DRIVERS = ata_x86 ne2000 +# fdd + DISTROOT = /mnt/AcessHDD/Acess2 +ACESSDIR = /home/hodgeja/Projects/Acess2 diff --git a/Usermode/Applications/CLIShell_src/main.c b/Usermode/Applications/CLIShell_src/main.c index 2e51419f..d6c40d65 100644 --- a/Usermode/Applications/CLIShell_src/main.c +++ b/Usermode/Applications/CLIShell_src/main.c @@ -17,18 +17,17 @@ void Parse_Args(char *str, char **dest); void CallCommand(char **Args); void Command_Logout(int argc, char **argv); void Command_Clear(int argc, char **argv); -void Command_Colour(int argc, char **argv); +void Command_Help(int argc, char **argv); void Command_Cd(int argc, char **argv); void Command_Dir(int argc, char **argv); // ==== CONSTANT GLOBALS ==== -char *cCOLOUR_NAMES[8] = {"black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"}; struct { char *name; void (*fcn)(int argc, char **argv); } cBUILTINS[] = { {"exit", Command_Logout}, {"logout", Command_Logout}, - {"colour", Command_Colour}, {"clear", Command_Clear}, + {"help", Command_Help}, {"clear", Command_Clear}, {"cd", Command_Cd}, {"dir", Command_Dir} }; static char *cDEFAULT_PATH[] = {"/Acess/Bin"}; @@ -77,8 +76,9 @@ int main(int argc, char *argv[], char *envp[]) if(saArgs[0]) free(saArgs); if(!bCached) free(sCommandStr); bCached = 0; + write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory); - write(_stdout, 3, "$ "); + write(_stdout, 2, "$ "); // Read Command line sCommandStr = ReadCommandLine( &length ); @@ -135,6 +135,7 @@ char *ReadCommandLine(int *Length) char *ret; int len, pos, space = 1023; char ch; + // int scrollbackPos = giLastCommand; // Preset Variables ret = malloc( space+1 ); @@ -149,14 +150,43 @@ char *ReadCommandLine(int *Length) read(_stdin, 1, &ch); // Read control character switch(ch) { - case 'D': if(pos) pos--; break; - case 'C': if(pos 0 ) break; + + free(ret); + ret = strdup( gasCommandHistory[--scrollbackPos] ); + + len = strlen(ret); + while(pos--) write(_stdout, 3, "\x1B[D"); + while(pos++ < len) write(_stdout, 3, "\x1B[C"); + break; + case 'B': // Down + if( scrollbackPos < giLastCommand-1 ) break; + free(ret); + ret = strdup( gasCommandHistory[++scrollbackPos] ); + + len = strlen(ret); + while(pos--) write(_stdout, 3, "\x1B[D"); + while(pos++ < len) write(_stdout, 3, "\x1B[C"); + break; + #endif + case 'D': // Left + if(pos == 0) break; + pos --; + write(_stdout, 3, "\x1B[D"); + break; + case 'C': // Right + if(pos == len-1) break; + pos++; + write(_stdout, 3, "\x1B[C"); + break; } } continue; @@ -331,76 +361,32 @@ void Command_Logout(int argc, char **argv) } /** - * \fn void Command_Clear(int argc, char **argv) - * \brief Clear the screen + * \fn void Command_Colour(int argc, char **argv) + * \brief Displays the help screen */ -void Command_Clear(int argc, char **argv) +void Command_Help(int argc, char **argv) { - write(_stdout, 4, "\x1B[2J"); //Clear Screen + Print("Acess 2 Command Line Interface\n"); + Print(" By John Hodge (thePowersGang / [TPG])\n"); + Print("\n"); + Print("Builtin Commands:\n"); + Print(" logout: Return to the login prompt\n"); + Print(" exit: Same\n"); + Print(" help: Display this message\n"); + Print(" clear: Clear the screen\n"); + Print(" cd: Change the current directory\n"); + Print(" dir: Print the contents of the current directory\n"); + //Print("\n"); + return; } /** - * \fn void Command_Colour(int argc, char **argv) - * \brief Set the colour of the shell prompt - * \note Conflicts with coloured `dir` display + * \fn void Command_Clear(int argc, char **argv) + * \brief Clear the screen */ -void Command_Colour(int argc, char **argv) +void Command_Clear(int argc, char **argv) { - int fg, bg; - char clrStr[6] = "\x1B[37m"; - - // Verify Arg Count - if(argc < 2) - { - goto usage; - } - - // Check Colour - for(fg=0;fg<8;fg++) - if(strcmp(cCOLOUR_NAMES[fg], argv[1]) == 0) - break; - - // Foreground a valid colour - if(fg == 8) { - Print("Unknown Colour '");Print(argv[1]);Print("'\n"); - goto usage; - } - // Set Foreground - clrStr[3] = '0' + fg; - write(_stdout, 6, clrStr); - - // Need to Set Background? - if(argc > 2) - { - for(bg=0;bg<8;bg++) - if(strcmp(cCOLOUR_NAMES[bg], argv[2]) == 0) - break; - - // Valid colour - if(bg == 8) - { - Print("Unknown Colour '");Print(argv[2]);Print("'\n"); - goto usage; - } - - clrStr[2] = '4'; - clrStr[3] = '0' + bg; - write(_stdout, 6, clrStr); - } - // Return - return; - - // Function Usage (Requested via a Goto (I know it's ugly)) -usage: - Print("Usage: colour []\n"); - Print("Valid Colours are "); - for(fg=0;fg<8;fg++) - { - Print(cCOLOUR_NAMES[fg]); - write(_stdout, 3, ", "); - } - write(_stdout, 4, "\b\b\n"); - return; + write(_stdout, 4, "\x1B[2J"); //Clear Screen } /** diff --git a/Usermode/Applications/Makefile.cfg b/Usermode/Applications/Makefile.cfg index f8cd1515..146177dd 100644 --- a/Usermode/Applications/Makefile.cfg +++ b/Usermode/Applications/Makefile.cfg @@ -2,8 +2,13 @@ # General Makefile -include ../../../Makefile.cfg +# satisfying 2 deep applications +if $(ACESSDIR) == "" then + -include ../../../../Makefile.cfg +#endif +ACESSDIR := $(ACESSDIR)/Usermode ASFLAGS = -felf -CPPFLAGS = -I../../include/ +CPPFLAGS = -I$(ACESSDIR)/include/ CFLAGS = -fno-stack-protector $(CPPFLAGS) -LDFLAGS = -T ../../Libraries/acess.ld -I /Acess/Libs/ld-acess.so -lc +LDFLAGS = -T $(ACESSDIR)/Libraries/acess.ld -L $(ACESSDIR)/Libraries -I /Acess/Libs/ld-acess.so -lc diff --git a/Usermode/Applications/ls_src/main.c b/Usermode/Applications/ls_src/main.c index 57ff3061..297f5f92 100644 --- a/Usermode/Applications/ls_src/main.c +++ b/Usermode/Applications/ls_src/main.c @@ -75,7 +75,7 @@ int main(int argc, char *argv[]) } // Traverse Directory - while( (tmp = readdir(fd, buf)) ) + while( (tmp = readdir(fd, buf)) > 0 ) { // Error check if(tmp < 0) { diff --git a/Usermode/Applications/mount_src/Makefile b/Usermode/Applications/mount_src/Makefile new file mode 100644 index 00000000..276cc833 --- /dev/null +++ b/Usermode/Applications/mount_src/Makefile @@ -0,0 +1,27 @@ +# Project: mount + +-include ../Makefile.cfg + +COBJ = main.o +BIN = ../mount + +CFLAGS += -Wall -fno-builtin -fno-stack-protector +LDFLAGS += + +.PHONY : all clean + +all: $(BIN) + +$(BIN): $(COBJ) + @echo --- $(LD) -o $@ + @$(LD) $(LDFLAGS) -o $@ $(COBJ) -Map Map.txt + objdump -d $(BIN) > $(BIN).dsm + cp $(BIN) $(DISTROOT)/Bin/ + +clean: + $(RM) $(COBJ) $(BIN) + +$(COBJ): %.o: %.c + @echo --- GCC -o $@ + @$(CC) $(CFLAGS) -c $? -o $@ + diff --git a/Usermode/Applications/mount_src/main.c b/Usermode/Applications/mount_src/main.c new file mode 100644 index 00000000..b84e85f4 --- /dev/null +++ b/Usermode/Applications/mount_src/main.c @@ -0,0 +1,148 @@ +/* + * Acess2 mount command + */ +#include +#include +#include + +#define MOUNTABLE_FILE "/Acess/Conf/Mountable" +#define MOUNTED_FILE "/Acess/Conf/Mounted" + +// === PROTOTYPES === +void ShowUsage(); + int GetMountDefs(char **spDevice, char **spDir, char **spType, char **spOptions); + +// === CODE === +/** + * \fn int main(int argc, char *argv[]) + * \brief Entrypoint + */ +int main(int argc, char *argv[]) +{ + int fd; + int i; + char *arg; + char *sType = NULL; + char *sDevice = NULL; + char *sDir = NULL; + char *sOptions = NULL; + + if(argc < 3) { + ShowUsage(); + return EXIT_FAILURE; + } + + // Parse Arguments + for( i = 1; i < argc; i++ ) + { + arg = argv[i]; + + if(arg[0] == '-') + { + switch(arg[1]) + { + case 't': sType = argv[++i]; break; + case '-': + //TODO: Long Arguments + default: + ShowUsage(argv[0]); + return EXIT_FAILURE; + } + continue; + } + + if(sDevice == NULL) { + sDevice = arg; + continue; + } + + if(sDir == NULL) { + sDir = arg; + continue; + } + + ShowUsage(argv[0]); + return EXIT_FAILURE; + } + + // Check if we even got a device/mountpoint + if(sDevice == NULL) { + ShowUsage(argv[0]); + return EXIT_FAILURE; + } + + // If no directory was passed (we want to use the mount list) + // or we are not root (we need to use the mount list) + // Check the mount list + if(sDir == NULL || getuid() != 0) + { + // Check if it is defined in the mounts file + if(GetMountDefs(&sDevice, &sDir, &sType, &sOptions) == 0) + { + if(sDir == NULL) + fprintf(stderr, "Unable to find '%s' in '%s'\n", + sDevice, MOUNTABLE_FILE + ); + else + fprintf(stderr, "You must be root to mount devices or directories not in '%s'\n", + MOUNTABLE_FILE + ); + return EXIT_FAILURE; + } + + // We need to be root to mount a filesystem, so, let us be elevated! + setuid(0); // I hope I have the setuid bit implemented. + } + else + { + // Check that we were passed a filesystem type + if(sType == NULL) { + fprintf(stderr, "Please pass a filesystem type\n"); + return EXIT_FAILURE; + } + } + + // Check Device + fd = open(sDevice, OPENFLAG_READ); + if(fd == -1) { + printf("Device '%s' cannot be opened for reading\n", sDevice); + return EXIT_FAILURE; + } + close(fd); + + // Check Mount Point + fd = open(sDir, OPENFLAG_EXEC); + if(fd == -1) { + printf("Directory '%s' does not exist\n", sDir); + return EXIT_FAILURE; + } + close(fd); + + // Replace sOptions with an empty string if it is still NULL + if(sOptions == NULL) sOptions = ""; + + // Let's Mount! + _SysMount(sDevice, sDir, sType, sOptions); + + return 0; +} + +void ShowUsage(char *ProgName) +{ + fprintf(stderr, "Usage:\n", ProgName); + fprintf(stderr, " %s [-t ] \n"); + fprintf(stderr, "or %s \n"); + fprintf(stderr, "or %s \n"); +} + +/** + * \fn int GetMountDefs(char **spDevice, char **spDir, char **spType, char **spOptions) + * \brief Reads the mountable definitions file and returns the corresponding entry + * \param spDevice Pointer to a string (pointer) determining the device (also is the input for this function) + * \note STUB + */ +int GetMountDefs(char **spDevice, char **spDir, char **spType, char **spOptions) +{ + // TODO: Read the mounts file (after deciding what it will be) + return 0; +} diff --git a/Usermode/Libraries/ld-acess.so_src/common.h b/Usermode/Libraries/ld-acess.so_src/common.h index 22066f91..bc2efbdc 100644 --- a/Usermode/Libraries/ld-acess.so_src/common.h +++ b/Usermode/Libraries/ld-acess.so_src/common.h @@ -30,9 +30,11 @@ extern Uint GetSymbol(char *name); extern int GetSymbolFromBase(Uint base, char *name, Uint *ret); // === Library Functions === -extern void strcpy(char *dest, char *src); -extern int strcmp(char *s1, char *s2); -extern int strlen(char *str); +extern char *strcpy(char *dest, const char *src); +extern char *strcat(char *dest, const char *src); +extern int strcmp(const char *s1, const char *s2); +extern int strlen(const char *str); +extern int file_exists(char *filename); // === System Calls === extern void SysExit(); @@ -40,6 +42,8 @@ extern void SysDebug(char *fmt, ...); //!< Now implemented in main.c extern void SysDebugV(char *fmt, ...); extern Uint SysLoadBin(char *path, Uint *entry); extern Uint SysUnloadBin(Uint Base); +extern int open(char *filename, int flags); +extern void close(int fd); // === ELF Loader === extern int ElfGetSymbol(Uint Base, char *name, Uint *ret); diff --git a/Usermode/Libraries/ld-acess.so_src/helpers.asm b/Usermode/Libraries/ld-acess.so_src/helpers.asm index eb275ee2..3797333e 100644 --- a/Usermode/Libraries/ld-acess.so_src/helpers.asm +++ b/Usermode/Libraries/ld-acess.so_src/helpers.asm @@ -9,6 +9,8 @@ [global _SysExit] [global _SysLoadBin] [global _SysUnloadBin] +[global _open] +[global _close] ; void SysDebugV(char *fmt, va_list Args) _SysDebug: @@ -56,3 +58,22 @@ _SysUnloadBin: int 0xAC pop ebx ret + +; int close(char *name, int flags) +_open: + push ebx + mov eax, SYS_OPEN + mov ebx, [esp+0x8] ; Filename + mov ecx, [esp+0xC] ; Flags + int 0xAC + pop ebx + ret + +; void close(int fd) +_close: + push ebx + mov eax, SYS_CLOSE + mov ebx, [esp+0x8] ; File Descriptor + int 0xAC + pop ebx + ret diff --git a/Usermode/Libraries/ld-acess.so_src/lib.c b/Usermode/Libraries/ld-acess.so_src/lib.c index 0d01dc2a..3acc129d 100644 --- a/Usermode/Libraries/ld-acess.so_src/lib.c +++ b/Usermode/Libraries/ld-acess.so_src/lib.c @@ -6,25 +6,57 @@ #include "common.h" // === CODE === -void strcpy(char *dest, char *src) +char *strcpy(char *dest, const char *src) { + char *ret = dest; while(*src) { *dest = *src; src ++; dest ++; } *dest = '\0'; + return ret; +} + +char *strcat(char *dest, const char *src) +{ + char *ret = dest; + while(*dest) dest++; + while(*src) *dest++ = *src++; + *dest = '\0'; + return ret; } - -int strcmp(char *s1, char *s2) + +/** + * \fn int strcmp(const char *s1, const char *s2) + * \brief Compare two strings + */ +int strcmp(const char *s1, const char *s2) { while(*s1 && *s1 == *s2) s1++,s2++; return *s1-*s2; } -int strlen(char *str) +/** + * \fn int strlen(const char *str) + * \brief + */ +int strlen(const char *str) { int len = 0; while(*str) len++,str++; return len; } - + +/** + * \fn int file_exists(char *filename) + * \brief Checks if a file exists + */ +int file_exists(char *filename) +{ + int fd; + //fd = open(filename, OPENFLAG_READ); + fd = open(filename, 0); + if(fd == -1) return 0; + close(fd); + return 1; +} diff --git a/Usermode/Libraries/ld-acess.so_src/loadlib.c b/Usermode/Libraries/ld-acess.so_src/loadlib.c index 85831411..b5fb0a15 100644 --- a/Usermode/Libraries/ld-acess.so_src/loadlib.c +++ b/Usermode/Libraries/ld-acess.so_src/loadlib.c @@ -12,13 +12,16 @@ # define DEBUGS(v...) #endif +// === CONSTANTS === +#define MAX_LOADED_LIBRARIES 64 +#define MAX_STRINGS_BYTES 4096 +#define SYSTEM_LIB_DIR "/Acess/Libs/" + // === PROTOTYPES === Uint IsFileLoaded(char *file); int GetSymbolFromBase(Uint base, char *name, Uint *ret); // === GLOABLS === -#define MAX_LOADED_LIBRARIES 64 -#define MAX_STRINGS_BYTES 4096 struct { Uint Base; char *Name; @@ -28,23 +31,48 @@ char *gsNextAvailString = gsLoadedStrings; //tLoadLib *gpLoadedLibraries = NULL; // === CODE === -Uint LoadLibrary(char *filename, char *SearchDir, char **envp) +char *FindLibrary(char *DestBuf, char *SoName, char *ExtraSearchDir) +{ + // -- #1: Executable Specified + if(ExtraSearchDir) + { + strcpy(DestBuf, ExtraSearchDir); + strcat(DestBuf, "/"); + strcat(DestBuf, SoName); + if(file_exists(DestBuf)) return DestBuf; + } + + // -- #2: System + strcpy(DestBuf, SYSTEM_LIB_DIR); + strcat(DestBuf, SoName); + if(file_exists(DestBuf)) return DestBuf; + + // -- #3: Current Directory + if(file_exists(SoName)) return SoName; + + return NULL; +} + +/** + */ +Uint LoadLibrary(char *SoName, char *SearchDir, char **envp) { - char sTmpName[1024] = "/Acess/Libs/"; + char sTmpName[1024]; + char *filename; Uint iArg; void (*fEntry)(int, int, char *[], char**); DEBUGS("LoadLibrary: (filename='%s', envp=0x%x)\n", filename, envp); // Create Temp Name - strcpy(&sTmpName[12], filename); - DEBUGS(" LoadLibrary: sTmpName='%s'\n", sTmpName); + filename = FindLibrary(sTmpName, SoName, SearchDir); + DEBUGS(" LoadLibrary: filename='%s'\n", filename); - if( (iArg = IsFileLoaded(sTmpName)) ) + if( (iArg = IsFileLoaded(filename)) ) return iArg; // Load Library - iArg = SysLoadBin(sTmpName, (Uint*)&fEntry); + iArg = SysLoadBin(filename, (Uint*)&fEntry); if(iArg == 0) { DEBUGS("LoadLibrary: RETURN 0\n"); return 0; @@ -53,10 +81,10 @@ Uint LoadLibrary(char *filename, char *SearchDir, char **envp) DEBUGS(" LoadLibrary: iArg=0x%x, iEntry=0x%x\n", iArg, fEntry); // Load Symbols - fEntry = (void*)DoRelocate( iArg, envp, sTmpName ); + fEntry = (void*)DoRelocate( iArg, envp, filename ); // Call Entrypoint - DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", filename, fEntry); + DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", SoName, fEntry); fEntry(iArg, 0, NULL, envp); DEBUGS("LoadLibrary: RETURN 1\n"); diff --git a/Usermode/Libraries/libacess.so_src/vfs.asm b/Usermode/Libraries/libacess.so_src/vfs.asm index 1f9ba34e..77c30784 100644 --- a/Usermode/Libraries/libacess.so_src/vfs.asm +++ b/Usermode/Libraries/libacess.so_src/vfs.asm @@ -13,7 +13,10 @@ SYSCALL1 close, SYS_CLOSE ; int SYSCALL4 read, SYS_READ ; int, int64_t, void* SYSCALL4 write, SYS_WRITE ; int, int64_t, void* SYSCALL4 seek, SYS_SEEK ; int, int64_t, int +SYSCALL1 tell, SYS_TELL ; int SYSCALL3 finfo, SYS_FINFO ; int, void*, int SYSCALL2 readdir, SYS_READDIR ; int, char* SYSCALL2 _SysGetACL, SYS_GETACL ; int, void* SYSCALL1 chdir, SYS_CHDIR ; char* +SYSCALL3 ioctl, SYS_IOCTL ; int, int, void* +SYSCALL4 _SysMount, SYS_MOUNT ; char*, char*, char*, char* diff --git a/Usermode/Libraries/libc.so_src/fileIO.c b/Usermode/Libraries/libc.so_src/fileIO.c index 23a760d6..1645cde2 100644 --- a/Usermode/Libraries/libc.so_src/fileIO.c +++ b/Usermode/Libraries/libc.so_src/fileIO.c @@ -41,8 +41,8 @@ EXPORT FILE *freopen(FILE *fp, char *file, char *mode) if(fp->Flags) { fflush(fp); - close(fp->FD); - } + } else + fp->FD = -1; // Get main mode switch(mode[0]) @@ -82,7 +82,10 @@ EXPORT FILE *freopen(FILE *fp, char *file, char *mode) } //Open File - fp->FD = reopen(fp->FD, file, openFlags); + if(fp->FD != -1) + fp->FD = reopen(fp->FD, file, openFlags); + else + fp->FD = open(file, openFlags); if(fp->FD == -1) { fp->Flags = 0; return NULL; @@ -124,6 +127,21 @@ EXPORT void fflush(FILE *fp) ///\todo Implement } +EXPORT long int ftell(FILE *fp) +{ + if(!fp || !fp->FD) return -1; + + return tell(fp->FD); +} + +EXPORT int fseek(FILE *fp, long int amt, int whence) +{ + if(!fp || !fp->FD) return -1; + + return seek(fp->FD, amt, whence); +} + + /** * \fn EXPORT int vfprintf(FILE *fp, const char *format, va_list args) * \brief Print to a file from a variable argument list @@ -172,6 +190,8 @@ EXPORT int fprintf(FILE *fp, const char *format, ...) } /** + * \fn EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp) + * \brief Write to a stream */ EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp) { @@ -183,6 +203,20 @@ EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp) return ret; } +/** + * \fn EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp) + * \brief Read from a stream + */ +EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp) +{ + int ret; + if(!fp || !fp->FD) return -1; + + ret = read(fp->FD, size*num, ptr); + + return ret; +} + /** * \fn EXPORT int fputc(int c, FILE *fp) * \brief Write a single character to the stream diff --git a/Usermode/Libraries/libc.so_src/lib.h b/Usermode/Libraries/libc.so_src/lib.h index 9d5194b1..49c5eb4c 100644 --- a/Usermode/Libraries/libc.so_src/lib.h +++ b/Usermode/Libraries/libc.so_src/lib.h @@ -16,4 +16,6 @@ lib.h #define LOCAL #endif +extern void *memcpy(void *dest, const void *src, size_t n); + #endif diff --git a/Usermode/Libraries/libc.so_src/stdlib.c b/Usermode/Libraries/libc.so_src/stdlib.c index 850d2695..ce5a8d0c 100644 --- a/Usermode/Libraries/libc.so_src/stdlib.c +++ b/Usermode/Libraries/libc.so_src/stdlib.c @@ -35,6 +35,10 @@ EXPORT void exit(int status) EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)) { int i, j, min; + // With 0 items, there's nothing to do and with 1 its already sorted + if(nmemb == 0 || nmemb == 1) return; + + // SORT! for( i = 0; i < (nmemb-1); i++ ) { min = i; diff --git a/Usermode/include/acess/sys.h b/Usermode/include/acess/sys.h index 707e5bb4..d1e39aff 100644 --- a/Usermode/include/acess/sys.h +++ b/Usermode/include/acess/sys.h @@ -17,6 +17,7 @@ # define SEEK_END -1 #endif #define CLONE_VM 0x10 +#define GETMSG_IGNORE ((void*)-1) #define FILEFLAG_DIRECTORY 0x10 #define FILEFLAG_SYMLINK 0x20 @@ -51,28 +52,42 @@ typedef struct s_sysFInfo t_sysFInfo; typedef struct s_sysACL t_sysACL; // === FUNCTIONS === -void _SysDebug(char *str, ...); +extern void _SysDebug(char *str, ...); // --- Proc --- -void _exit(int status) __attribute__((noreturn)); -void sleep(); -void wait(int miliseconds); - int waittid(int id, int *status); - int clone(int flags, void *stack); - int execve(char *path, char **argv, char **envp); -void setuid(int id); -void setgid(int id); +extern void _exit(int status) __attribute__((noreturn)); +extern void sleep(); +extern void yield(); +extern void wait(int miliseconds); +extern int waittid(int id, int *status); +extern int clone(int flags, void *stack); +extern int execve(char *path, char **argv, char **envp); +extern int gettid(); +extern int getpid(); + +// --- Permissions --- +extern int getuid(); +extern int getgid(); +extern void setuid(int id); +extern void setgid(int id); + // --- VFS --- - int chdir(char *dir); - int open(char *path, int flags); - int reopen(int fd, char *path, int flags); -void close(int fd); -uint64_t read(int fd, uint64_t length, void *buffer); -uint64_t write(int fd, uint64_t length, void *buffer); - int seek(int fd, uint64_t offset, int whence); - int ioctl(int fd, int id, void *data); - int finfo(int fd, t_sysFInfo *info, int maxacls); - int readdir(int fd, char *dest); - int _SysGetACL(int fd, t_sysACL *dest); +extern int chdir(char *dir); +extern int open(char *path, int flags); +extern int reopen(int fd, char *path, int flags); +extern void close(int fd); +extern uint64_t read(int fd, uint64_t length, void *buffer); +extern uint64_t write(int fd, uint64_t length, void *buffer); +extern int seek(int fd, uint64_t offset, int whence); +extern uint64_t tell(int fd); +extern int ioctl(int fd, int id, void *data); +extern int finfo(int fd, t_sysFInfo *info, int maxacls); +extern int readdir(int fd, char *dest); +extern int _SysGetACL(int fd, t_sysACL *dest); +extern int _SysMount(char *Device, char *Directory, char *Type, char *Options); + +// --- IPC --- +extern int SysSendMessage(int dest, int length, void *Data); +extern int SysGetMessage(int *src, void *Data); // --- MEMORY --- uint64_t _SysGetPhys(uint vaddr); diff --git a/Usermode/include/stdio.h b/Usermode/include/stdio.h index 78d1a59e..26d9c683 100644 --- a/Usermode/include/stdio.h +++ b/Usermode/include/stdio.h @@ -5,6 +5,7 @@ #ifndef __STDIO_H #define __STDIO_H +#include #include typedef struct sFILE FILE; @@ -17,6 +18,8 @@ extern FILE *fopen(char *file, char *mode); extern FILE *freopen(FILE *fp, char *file, char *mode); extern void fclose(FILE *fp); extern void fflush(FILE *fp); +extern long int ftell(FILE *fp); +extern int fseek(FILE *fp, long int amt, int whence); extern size_t fread(void *buf, size_t size, size_t n, FILE *fp); extern size_t fwrite(void *buf, size_t size, size_t n, FILE *fp); diff --git a/Usermode/include/string.h b/Usermode/include/string.h index 158aeeb7..beeff608 100644 --- a/Usermode/include/string.h +++ b/Usermode/include/string.h @@ -5,6 +5,8 @@ #ifndef __STRING_H #define __STRING_H +#include + // Memory extern void *memset(void *dest, int val, size_t count); extern void *memcpy(void *dest, const void *src, size_t count);