fdc.c revision 0c34933fc8f84dd5183d1897881bbc7683d24541
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * VBox storage devices:
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * Floppy disk controller
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * Copyright (C) 2006-2007 innotek GmbH
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * available from http://www.virtualbox.org. This file is free software;
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * you can redistribute it and/or modify it under the terms of the GNU
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * General Public License as published by the Free Software Foundation,
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * --------------------------------------------------------------------
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * This code is based on:
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * QEMU Floppy disk emulator (Intel 82078)
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * Copyright (c) 2003 Jocelyn Mayer
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * Permission is hereby granted, free of charge, to any person obtaining a copy
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync * of this software and associated documentation files (the "Software"), to deal
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * in the Software without restriction, including without limitation the rights
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * copies of the Software, and to permit persons to whom the Software is
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * furnished to do so, subject to the following conditions:
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * The above copyright notice and this permission notice shall be included in
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * all copies or substantial portions of the Software.
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
8ddb51786b506ba3395546aa1af6cac6d3114e1cvboxsync * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#include "Builtins.h"
#include "../vl_vbox.h"
#define PDMIMOUNTNOTIFY_2_FDRIVE(p) \
#ifndef VBOX
#include "vl.h"
#ifndef VBOX
#ifdef DEBUG_FLOPPY
# ifdef LOG_ENABLED
if (LogIsEnabled ()) {
RTLogLogger (NULL, NULL, "floppy: %N", fmt, &args); /* %N - nested va_list * type formatting call. */
#ifndef VBOX
#ifdef VBOX
typedef enum fdisk_type_t {
} fdisk_type_t;
typedef enum fdrive_type_t {
typedef enum fdrive_flags_t {
typedef enum fdisk_flags_t {
typedef struct fdrive_t {
#ifndef VBOX
bool fMediaPresent;
} fdrive_t;
#ifndef VBOX
int enable_seek)
int ret;
ret = 0;
if (!enable_seek) {
return ret;
typedef struct fd_format_t {
const char *str;
} fd_format_t;
#ifndef VBOX
nb_heads = 0;
max_track = 0;
last_sect = 0;
#ifndef VBOX
match = i;
first_match = i;
#ifdef VBOX
#ifdef VBOX
#ifndef VBOX
void *opaque,
unsigned nchan,
FD_DIR_WRITE = 0,
struct fdctrl_t {
#ifndef VBOX
#ifndef VBOX
int irq_lvl;
int dma_chann;
#ifdef VBOX
return retval;
#ifndef VBOX
#ifndef VBOX
if (!fdctrl)
return NULL;
if (fds[i]) {
if (mem_mapped) {
return fdctrl;
#ifdef VBOX
#ifdef VBOX
for (i = 0; i < MAX_FD; i++)
if (do_irq)
#ifndef VBOX
return retval;
return retval;
return retval;
#ifndef VBOX
if (retval != 0)
return retval;
if (do_irq)
/* Set an error: unimplemented/unknown command */
#ifdef VBOX
int did_seek;
did_seek = 0;
if (did_seek)
int tmp;
int dma_mode;
#ifndef VBOX
#ifndef VBOX
#include <stdio.h>
#include <stdlib.h>
static FILE * f;
size_t n;
exit (0);
exit (0);
#define dump(a,b) do { } while (0)
#ifdef VBOX
void *opaque,
unsigned nchan,
#ifdef VBOX
int rc;
#ifndef VBOX
len = 0;
goto transfer_error;
#ifndef VBOX
case FD_DIR_READ:
#ifdef VBOX
len,
&read);
case FD_DIR_WRITE:
#ifdef VBOX
len,
&written);
#ifndef VBOX
goto transfer_error;
goto transfer_error;
int ret;
#ifdef VBOX
int rc;
len,
&read);
if (ret == 0) {
goto end_transfer;
goto end_transfer;
if (rel_pos == 0) {
return len;
#ifndef VBOX
len = 0;
goto transfer_error;
#ifndef VBOX
int rc;
case FD_DIR_READ:
#ifdef VBOX
len);
case FD_DIR_WRITE:
#ifdef VBOX
int rc;
len);
goto transfer_error;
goto transfer_error;
int ret;
#ifdef VBOX
len);
if (ret == 0) {
goto end_transfer;
goto end_transfer;
if (rel_pos == 0) {
return len;
#ifdef VBOX
int rc;
if (pos == 0) {
#ifdef VBOX
return retval;
int did_seek;
#ifdef VBOX
did_seek = 0;
#ifdef VBOX
if (ok) {
#ifdef VBOX
int rc;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
switch (value) {
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
goto enqueue;
#ifndef VBOX
#ifdef VBOX
#ifdef VBOX
void *pvUser,
unsigned cb)
return VINF_SUCCESS;
void *pvUser,
unsigned cb)
return VINF_SUCCESS;
return VERR_IOM_IOPORT_UNUSED;
switch (enmInterface) {
case PDMINTERFACE_BASE:
case PDMINTERFACE_BLOCK_PORT:
return NULL;
unsigned iLUN,
return VINF_SUCCESS;
return VERR_PDM_LUN_NOT_FOUND;
switch (enmInterface) {
case PDMINTERFACE_BASE:
case PDMINTERFACE_LED_PORTS:
return NULL;
int rc;
return rc;
unsigned iLUN)
int rc;
AssertMsgFailed (("Configuration error: cannot attach or detach any but the first two LUNs - iLUN=%u\n",
iLUN));
return VERR_PDM_DEVINS_NO_ATTACH;
return rc;
unsigned iLUN)
switch (iLUN) {
int iInstance,
int rc;
bool mem_mapped;
return rc;
return rc;
return rc;
mem_mapped = false;
return rc;
rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, fdc_timer, "FDC Timer", &fdctrl->result_timer);
return rc;
fdctrl);
return rc;
if (mem_mapped) {
return VERR_NOT_SUPPORTED;
return rc;
return rc;
return rc;
rc));
return rc;
return rc;
return VINF_SUCCESS;
sizeof(fdctrl_t),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,