Example #1
0
void init_fat(){
	ushort* mbr = (ushort*) kmalloc(512);
	ata_read_block(mbr, 0);
	memcpy(&fat_header, mbr, sizeof(fat_header_t));
	kfree(mbr);

	cluster_list = (ushort*) kmalloc(fat_header.sectors_per_fat * 512);
	ata_read_blocks(cluster_list, fat_header.number_reserved, fat_header.sectors_per_fat);

	fat_dir = (fat_dir_t*) kmalloc(32 * fat_header.dir_size);
	ata_read_blocks((ushort*) fat_dir, fat_header.number_reserved + FAT_TOTAL_SIZE, FAT_DIR_SIZE);

	ASSERT(((fat_header.dir_size * 32) % 512) == 0);
}
Example #2
0
static void hard_drive_handle_connection (ata_drive_type *ata_drive, 
                                          mailbox_id_type reply_mailbox_id)
{
  message_parameter_type message_parameter;
  ipc_structure_type ipc_structure;
  bool done = FALSE;
  u32 *data;
  unsigned int data_size = 1024;

  memory_allocate ((void **) &data, data_size);

  /* Accept the connection. */ 

  ipc_structure.output_mailbox_id = reply_mailbox_id;
  ipc_connection_establish (&ipc_structure);

  message_parameter.block = TRUE;

  while (!done)
  {
    message_parameter.protocol = IPC_PROTOCOL_BLOCK;
    message_parameter.message_class = IPC_CLASS_NONE;
    message_parameter.length = data_size;
    message_parameter.data = data;
  
    if (ipc_receive (ipc_structure.input_mailbox_id, &message_parameter,
                     &data_size) != IPC_RETURN_SUCCESS)
    {
      continue;
    }
    
    switch (message_parameter.message_class)
    {
      case IPC_BLOCK_READ:
      {
        ipc_block_read_type *ipc_block_read = (ipc_block_read_type *) data;

        /* FIXME: Do some boundary checking. */
#ifdef DEBUG
        log_print_formatted (&log_structure, LOG_URGENCY_DEBUG,
                               "Reading blocks %u-%u data.", 
                               ipc_block_read->start_block_number,
                               ipc_block_read->start_block_number +
                               ipc_block_read->number_of_blocks);
#endif
        ata_read_block (ata_drive, ipc_block_read->start_block_number,
            message_parameter.data, ipc_block_read->number_of_blocks);
        message_parameter.length = ipc_block_read->number_of_blocks;
        message_parameter.block = TRUE;
        
        ipc_send (ipc_structure.output_mailbox_id, &message_parameter);
	
        break;
      }
      
      case IPC_BLOCK_WRITE:
      {
        break;
      }
      
      case IPC_BLOCK_GET_INFO:
      {
	break;
      }
    }
  }
}