Various Changes
authorJohn Hodge <[email protected]>
Sat, 10 Oct 2009 00:33:55 +0000 (08:33 +0800)
committerJohn Hodge <[email protected]>
Sat, 10 Oct 2009 00:33:55 +0000 (08:33 +0800)
- 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)

43 files changed:
Kernel/Makefile
Kernel/arch/x86/irq.c
Kernel/arch/x86/main.c
Kernel/arch/x86/time.c
Kernel/drv/Makefile
Kernel/drv/ata_x86.c
Kernel/drv/bochsvbe.c
Kernel/drv/fdd.c
Kernel/drv/ne2000.c
Kernel/drv/vterm.c
Kernel/include/common.h
Kernel/include/drv_pci.h
Kernel/include/syscalls.h
Kernel/include/syscalls.inc.asm
Kernel/include/tpl_drv_video.h
Kernel/include/vfs.h
Kernel/lib.c
Kernel/syscalls.c
Kernel/syscalls.lst
Kernel/vfs/fs/devfs.c
Kernel/vfs/fs/ext2.c
Kernel/vfs/fs/fat.c
Kernel/vfs/fs/root.c
Kernel/vfs/main.c
Kernel/vfs/mount.c
Kernel/vfs/open.c
Makefile.cfg
Usermode/Applications/CLIShell_src/main.c
Usermode/Applications/Makefile.cfg
Usermode/Applications/ls_src/main.c
Usermode/Applications/mount_src/Makefile [new file with mode: 0644]
Usermode/Applications/mount_src/main.c [new file with mode: 0644]
Usermode/Libraries/ld-acess.so_src/common.h
Usermode/Libraries/ld-acess.so_src/helpers.asm
Usermode/Libraries/ld-acess.so_src/lib.c
Usermode/Libraries/ld-acess.so_src/loadlib.c
Usermode/Libraries/libacess.so_src/vfs.asm
Usermode/Libraries/libc.so_src/fileIO.c
Usermode/Libraries/libc.so_src/lib.h
Usermode/Libraries/libc.so_src/stdlib.c
Usermode/include/acess/sys.h
Usermode/include/stdio.h
Usermode/include/string.h

index ae42dce..195d311 100644 (file)
@@ -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)
index 848e7e9..586768e 100644 (file)
@@ -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++ )
index 304c3dd..c0d75ce 100644 (file)
@@ -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();
index f7d02cc..4cfa280 100644 (file)
@@ -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;
index 5a55d93..44f17cd 100644 (file)
@@ -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
index c2c5205..e57adde 100644 (file)
@@ -9,6 +9,7 @@
 #include <fs_devfs.h>
 #include <drv_pci.h>
 #include <tpl_drv_common.h>
+#include <drvutil.h>
 
 // === 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
index bbf0bbc..2014cb8 100644 (file)
@@ -30,34 +30,10 @@ typedef struct {
        Uint32  fbSize;\r
 } t_bga_mode;\r
 \r
-\r
-// === PROTOTYPES ===\r
-// Driver\r
- int   BGA_Install(char **Arguments);\r
-void   BGA_Uninstall();\r
-// Internal\r
-void   BGA_int_WriteRegister(Uint16 reg, Uint16 value);\r
-Uint16 BGA_int_ReadRegister(Uint16 reg);\r
-void   BGA_int_SetBank(Uint16 bank);\r
-void   BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp);\r
- int   BGA_int_UpdateMode(int id);\r
- int   BGA_int_FindMode(tVideo_IOCtl_Mode *info);\r
- int   BGA_int_ModeInfo(tVideo_IOCtl_Mode *info);\r
- int   BGA_int_MapFB(void *Dest);\r
-// Filesystem\r
-Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
-Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
- int   BGA_Ioctl(tVFS_Node *node, int id, void *data);\r
-\r
 // === CONSTANTS ===\r
-const t_bga_mode       BGA_MODES[] = {\r
-       {},\r
-       {640,480,8, 0, 640*480},\r
-       {640,480,32, 0, 640*480*4},\r
-       {800,600,8, 0, 800*600},\r
-       {800,600,32, 0, 800*600*4},\r
+enum eMode_Flags {\r
+       MODEFLAG_TEXT = 1\r
 };\r
-#define        BGA_MODE_COUNT  (sizeof(BGA_MODES)/sizeof(BGA_MODES[0]))\r
 #define        BGA_LFB_MAXSIZE (1024*768*4)\r
 #define        VBE_DISPI_BANK_ADDRESS  0xA0000\r
 #define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000\r
@@ -80,7 +56,26 @@ enum {
        VBE_DISPI_INDEX_Y_OFFSET\r
 };\r
 \r
-// GLOBALS\r
+\r
+// === PROTOTYPES ===\r
+// Driver\r
+ int   BGA_Install(char **Arguments);\r
+void   BGA_Uninstall();\r
+// Internal\r
+void   BGA_int_WriteRegister(Uint16 reg, Uint16 value);\r
+Uint16 BGA_int_ReadRegister(Uint16 reg);\r
+void   BGA_int_SetBank(Uint16 bank);\r
+void   BGA_int_SetMode(Uint16 width, Uint16 height);\r
+ int   BGA_int_UpdateMode(int id);\r
+ int   BGA_int_FindMode(tVideo_IOCtl_Mode *info);\r
+ int   BGA_int_ModeInfo(tVideo_IOCtl_Mode *info);\r
+ int   BGA_int_MapFB(void *Dest);\r
+// Filesystem\r
+Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
+Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
+ int   BGA_Ioctl(tVFS_Node *node, int id, void *data);\r
+\r
+// === GLOBALS ===\r
 MODULE_DEFINE(0, 0x0032, BochsVBE, BGA_Install, NULL, NULL);\r
 tDevFS_Driver  gBGA_DriverStruct = {\r
        NULL, "BochsGA",\r
@@ -93,6 +88,16 @@ tDevFS_Driver        gBGA_DriverStruct = {
  int   giBGA_CurrentMode = -1;\r
  int   giBGA_DriverId = -1;\r
 Uint   *gBGA_Framebuffer;\r
+t_bga_mode     gBGA_Modes[] = {\r
+       {},\r
+       { 80,25, 32, MODEFLAG_TEXT, 80*25*8},   // 640 x 480\r
+       {100,37, 32, MODEFLAG_TEXT, 100*37*8},  // 800 x 600\r
+       {640,480,8, 0, 640*480},\r
+       {640,480,32, 0, 640*480*4},\r
+       {800,600,8, 0, 800*600},\r
+       {800,600,32, 0, 800*600*4},\r
+};\r
+#define        BGA_MODE_COUNT  (sizeof(gBGA_Modes)/sizeof(gBGA_Modes[0]))\r
 \r
 // === CODE ===\r
 /**\r
@@ -142,7 +147,7 @@ Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)
        if(giBGA_CurrentMode == -1)     return -1;\r
        \r
        // Check Offset and Length against Framebuffer Size\r
-       if(off+len > BGA_MODES[giBGA_CurrentMode].fbSize)\r
+       if(off+len > gBGA_Modes[giBGA_CurrentMode].fbSize)\r
                return -1;\r
        \r
        // Copy from Framebuffer\r
@@ -155,30 +160,58 @@ Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)
  * \brief Write to the framebuffer\r
  */\r
 Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)\r
-{\r
-       Uint8   *destBuf;\r
-       \r
-       DEBUGS("BGA_Write: (off=%i, len=0x%x)\n", off, len);\r
+{      \r
+       ENTER("xoff xlen", off, len);\r
        \r
        // Check Mode\r
-       if(giBGA_CurrentMode == -1)\r
+       if(giBGA_CurrentMode == -1) {\r
+               LEAVE('i', -1);\r
                return -1;\r
+       }\r
+       \r
        // Check Input against Frambuffer Size\r
-       if(off+len > BGA_MODES[giBGA_CurrentMode].fbSize)\r
+       if(off+len > gBGA_Modes[giBGA_CurrentMode].fbSize) {\r
+               LEAVE('i', -1);\r
                return -1;\r
+       }\r
        \r
-       destBuf = (Uint8*) ((Uint)gBGA_Framebuffer + (Uint)off);\r
-       \r
-       DEBUGS(" BGA_Write: *buffer = 0x%x\n", *(Uint*)buffer);\r
-       DEBUGS(" BGA_Write: Updating Framebuffer (0x%x - 0x%x bytes)\n", \r
-               destBuf, destBuf + (Uint)len);\r
-       \r
-       \r
-       // Copy to Frambuffer\r
-       memcpy(destBuf, buffer, len);\r
-       \r
-       DEBUGS("BGA_Write: BGA Framebuffer updated\n");\r
+       // Text Mode\r
+       if( gBGA_Modes[giBGA_CurrentMode].flags & MODEFLAG_TEXT )\r
+       {\r
+               tVT_Char        *chars = buffer;\r
+                int    pitch = gBGA_Modes[giBGA_CurrentMode].width * giVT_CharWidth;\r
+               Uint32  *dest;\r
+               dest = (void*)gBGA_Framebuffer;\r
+               dest += off * giVT_CharWidth;\r
+               len /= sizeof(tVT_Char);\r
+               while(len--)\r
+               {\r
+                       VT_Font_Render(\r
+                               chars->Ch,\r
+                               dest, pitch,\r
+                               VT_Colour12to24(chars->BGCol),\r
+                               VT_Colour12to24(chars->FGCol)\r
+                               );\r
+                       dest += giVT_CharWidth;\r
+                       chars++;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               Uint8   *destBuf = (Uint8*) ((Uint)gBGA_Framebuffer + (Uint)off);\r
+               \r
+               LOG("buffer = %p\n", buffer);\r
+               LOG("Updating Framebuffer (%p to %p)\n", \r
+                       destBuf, destBuf + (Uint)len);\r
+               \r
+               \r
+               // Copy to Frambuffer\r
+               memcpy(destBuf, buffer, len);\r
+               \r
+               LOG("BGA Framebuffer updated\n");\r
+       }\r
        \r
+       LEAVE('i', len);\r
        return len;\r
 }\r
 \r
@@ -265,13 +298,13 @@ INT void BGA_int_SetBank(Uint16 bank)
  * \fn void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp)\r
  * \brief Sets the video mode from the dimensions and bpp given\r
  */\r
-void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp)\r
+void BGA_int_SetMode(Uint16 width, Uint16 height)\r
 {\r
        DEBUGS("BGA_int_SetMode: (width=%i, height=%i, bpp=%i)\n", width, height, bpp);\r
        BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);\r
     BGA_int_WriteRegister(VBE_DISPI_INDEX_XRES,        width);\r
     BGA_int_WriteRegister(VBE_DISPI_INDEX_YRES,        height);\r
-    BGA_int_WriteRegister(VBE_DISPI_INDEX_BPP, bpp);\r
+    BGA_int_WriteRegister(VBE_DISPI_INDEX_BPP, 32);\r
     BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_NOCLEARMEM | VBE_DISPI_LFB_ENABLED);\r
     //BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_NOCLEARMEM);\r
 }\r
@@ -282,8 +315,19 @@ void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp)
  */\r
 int BGA_int_UpdateMode(int id)\r
 {\r
+       // Sanity Check\r
        if(id < 0 || id >= BGA_MODE_COUNT)      return -1;\r
-       BGA_int_SetMode(BGA_MODES[id].width, BGA_MODES[id].height, BGA_MODES[id].bpp);\r
+       \r
+       // Check if it is a text mode\r
+       if( gBGA_Modes[id].flags & MODEFLAG_TEXT )\r
+               BGA_int_SetMode(\r
+                       gBGA_Modes[id].width*giVT_CharWidth,\r
+                       gBGA_Modes[id].height*giVT_CharHeight);\r
+       else    // Graphics?\r
+               BGA_int_SetMode(\r
+                       gBGA_Modes[id].width,\r
+                       gBGA_Modes[id].height);\r
+       \r
        giBGA_CurrentMode = id;\r
        return id;\r
 }\r
@@ -304,12 +348,12 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info)
        for(i = 0; i < BGA_MODE_COUNT; i++)\r
        {\r
                #if DEBUG >= 2\r
-               LogF("Mode %i (%ix%ix%i), ", i, BGA_MODES[i].width, BGA_MODES[i].height, BGA_MODES[i].bpp);\r
+               LogF("Mode %i (%ix%ix%i), ", i, gBGA_Modes[i].width, gBGA_Modes[i].height, gBGA_Modes[i].bpp);\r
                #endif\r
        \r
-               if(BGA_MODES[i].width == info->width\r
-               && BGA_MODES[i].height == info->height\r
-               && BGA_MODES[i].bpp == info->bpp)\r
+               if(gBGA_Modes[i].width == info->width\r
+               && gBGA_Modes[i].height == info->height\r
+               && gBGA_Modes[i].bpp == info->bpp)\r
                {\r
                        #if DEBUG >= 2\r
                        LogF("Perfect!\n");\r
@@ -318,7 +362,7 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info)
                        break;\r
                }\r
                \r
-               tmp = BGA_MODES[i].width * BGA_MODES[i].height * BGA_MODES[i].bpp;\r
+               tmp = gBGA_Modes[i].width * gBGA_Modes[i].height * gBGA_Modes[i].bpp;\r
                tmp -= rqdProduct;\r
                tmp = tmp < 0 ? -tmp : tmp;\r
                factor = tmp * 100 / rqdProduct;\r
@@ -334,9 +378,9 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info)
                }\r
        }\r
        info->id = best;\r
-       info->width = BGA_MODES[best].width;\r
-       info->height = BGA_MODES[best].height;\r
-       info->bpp = BGA_MODES[best].bpp;\r
+       info->width = gBGA_Modes[best].width;\r
+       info->height = gBGA_Modes[best].height;\r
+       info->bpp = gBGA_Modes[best].bpp;\r
        return best;\r
 }\r
 \r
@@ -352,9 +396,9 @@ int BGA_int_ModeInfo(tVideo_IOCtl_Mode *info)
        \r
        if(info->id < 0 || info->id >= BGA_MODE_COUNT)  return -1;\r
        \r
-       info->width = BGA_MODES[info->id].width;\r
-       info->height = BGA_MODES[info->id].height;\r
-       info->bpp = BGA_MODES[info->id].bpp;\r
+       info->width = gBGA_Modes[info->id].width;\r
+       info->height = gBGA_Modes[info->id].height;\r
+       info->bpp = gBGA_Modes[info->id].bpp;\r
        \r
        return 1;\r
 }\r
@@ -371,10 +415,10 @@ int BGA_int_MapFB(void *Dest)
        \r
        // Sanity Check\r
        if((Uint)Dest > 0xC0000000)     return 0;\r
-       if(BGA_MODES[giBGA_CurrentMode].bpp < 15)       return 0;       // Only non-pallete modes are supported\r
+       if(gBGA_Modes[giBGA_CurrentMode].bpp < 15)      return 0;       // Only non-pallete modes are supported\r
        \r
        // Count required pages\r
-       pages = (BGA_MODES[giBGA_CurrentMode].fbSize + 0xFFF) >> 12;\r
+       pages = (gBGA_Modes[giBGA_CurrentMode].fbSize + 0xFFF) >> 12;\r
        \r
        // Check if there is space\r
        for( i = 0; i < pages; i++ )\r
index 4e271a9..ae79ac7 100644 (file)
@@ -2,7 +2,7 @@
  * AcessOS 0.1\r
  * Floppy Disk Access Code\r
  */\r
-#define DEBUG  0\r
+#define DEBUG  1\r
 #include <common.h>\r
 #include <modules.h>\r
 #include <fs_devfs.h>\r
@@ -114,7 +114,7 @@ static int  siFDD_SectorCacheSize = CACHE_SIZE;
 static t_floppySector  sFDD_SectorCache[CACHE_SIZE];\r
 #endif\r
 \r
-//=== CODE ===\r
+// === CODE ===\r
 /**\r
  * \fn char *FDD_ReadDir(tVFS_Node *Node, int pos)\r
  * \brief Read Directory\r
@@ -176,7 +176,7 @@ Uint64 FDD_ReadFS(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)
        int     disk;\r
        Uint32  buf[128];\r
        \r
-       ENTER("xoff xlen pbuffer", off, len, buffer)\r
+       ENTER("xoff xlen pbuffer", off, len, buffer);\r
        \r
        if(node == NULL) {\r
                LEAVE('i', -1);\r
@@ -481,10 +481,10 @@ int FDD_IOCtl(tVFS_Node *node, int id, void *data)
 }\r
 \r
 /**\r
- * \fn void fdd_handler(void)\r
+ * \fn void fdd_handler(int unused)\r
  * \brief Handles IRQ6\r
  */\r
-void fdd_handler(void)\r
+void fdd_handler(int unused)\r
 {\r
     fdd_irq6 = 1;\r
 }\r
index e1f5990..c25718a 100644 (file)
@@ -6,8 +6,18 @@
 #include <common.h>
 #include <modules.h>
 #include <fs_devfs.h>
+#include <drv_pci.h>
 
 // === 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)
+{
 }
index 1e7138d..0f5cf8c 100644 (file)
@@ -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);
index 590295f..f340134 100644 (file)
@@ -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 <binary_ext.h>
 #include <vfs_ext.h>
index b6a1b07..b539430 100644 (file)
@@ -37,5 +37,6 @@ extern Uint32 PCI_GetBAR1(int id);
 extern Uint32  PCI_GetBAR3(int id);\r
 extern Uint32  PCI_GetBAR4(int id);\r
 extern Uint32  PCI_GetBAR5(int id);\r
+extern Uint16  PCI_AssignPort(int id, int bar, int count);\r
 \r
 #endif\r
index 743a1ca..a615c37 100644 (file)
@@ -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
index c33cd34..9f3973a 100644 (file)
@@ -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
index 8f22c97..51f6ea9 100644 (file)
@@ -51,8 +51,13 @@ struct sVideo_IOCtl_Mode {
        short   id;             //!< Mide ID\r
        Uint16  width;  //!< Width\r
        Uint16  height; //!< Height\r
-       Uint16  bpp;    //!< Bits per Pixel\r
+       Uint8   bpp;    //!< Bits per Pixel\r
+       Uint8   flags;  //!< Mode Flags\r
 };\r
+#define VIDEO_FLAG_TEXT        0x1     //!< Text Mode\r
+#define VIDEO_FLAG_SLOW        0x2     //!< Non-accelerated mode\r
+/**\r
+ */\r
 struct sVideo_IOCtl_Pos {\r
        Sint16  x;\r
        Sint16  y;\r
@@ -81,4 +86,9 @@ typedef struct sVT_Char       tVT_Char;
 #define        VT_COL_LTGREY   0x0CCC\r
 #define        VT_COL_WHITE    0x0FFF\r
 \r
+extern int     giVT_CharWidth;\r
+extern int     giVT_CharHeight;\r
+extern void    VT_Font_Render(Uint32 Codepoint, void *Buffer, int Pitch, Uint32 BGC, Uint32 FGC);\r
+extern Uint32  VT_Colour12to24(Uint16 Col12);\r
+\r
 #endif\r
index 4ba3f45..025a526 100644 (file)
@@ -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;
index 3399d3d..68d48a6 100644 (file)
@@ -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
index 5774dbe..8d17e74 100644 (file)
@@ -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,
index 8b38f78..9b4920a 100644 (file)
@@ -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
index 9bb60ab..6ead47e 100644 (file)
@@ -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;
 }
index 78c115e..06189f8 100644 (file)
@@ -7,15 +7,17 @@
  * \brief Second Extended Filesystem Driver\r
  * \todo Implement file read support\r
  */\r
+#define DEBUG  1\r
 #include <common.h>\r
 #include <vfs.h>\r
+#include <modules.h>\r
 #include "fs_ext2.h"\r
 \r
 // === STRUCTURES ===\r
 typedef struct {\r
         int    FD;\r
         int    CacheID;\r
-       vfs_node        RootNode;\r
+       tVFS_Node       RootNode;\r
        \r
        tExt2_SuperBlock        SuperBlock;\r
         int    BlockSize;\r
@@ -25,35 +27,40 @@ typedef struct {
 } tExt2_Disk;\r
 \r
 // === PROTOTYPES ===\r
-//Interface Functions\r
+ int   Ext2_Install(char **Arguments);\r
+// Interface Functions\r
 tVFS_Node      *Ext2_InitDevice(char *Device, char **Options);\r
-void           Ext2_UnMount(tVFS_Node *Node);\r
+void           Ext2_Unmount(tVFS_Node *Node);\r
 Uint64         Ext2_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);\r
 Uint64         Ext2_Write(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);\r
+void           Ext2_CloseFile(tVFS_Node *Node);\r
 char           *Ext2_ReadDir(tVFS_Node *Node, int Pos);\r
 tVFS_Node      *Ext2_FindDir(tVFS_Node *Node, char *FileName);\r
-tVFS_Node      *Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags);\r
- int           Ext2_int_GetInode(vfs_node *Node, tExt2_Inode *Inode);\r
-tVFS_Node      *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeId, char *Name, Uint64 VfsInode);\r
+ int           Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags);\r
+// Internal Helpers\r
+ int           Ext2_int_GetInode(tVFS_Node *Node, tExt2_Inode *Inode);\r
+tVFS_Node      *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeId, char *Name);\r
  int           Ext2_int_ReadInode(tExt2_Disk *Disk, Uint InodeId, tExt2_Inode *Inode);\r
 Uint64         Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum);\r
 \r
 // === SEMI-GLOBALS ===\r
+MODULE_DEFINE(0, 0x5B /*v0.90*/, EXT2, Ext2_Install, NULL);\r
 tExt2_Disk     gExt2_disks[6];\r
  int   giExt2_count = 0;\r
-tVFS_Driver    gExt2_FSInfo = {NULL,\r
-       "ext2", 0, Ext2_InitDevice, Ext2_UnMount, NULL\r
+tVFS_Driver    gExt2_FSInfo = {\r
+       "ext2", 0, Ext2_InitDevice, Ext2_Unmount, NULL\r
        };\r
 \r
 // === CODE ===\r
 \r
 /**\r
- * \fn void Ext2_Install()\r
+ * \fn int Ext2_Install(char **Arguments)\r
  * \brief Install the Ext2 Filesystem Driver\r
  */\r
-void Ext2_Install()\r
+int Ext2_Install(char **Arguments)\r
 {\r
        VFS_AddDriver( &gExt2_FSInfo );\r
+       return 1;\r
 }\r
 \r
 /**\r
@@ -74,7 +81,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        // Open Disk\r
        fd = VFS_Open(Device, VFS_OPENFLAG_READ|VFS_OPENFLAG_WRITE);            //Open Device\r
        if(fd == -1) {\r
-               Warning"[EXT2] Unable to open '%s'\n", Device);\r
+               Warning("[EXT2] Unable to open '%s'\n", Device);\r
                return NULL;\r
        }\r
        \r
@@ -83,7 +90,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        \r
        // Sanity Check Magic value\r
        if(sb.s_magic != 0xEF53) {\r
-               WarningEx("EXT2", "Volume '%s' is not an EXT2 volume\n", Device);\r
+               Warning("[EXT2 ] Volume '%s' is not an EXT2 volume\n", Device);\r
                VFS_Close(fd);\r
                return NULL;\r
        }\r
@@ -94,7 +101,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        \r
        // Allocate Disk Information\r
        disk = malloc(sizeof(tExt2_Disk) + sizeof(tExt2_Group)*groupCount);\r
-       disk->fd = fd;\r
+       disk->FD = fd;\r
        memcpy(&disk->SuperBlock, &sb, 1024);\r
        disk->GroupCount = groupCount;\r
        \r
@@ -106,7 +113,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        disk->BlockSize = 1024 << sb.s_log_block_size;\r
        \r
        // Read Group Information\r
-       VFS_ReadAt(disk->fd,\r
+       VFS_ReadAt(disk->FD,\r
                sb.s_first_data_block * disk->BlockSize + 1024,\r
                sizeof(tExt2_Group)*groupCount,\r
                disk->Groups);\r
@@ -126,7 +133,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        Ext2_int_ReadInode(disk, 2, &inode);\r
        \r
        // Create Root Node\r
-       memset(&disk->RootNode, 0, sizeof(vfs_node));\r
+       memset(&disk->RootNode, 0, sizeof(tVFS_Node));\r
        disk->RootNode.Inode = 2;       // Root inode ID\r
        disk->RootNode.ImplPtr = disk;  // Save disk pointer\r
        disk->RootNode.Size = -1;       // Fill in later (on readdir)\r
@@ -158,7 +165,7 @@ void Ext2_Unmount(tVFS_Node *Node)
 {\r
        tExt2_Disk      *disk = Node->ImplPtr;\r
        \r
-       VFS_Close( disk->fd );\r
+       VFS_Close( disk->FD );\r
        Inode_ClearCache( disk->CacheID );\r
        memset(disk, 0, sizeof(tExt2_Disk)+disk->GroupCount*sizeof(tExt2_Group));\r
        free(disk);\r
@@ -186,13 +193,13 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        // Read only block\r
        if(Length <= disk->BlockSize - Offset)\r
        {\r
-               VFS_ReadAt( disk->fd, base+Offset, Length, Buffer);\r
+               VFS_ReadAt( disk->FD, base+Offset, Length, Buffer);\r
                return Length;\r
        }\r
        \r
        // Read first block\r
        remLen = Length;\r
-       VFS_ReadAt( disk->fd, base + Offset, disk->BlockSize - Offset, Buffer);\r
+       VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer);\r
        remLen -= disk->BlockSize - Offset;\r
        Buffer += disk->BlockSize - Offset;\r
        block ++;\r
@@ -201,7 +208,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        while(remLen > disk->BlockSize)\r
        {\r
                base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-               VFS_ReadAt( disk->fd, base, disk->BlockSize, Buffer);\r
+               VFS_ReadAt( disk->FD, base, disk->BlockSize, Buffer);\r
                Buffer += disk->BlockSize;\r
                remLen -= disk->BlockSize;\r
                block ++;\r
@@ -209,7 +216,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        \r
        // Read last block\r
        base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-       VFS_ReadAt( disk->fd, base, remLen, Buffer);\r
+       VFS_ReadAt( disk->FD, base, remLen, Buffer);\r
        \r
        return Length;\r
 }\r
@@ -247,13 +254,13 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                \r
                // Write only block (if only one)\r
                if(Offset + retLen <= disk->BlockSize) {\r
-                       VFS_WriteAt(disk->fd, base+Offset, retLen, Buffer);\r
+                       VFS_WriteAt(disk->FD, base+Offset, retLen, Buffer);\r
                        if(bNewBlocks)  return Length;\r
                        goto addBlocks; // Ugh! A goto, but it seems unavoidable\r
                }\r
                \r
                // Write First Block\r
-               VFS_WriteAt(disk->fd, base+Offset, disk->BlockSize-Offset, Buffer);\r
+               VFS_WriteAt(disk->FD, base+Offset, disk->BlockSize-Offset, Buffer);\r
                Buffer += disk->BlockSize-Offset;\r
                retLen -= disk->BlockSize-Offset;\r
                block ++;\r
@@ -262,7 +269,7 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                while(retLen > disk->BlockSize)\r
                {\r
                        base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-                       VFS_WriteAt(disk->fd, base, disk->BlockSize, Buffer);\r
+                       VFS_WriteAt(disk->FD, base, disk->BlockSize, Buffer);\r
                        Buffer += disk->BlockSize;\r
                        retLen -= disk->BlockSize;\r
                        block ++;\r
@@ -270,26 +277,26 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                \r
                // Write last block\r
                base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-               VFS_WriteAt(disk->fd, base, retLen, Buffer);\r
+               VFS_WriteAt(disk->FD, base, retLen, Buffer);\r
                if(bNewBlocks)  return Length;  // Writing in only allocated space\r
        }\r
        \r
 addBlocks:\r
        ///\todo Implement block allocation\r
-       WarningEx("EXT2", "File extending is not yet supported");\r
+       Warning("[EXT2] File extending is not yet supported");\r
        \r
        return 0;\r
 }\r
 \r
 /**\r
- * \fn int Ext2_CloseFile(vfs_node *Node)\r
+ * \fn void Ext2_CloseFile(vfs_node *Node)\r
  * \brief Close a file (Remove it from the cache)\r
  */\r
-int Ext2_CloseFile(tVFS_Node *Node)\r
+void Ext2_CloseFile(tVFS_Node *Node)\r
 {\r
        tExt2_Disk      *disk = Node->ImplPtr;\r
-       inode_uncacheNode(disk->CacheID, Node->impl);\r
-       return 1;\r
+       Inode_UncacheNode(disk->CacheID, Node->Inode);\r
+       return ;\r
 }\r
 \r
 /**\r
@@ -305,8 +312,6 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
         int    block = 0, ofs = 0;\r
         int    entNum = 0;\r
        tExt2_Disk      *disk = Node->ImplPtr;\r
-       Uint64  vfsInode = 0;\r
-       tVFS_Node       *retNode;\r
        Uint    size;\r
        \r
        ENTER("pNode iPos", Node, Pos);\r
@@ -323,7 +328,7 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
        Base = inode.i_block[0] * disk->BlockSize;\r
        while(Pos -- && size > 0)\r
        {\r
-               VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
+               VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
                ofs += dirent.rec_len;\r
                size -= dirent.rec_len;\r
                entNum ++;\r
@@ -331,8 +336,8 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
                if(ofs >= disk->BlockSize) {\r
                        block ++;\r
                        if( ofs > disk->BlockSize ) {\r
-                               Warning("[EXT2] Directory Entry %i of inode %i ('%s') extends over a block boundary, ignoring\n",\r
-                                       entNum-1, Node->impl, Node->name);\r
+                               Warning("[EXT2] Directory Entry %i of inode %i extends over a block boundary, ignoring\n",\r
+                                       entNum-1, Node->Inode);\r
                        }\r
                        ofs = 0;\r
                        Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block );\r
@@ -342,17 +347,17 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
        if(size <= 0)   return NULL;\r
        \r
        // Read Entry\r
-       VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent );\r
+       VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent );\r
        //LOG(" Ext2_ReadDir: dirent.inode = %i\n", dirent.inode);\r
        //LOG(" Ext2_ReadDir: dirent.rec_len = %i\n", dirent.rec_len);\r
        //LOG(" Ext2_ReadDir: dirent.name_len = %i\n", dirent.name_len);\r
-       VFS_ReadAt( disk->fd, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
+       VFS_ReadAt( disk->FD, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
        namebuf[ dirent.name_len ] = '\0';      // Cap off string\r
        \r
        \r
        // Ignore . and .. (these are done in the VFS)\r
        if( (namebuf[0] == '.' && namebuf[1] == '\0')\r
-       ||  (namebuf[0] == '.' && namebuf[1] == '.' && namebuf[2]=='\0'))\r
+       ||  (namebuf[0] == '.' && namebuf[1] == '.' && namebuf[2]=='\0')) {\r
                LEAVE('p', VFS_SKIP);\r
                return VFS_SKIP;        // Skip\r
        }\r
@@ -390,8 +395,8 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename)
        // Find File\r
        while(size > 0)\r
        {\r
-               VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
-               VFS_ReadAt( disk->fd, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
+               VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
+               VFS_ReadAt( disk->FD, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
                namebuf[ dirent.name_len ] = '\0';      // Cap off string\r
                // If it matches, create a node and return it\r
                if(strcmp(namebuf, Filename) == 0)\r
@@ -405,8 +410,8 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename)
                if(ofs >= disk->BlockSize) {\r
                        block ++;\r
                        if( ofs > disk->BlockSize ) {\r
-                               Warnin("[EXT2 ] Directory Entry %i of inode %i ('%s') extends over a block boundary, ignoring\n",\r
-                                       entNum-1, Node->impl, Node->name);\r
+                               Warning("[EXT2 ] Directory Entry %i of inode %i extends over a block boundary, ignoring\n",\r
+                                       entNum-1, Node->Inode);\r
                        }\r
                        ofs = 0;\r
                        Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block );\r
@@ -417,10 +422,10 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename)
 }\r
 \r
 /**\r
- * \fn tVFS_Node *Ext2_MkNod(tVFS_Node *Parent, char *Name, int Flags)\r
+ * \fn int Ext2_MkNod(tVFS_Node *Parent, char *Name, Uint Flags)\r
  * \brief Create a new node\r
  */\r
-tVFS_Node *Ext2_MkNod(tVFS_Node *Parent, char *Name, int Flags)\r
+int Ext2_MkNod(tVFS_Node *Parent, char *Name, Uint Flags)\r
 {\r
        return 0;\r
 }\r
@@ -455,7 +460,7 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name)
        if( !Ext2_int_ReadInode(Disk, InodeID, &inode) )\r
                return NULL;\r
        \r
-       if( (tmpNode = inode_getCache(Disk->CacheID, InodeID)) )\r
+       if( (tmpNode = Inode_GetCache(Disk->CacheID, InodeID)) )\r
                return tmpNode;\r
        \r
        \r
@@ -485,11 +490,11 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name)
                break;\r
        // Regular File\r
        case EXT2_S_IFREG:\r
-               retNode.flags = 0;\r
+               retNode.Flags = 0;\r
                break;\r
        // Directory\r
        case EXT2_S_IFDIR:\r
-               retNode.ReadRir = Ext2_ReadDir;\r
+               retNode.ReadDir = Ext2_ReadDir;\r
                retNode.FindDir = Ext2_FindDir;\r
                retNode.MkNod = Ext2_MkNod;\r
                //retNode.Relink = Ext2_Relink;\r
@@ -497,12 +502,12 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name)
                break;\r
        // Unknown, Write protect and hide it to be safe \r
        default:\r
-               retNode.flags = VFS_FFLAG_READONLY|VFS_FFLAG_HIDDEN;\r
+               retNode.Flags = VFS_FFLAG_READONLY;//|VFS_FFLAG_HIDDEN;\r
                break;\r
        }\r
        \r
        // Check if the file should be hidden\r
-       if(Name[0] == '.')      retNode.Flags |= VFS_FFLAG_HIDDEN;\r
+       //if(Name[0] == '.')    retNode.Flags |= VFS_FFLAG_HIDDEN;\r
        \r
        // Set Timestamps\r
        retNode.ATime = now();\r
@@ -532,11 +537,11 @@ int Ext2_int_ReadInode(tExt2_Disk *Disk, Uint InodeId, tExt2_Inode *Inode)
        \r
        //LogF(" Ext2_int_ReadInode: group=%i, subId = %i\n", group, subId);\r
        \r
-       //Seek to Block - Absolute\r
-       vfs_seek(Disk->fd, Disk->Groups[group].bg_inode_table * Disk->BlockSize, SEEK_SET);\r
-       //Seeek to inode - Relative\r
-       vfs_seek(Disk->fd, sizeof(tExt2_Inode)*subId, SEEK_CUR);\r
-       vfs_read(Disk->fd, sizeof(tExt2_Inode), Inode);\r
+       // Read Inode\r
+       VFS_ReadAt(Disk->FD,\r
+               Disk->Groups[group].bg_inode_table * Disk->BlockSize + sizeof(tExt2_Inode)*subId,\r
+               sizeof(tExt2_Inode),\r
+               Inode);\r
        return 1;\r
 }\r
 \r
@@ -556,7 +561,7 @@ Uint64 Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum)
        \r
        // Single Indirect Blocks\r
        iBlocks = malloc( Disk->BlockSize );\r
-       VFS_ReadAt(Disk->fd, (Uint64)Blocks[12]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)Blocks[12]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
        \r
        BlockNum -= 12;\r
        if(BlockNum < 256) {\r
@@ -568,16 +573,16 @@ Uint64 Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum)
        // Double Indirect Blocks\r
        if(BlockNum < 256*256)\r
        {\r
-               VFS_ReadAt(Disk->fd, (Uint64)Blocks[13]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
-               VFS_ReadAt(Disk->fd, (Uint64)iBlocks[BlockNum/256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+               VFS_ReadAt(Disk->FD, (Uint64)Blocks[13]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+               VFS_ReadAt(Disk->FD, (Uint64)iBlocks[BlockNum/256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
                BlockNum = iBlocks[BlockNum%256];\r
                free(iBlocks);\r
                return (Uint64)BlockNum * Disk->BlockSize;\r
        }\r
        // Triple Indirect Blocks\r
-       VFS_ReadAt(Disk->fd, (Uint64)Blocks[14]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
-       VFS_ReadAt(Disk->fd, (Uint64)iBlocks[BlockNum/(256*256)]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
-       VFS_ReadAt(Disk->fd, (Uint64)iBlocks[(BlockNum/256)%256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)Blocks[14]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)iBlocks[BlockNum/(256*256)]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)iBlocks[(BlockNum/256)%256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
        BlockNum = iBlocks[BlockNum%256];\r
        free(iBlocks);\r
        return (Uint64)BlockNum * Disk->BlockSize;\r
index 01c90c2..d70fae0 100644 (file)
@@ -25,7 +25,7 @@ typedef struct s_lfncache {
 \r
 // === PROTOTYPES ===\r
  int   FAT_Install(char **Arguments);\r
-tVFS_Node      *FAT_InitDevice(char *device, char *options);\r
+tVFS_Node      *FAT_InitDevice(char *device, char **options);\r
 void   FAT_Unmount(tVFS_Node *Node);\r
 Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);\r
 Uint64 FAT_Write(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);\r
@@ -36,7 +36,7 @@ tVFS_Node     *FAT_FindDir(tVFS_Node *dirNode, char *file);
 void   FAT_CloseFile(tVFS_Node *node);\r
 \r
 // === SEMI-GLOBALS ===\r
-MODULE_DEFINE(0, 0x5B /*v0.90*/, FAT32, FAT_Install, NULL);\r
+MODULE_DEFINE(0, 0x51 /*v0.80*/, FAT32, FAT_Install, NULL);\r
 tFAT_VolInfo   gFAT_Disks[8];\r
  int   giFAT_PartCount = 0;\r
 #if CACHE_FAT\r
@@ -61,10 +61,10 @@ int FAT_Install(char **Arguments)
 }\r
 \r
 /**\r
- * \fn tVFS_Node *FAT_InitDevice(char *Device, char *options)\r
+ * \fn tVFS_Node *FAT_InitDevice(char *Device, char **options)\r
  * \brief Reads the boot sector of a disk and prepares the structures for it\r
  */\r
-tVFS_Node *FAT_InitDevice(char *Device, char *options)\r
+tVFS_Node *FAT_InitDevice(char *Device, char **options)\r
 {\r
        fat_bootsect *bs;\r
         int    i;\r
index e27c636..7a1dade 100644 (file)
@@ -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) {
index bfa1fc1..3d1f8e5 100644 (file)
@@ -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);
index f49c721..c4ab833 100644 (file)
@@ -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;
index 1408655..a1245f3 100644 (file)
@@ -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;
 }
index 65d3fa0..57adb85 100644 (file)
@@ -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
index 2e51419..d6c40d6 100644 (file)
@@ -17,18 +17,17 @@ void        Parse_Args(char *str, char **dest);
 void   CallCommand(char **Args);\r
 void   Command_Logout(int argc, char **argv);\r
 void   Command_Clear(int argc, char **argv);\r
-void   Command_Colour(int argc, char **argv);\r
+void   Command_Help(int argc, char **argv);\r
 void   Command_Cd(int argc, char **argv);\r
 void   Command_Dir(int argc, char **argv);\r
 \r
 // ==== CONSTANT GLOBALS ====\r
-char   *cCOLOUR_NAMES[8] = {"black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"};\r
 struct {\r
        char    *name;\r
        void    (*fcn)(int argc, char **argv);\r
 }      cBUILTINS[] = {\r
        {"exit", Command_Logout},       {"logout", Command_Logout},\r
-       {"colour", Command_Colour}, {"clear", Command_Clear},\r
+       {"help", Command_Help}, {"clear", Command_Clear},\r
        {"cd", Command_Cd}, {"dir", Command_Dir}\r
 };\r
 static char    *cDEFAULT_PATH[] = {"/Acess/Bin"};\r
@@ -77,8 +76,9 @@ int main(int argc, char *argv[], char *envp[])
                if(saArgs[0])   free(saArgs);\r
                if(!bCached)    free(sCommandStr);\r
                bCached = 0;\r
+               \r
                write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory);\r
-               write(_stdout, 3, "$ ");\r
+               write(_stdout, 2, "$ ");\r
                \r
                // Read Command line\r
                sCommandStr = ReadCommandLine( &length );\r
@@ -135,6 +135,7 @@ char *ReadCommandLine(int *Length)
        char    *ret;\r
         int    len, pos, space = 1023;\r
        char    ch;\r
+       // int  scrollbackPos = giLastCommand;\r
         \r
        // Preset Variables\r
        ret = malloc( space+1 );\r
@@ -149,14 +150,43 @@ char *ReadCommandLine(int *Length)
                        read(_stdin, 1, &ch);   // Read control character\r
                        switch(ch)\r
                        {\r
-                       case 'D':       if(pos) pos--;  break;\r
-                       case 'C':       if(pos<len)     pos++;  break;\r
+                       //case 'D':     if(pos) pos--;  break;\r
+                       //case 'C':     if(pos<len)     pos++;  break;\r
                        case '[':\r
                                read(_stdin, 1, &ch);   // Read control character\r
                                switch(ch)\r
                                {\r
-                               case 'D':       if(pos) pos--;  break;\r
-                               case 'C':       if(pos<len)     pos++;  break;\r
+                               #if 0\r
+                               case 'A':       // Up\r
+                                       if( scrollbackPos > 0 ) break;\r
+                                       \r
+                                       free(ret);\r
+                                       ret = strdup( gasCommandHistory[--scrollbackPos] );\r
+                                       \r
+                                       len = strlen(ret);\r
+                                       while(pos--)    write(_stdout, 3, "\x1B[D");\r
+                                       while(pos++ < len)      write(_stdout, 3, "\x1B[C");\r
+                                       break;\r
+                               case 'B':       // Down\r
+                                       if( scrollbackPos < giLastCommand-1 )   break;\r
+                                       free(ret);\r
+                                       ret = strdup( gasCommandHistory[++scrollbackPos] );\r
+                                       \r
+                                       len = strlen(ret);\r
+                                       while(pos--)    write(_stdout, 3, "\x1B[D");\r
+                                       while(pos++ < len)      write(_stdout, 3, "\x1B[C");\r
+                                       break;\r
+                               #endif\r
+                               case 'D':       // Left\r
+                                       if(pos == 0)    break;\r
+                                       pos --;\r
+                                       write(_stdout, 3, "\x1B[D");\r
+                                       break;\r
+                               case 'C':       // Right\r
+                                       if(pos == len-1)        break;\r
+                                       pos++;\r
+                                       write(_stdout, 3, "\x1B[C");\r
+                                       break;\r
                                }\r
                        }\r
                        continue;\r
@@ -331,76 +361,32 @@ void Command_Logout(int argc, char **argv)
 }\r
 \r
 /**\r
- * \fn void Command_Clear(int argc, char **argv)\r
- * \brief Clear the screen\r
+ * \fn void Command_Colour(int argc, char **argv)\r
+ * \brief Displays the help screen\r
  */\r
-void Command_Clear(int argc, char **argv)\r
+void Command_Help(int argc, char **argv)\r
 {\r
-       write(_stdout, 4, "\x1B[2J");   //Clear Screen\r
+       Print("Acess 2 Command Line Interface\n");\r
+       Print(" By John Hodge (thePowersGang / [TPG])\n");\r
+       Print("\n");\r
+       Print("Builtin Commands:\n");\r
+       Print(" logout: Return to the login prompt\n");\r
+       Print(" exit:   Same\n");\r
+       Print(" help:   Display this message\n");\r
+       Print(" clear:  Clear the screen\n");\r
+       Print(" cd:     Change the current directory\n");\r
+       Print(" dir:    Print the contents of the current directory\n");\r
+       //Print("\n");\r
+       return;\r
 }\r
 \r
 /**\r
- * \fn void Command_Colour(int argc, char **argv)\r
- * \brief Set the colour of the shell prompt\r
- * \note Conflicts with coloured `dir` display\r
+ * \fn void Command_Clear(int argc, char **argv)\r
+ * \brief Clear the screen\r
  */\r
-void Command_Colour(int argc, char **argv)\r
+void Command_Clear(int argc, char **argv)\r
 {\r
-       int fg, bg;\r
-       char    clrStr[6] = "\x1B[37m";\r
-       \r
-       // Verify Arg Count\r
-       if(argc < 2)\r
-       {\r
-               goto usage;\r
-       }\r
-       \r
-       // Check Colour\r
-       for(fg=0;fg<8;fg++)\r
-               if(strcmp(cCOLOUR_NAMES[fg], argv[1]) == 0)\r
-                       break;\r
-\r
-       // Foreground a valid colour\r
-       if(fg == 8) {\r
-               Print("Unknown Colour '");Print(argv[1]);Print("'\n");\r
-               goto usage;\r
-       }\r
-       // Set Foreground\r
-       clrStr[3] = '0' + fg;\r
-       write(_stdout, 6, clrStr);\r
-       \r
-       // Need to Set Background?\r
-       if(argc > 2)\r
-       {\r
-               for(bg=0;bg<8;bg++)\r
-                       if(strcmp(cCOLOUR_NAMES[bg], argv[2]) == 0)\r
-                               break;\r
-       \r
-               // Valid colour\r
-               if(bg == 8)\r
-               {\r
-                       Print("Unknown Colour '");Print(argv[2]);Print("'\n");\r
-                       goto usage;\r
-               }\r
-       \r
-               clrStr[2] = '4';\r
-               clrStr[3] = '0' + bg;\r
-               write(_stdout, 6, clrStr);\r
-       }\r
-       // Return\r
-       return;\r
-\r
-       // Function Usage (Requested via a Goto (I know it's ugly))\r
-usage:\r
-       Print("Usage: colour <foreground> [<background>]\n");\r
-       Print("Valid Colours are ");\r
-       for(fg=0;fg<8;fg++)\r
-       {\r
-               Print(cCOLOUR_NAMES[fg]);\r
-               write(_stdout, 3, ", ");\r
-       }\r
-       write(_stdout, 4, "\b\b\n");\r
-       return;\r
+       write(_stdout, 4, "\x1B[2J");   //Clear Screen\r
 }\r
 \r
 /**\r
index f8cd151..146177d 100644 (file)
@@ -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
index 57ff306..297f5f9 100644 (file)
@@ -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 (file)
index 0000000..276cc83
--- /dev/null
@@ -0,0 +1,27 @@
+# Project: mount\r
+\r
+-include ../Makefile.cfg\r
+\r
+COBJ = main.o
+BIN = ../mount\r
+\r
+CFLAGS  += -Wall -fno-builtin -fno-stack-protector\r
+LDFLAGS += \r
+\r
+.PHONY : all clean\r
+\r
+all: $(BIN)\r
+\r
+$(BIN): $(COBJ)\r
+       @echo --- $(LD) -o $@\r
+       @$(LD) $(LDFLAGS) -o $@ $(COBJ) -Map Map.txt\r
+       objdump -d $(BIN) > $(BIN).dsm\r
+       cp $(BIN) $(DISTROOT)/Bin/\r
+\r
+clean:\r
+       $(RM) $(COBJ) $(BIN)\r
+\r
+$(COBJ): %.o: %.c\r
+       @echo --- GCC -o $@
+       @$(CC) $(CFLAGS) -c $? -o $@
+\r
diff --git a/Usermode/Applications/mount_src/main.c b/Usermode/Applications/mount_src/main.c
new file mode 100644 (file)
index 0000000..b84e85f
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Acess2 mount command
+ */
+#include <acess/sys.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#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 <type>] <device> <directory>\n");
+       fprintf(stderr, "or  %s <device>\n");
+       fprintf(stderr, "or  %s <directory>\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;
+}
index 22066f9..bc2efbd 100644 (file)
@@ -30,9 +30,11 @@ extern Uint  GetSymbol(char *name);
 extern int     GetSymbolFromBase(Uint base, char *name, Uint *ret);\r
 \r
 // === Library Functions ===\r
-extern void    strcpy(char *dest, char *src);
-extern int     strcmp(char *s1, char *s2);\r
-extern int     strlen(char *str);\r
+extern char    *strcpy(char *dest, const char *src);\r
+extern char    *strcat(char *dest, const char *src);
+extern int     strcmp(const char *s1, const char *s2);\r
+extern int     strlen(const char *str);\r
+extern int     file_exists(char *filename);\r
 \r
 // === System Calls ===\r
 extern void    SysExit();\r
@@ -40,6 +42,8 @@ extern void   SysDebug(char *fmt, ...);       //!< Now implemented in main.c
 extern void    SysDebugV(char *fmt, ...);\r
 extern Uint    SysLoadBin(char *path, Uint *entry);\r
 extern Uint    SysUnloadBin(Uint Base);\r
+extern int     open(char *filename, int flags);\r
+extern void    close(int fd);\r
 
 // === ELF Loader ===
 extern int     ElfGetSymbol(Uint Base, char *name, Uint *ret);\r
index eb275ee..3797333 100644 (file)
@@ -9,6 +9,8 @@
 [global _SysExit]\r
 [global _SysLoadBin]\r
 [global _SysUnloadBin]\r
+[global _open]\r
+[global _close]\r
 \r
 ; void SysDebugV(char *fmt, va_list Args)\r
 _SysDebug:\r
@@ -56,3 +58,22 @@ _SysUnloadBin:
        int     0xAC\r
        pop ebx\r
        ret\r
+\r
+; int close(char *name, int flags)\r
+_open:\r
+       push ebx\r
+       mov eax, SYS_OPEN\r
+       mov ebx, [esp+0x8]      ; Filename\r
+       mov ecx, [esp+0xC]      ; Flags\r
+       int 0xAC\r
+       pop ebx\r
+       ret\r
+\r
+; void close(int fd)\r
+_close:\r
+       push ebx\r
+       mov eax, SYS_CLOSE\r
+       mov ebx, [esp+0x8]      ; File Descriptor\r
+       int 0xAC\r
+       pop ebx\r
+       ret\r
index 0d01dc2..3acc129 100644 (file)
@@ -6,25 +6,57 @@
 #include "common.h"\r
 \r
 // === CODE ===\r
-void strcpy(char *dest, char *src)\r
+char *strcpy(char *dest, const char *src)\r
 {\r
+       char    *ret = dest;\r
        while(*src) {\r
                *dest = *src;\r
                src ++; dest ++;\r
        }\r
        *dest = '\0';\r
+       return ret;\r
+}\r
+\r
+char *strcat(char *dest, const char *src)\r
+{\r
+       char    *ret = dest;\r
+       while(*dest)    dest++;\r
+       while(*src)             *dest++ = *src++;\r
+       *dest = '\0';\r
+       return ret;\r
 }
-
-int strcmp(char *s1, char *s2)
+\r
+/**\r
+ * \fn int strcmp(const char *s1, const char *s2)\r
+ * \brief Compare two strings\r
+ */
+int strcmp(const char *s1, const char *s2)
 {
        while(*s1 && *s1 == *s2) s1++,s2++;
        return *s1-*s2;
 }\r
 \r
-int strlen(char *str)\r
+/**\r
+ * \fn int strlen(const char *str)\r
+ * \brief \r
+ */\r
+int strlen(const char *str)\r
 {\r
         int    len = 0;\r
        while(*str)     len++,str++;\r
        return len;\r
 }
-
+\r
+/**\r
+ * \fn int file_exists(char *filename)\r
+ * \brief Checks if a file exists\r
+ */
+int file_exists(char *filename)\r
+{\r
+        int    fd;\r
+        //fd = open(filename, OPENFLAG_READ);\r
+        fd = open(filename, 0);\r
+        if(fd == -1)   return 0;\r
+        close(fd);\r
+        return 1;\r
+}\r
index 8583141..b5fb0a1 100644 (file)
 # define DEBUGS(v...)  \r
 #endif\r
 \r
+// === CONSTANTS ===\r
+#define        MAX_LOADED_LIBRARIES    64\r
+#define        MAX_STRINGS_BYTES       4096\r
+#define        SYSTEM_LIB_DIR  "/Acess/Libs/"\r
+\r
 // === PROTOTYPES ===\r
 Uint   IsFileLoaded(char *file);
  int   GetSymbolFromBase(Uint base, char *name, Uint *ret);\r
 \r
 // === GLOABLS ===\r
-#define        MAX_LOADED_LIBRARIES    64\r
-#define        MAX_STRINGS_BYTES       4096\r
 struct {\r
        Uint    Base;\r
        char    *Name;\r
@@ -28,23 +31,48 @@ char        *gsNextAvailString = gsLoadedStrings;
 //tLoadLib     *gpLoadedLibraries = NULL;\r
 \r
 // === CODE ===\r
-Uint LoadLibrary(char *filename, char *SearchDir, char **envp)\r
+char *FindLibrary(char *DestBuf, char *SoName, char *ExtraSearchDir)\r
+{      \r
+       // -- #1: Executable Specified\r
+       if(ExtraSearchDir)\r
+       {\r
+               strcpy(DestBuf, ExtraSearchDir);\r
+               strcat(DestBuf, "/");\r
+               strcat(DestBuf, SoName);\r
+               if(file_exists(DestBuf))        return DestBuf;\r
+       }\r
+       \r
+       // -- #2: System\r
+       strcpy(DestBuf, SYSTEM_LIB_DIR);\r
+       strcat(DestBuf, SoName);\r
+       if(file_exists(DestBuf))        return DestBuf;\r
+       \r
+       // -- #3: Current Directory\r
+       if(file_exists(SoName)) return SoName;\r
+       \r
+       return NULL;\r
+}\r
+\r
+/**\r
+ */\r
+Uint LoadLibrary(char *SoName, char *SearchDir, char **envp)\r
 {\r
-       char    sTmpName[1024] = "/Acess/Libs/";\r
+       char    sTmpName[1024];\r
+       char    *filename;\r
        Uint    iArg;\r
        void    (*fEntry)(int, int, char *[], char**);\r
        \r
        DEBUGS("LoadLibrary: (filename='%s', envp=0x%x)\n", filename, envp);\r
        \r
        // Create Temp Name\r
-       strcpy(&sTmpName[12], filename);\r
-       DEBUGS(" LoadLibrary: sTmpName='%s'\n", sTmpName);\r
+       filename = FindLibrary(sTmpName, SoName, SearchDir);\r
+       DEBUGS(" LoadLibrary: filename='%s'\n", filename);\r
        \r
-       if( (iArg = IsFileLoaded(sTmpName)) )\r
+       if( (iArg = IsFileLoaded(filename)) )\r
                return iArg;\r
        \r
        // Load Library\r
-       iArg = SysLoadBin(sTmpName, (Uint*)&fEntry);\r
+       iArg = SysLoadBin(filename, (Uint*)&fEntry);\r
        if(iArg == 0) {\r
                DEBUGS("LoadLibrary: RETURN 0\n");\r
                return 0;\r
@@ -53,10 +81,10 @@ Uint LoadLibrary(char *filename, char *SearchDir, char **envp)
        DEBUGS(" LoadLibrary: iArg=0x%x, iEntry=0x%x\n", iArg, fEntry);\r
        \r
        // Load Symbols\r
-       fEntry = (void*)DoRelocate( iArg, envp, sTmpName );\r
+       fEntry = (void*)DoRelocate( iArg, envp, filename );\r
        \r
        // Call Entrypoint\r
-       DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", filename, fEntry);\r
+       DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", SoName, fEntry);\r
        fEntry(iArg, 0, NULL, envp);\r
        \r
        DEBUGS("LoadLibrary: RETURN 1\n");\r
index 1f9ba34..77c3078 100644 (file)
@@ -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*
index 23a760d..1645cde 100644 (file)
@@ -41,8 +41,8 @@ EXPORT FILE *freopen(FILE *fp, char *file, char *mode)
        \r
        if(fp->Flags) {\r
                fflush(fp);\r
-               close(fp->FD);\r
-       }\r
+       } else\r
+               fp->FD = -1;\r
        \r
        // Get main mode\r
        switch(mode[0])\r
@@ -82,7 +82,10 @@ EXPORT FILE *freopen(FILE *fp, char *file, char *mode)
        }\r
        \r
        //Open File\r
-       fp->FD = reopen(fp->FD, file, openFlags);\r
+       if(fp->FD != -1)\r
+               fp->FD = reopen(fp->FD, file, openFlags);\r
+       else\r
+               fp->FD = open(file, openFlags);\r
        if(fp->FD == -1) {\r
                fp->Flags = 0;\r
                return NULL;\r
@@ -124,6 +127,21 @@ EXPORT void fflush(FILE *fp)
        ///\todo Implement\r
 }\r
 \r
+EXPORT long int ftell(FILE *fp)\r
+{\r
+       if(!fp || !fp->FD)      return -1;\r
+       \r
+       return tell(fp->FD);\r
+}\r
+\r
+EXPORT int fseek(FILE *fp, long int amt, int whence)\r
+{\r
+       if(!fp || !fp->FD)      return -1;\r
+       \r
+       return seek(fp->FD, amt, whence);\r
+}\r
+\r
+\r
 /**\r
  * \fn EXPORT int vfprintf(FILE *fp, const char *format, va_list args)\r
  * \brief Print to a file from a variable argument list\r
@@ -172,6 +190,8 @@ EXPORT int fprintf(FILE *fp, const char *format, ...)
 }\r
 \r
 /**\r
+ * \fn EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp)\r
+ * \brief Write to a stream\r
  */\r
 EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp)\r
 {\r
@@ -183,6 +203,20 @@ EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp)
        return ret;\r
 }\r
 \r
+/**\r
+ * \fn EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp)\r
+ * \brief Read from a stream\r
+ */\r
+EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp)\r
+{\r
+        int    ret;\r
+       if(!fp || !fp->FD)      return -1;\r
+       \r
+       ret = read(fp->FD, size*num, ptr);\r
+       \r
+       return ret;\r
+}\r
+\r
 /**\r
  * \fn EXPORT int fputc(int c, FILE *fp)\r
  * \brief Write a single character to the stream\r
index 9d5194b..49c5eb4 100644 (file)
@@ -16,4 +16,6 @@ lib.h
 #define        LOCAL\r
 #endif\r
 \r
+extern void *memcpy(void *dest, const void *src, size_t n);\r
+\r
 #endif\r
index 850d269..ce5a8d0 100644 (file)
@@ -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 *))\r
 {\r
         int    i, j, min;\r
+       // With 0 items, there's nothing to do and with 1 its already sorted\r
+       if(nmemb == 0 || nmemb == 1)    return;\r
+       \r
+       // SORT!\r
        for( i = 0; i < (nmemb-1); i++ )\r
        {\r
                min = i;\r
index 707e5bb..d1e39af 100644 (file)
@@ -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);
index 78d1a59..26d9c68 100644 (file)
@@ -5,6 +5,7 @@
 #ifndef __STDIO_H\r
 #define __STDIO_H
 \r
+#include <stdlib.h>\r
 #include <stdarg.h>\r
 
 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);\r
 extern void fflush(FILE *fp);\r
+extern long int        ftell(FILE *fp);\r
+extern int     fseek(FILE *fp, long int amt, int whence);\r
 \r
 extern size_t  fread(void *buf, size_t size, size_t n, FILE *fp);\r
 extern size_t  fwrite(void *buf, size_t size, size_t n, FILE *fp);\r
index 158aeeb..beeff60 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef __STRING_H
 #define __STRING_H
 
+#include <stdlib.h>
+
 // Memory
 extern void *memset(void *dest, int val, size_t count);
 extern void *memcpy(void *dest, const void *src, size_t count);

UCC git Repository :: git.ucc.asn.au