view cos/kernel/initrd.c @ 41:35cc54e078dd

Added memory functions
author windel
date Fri, 03 Feb 2012 17:56:41 +0100
parents 3a6a9b929db0
children e47bfef80baf
line wrap: on
line source

/*
 * Initial ramdisk filesystem driver.
 * */

#include "kernel.h"

// Global data struct:
initrd_file_header_t *files;

fs_node_t* initialize_initrd(uint64_t location)
{
   uint32_t *u32ptr;

   u32ptr = (uint32_t*)location;
   if (*u32ptr != 0x1337babe)
   {
      printf("Invalid ramdisk magic\n");
      return 0;
   }

   // Allocate root dir:
   fs_node_t *root = (fs_node_t*)kmalloc(sizeof(fs_node_t));
   memset(root, 0, sizeof(fs_node_t));
   root->flags = FS_DIRECTORY;
   root->readdir = initrd_readdir;
   
   u32ptr++;
   root->length = *u32ptr;
   
   // Allocate an node for each file.
   void *x = kmalloc(sizeof(fs_node_t) * root->length);
   memset(x, 0, sizeof(fs_node_t) * root->length);

   for (i = 0; i < root->length; i++)
   {
      
   }

   return root;
}

void load_ramdisk()
{
   printf("Ramdisk location: %p\n", ramdisk_location);

   fs_node_t *root = initialize_initrd(ramdisk_location);

   if (root != 0)
   {
      fs_node_t *node = 0;
      int i = 0;
      while ( (node = readdir_fs(root, i)) != 0)
      {
         printf("File %s\n", node->name);
      }
   }
}

static uint64_t initrd_read(fs_node_t *node, uint64_t offset, uint64_t size, void *buffer)
{
   // TODO: check errors

   if (size > node->length)
   {
      return 0;
   }

   if (size + offset > node->length)
   {
      size = node->length - offset;
   }

   memcpy(buffer, node.data + offset, size);
   return size;
}

fs_node_t *readdir(fs_node_t *dir, int index)
{
   if (index >= dir->length)
   {
      return 0;
   }
}