DevDMA.cpp revision cad8876b46f9e366c4a1007a40c27ca1df078950
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * DevDMA - DMA Controller Device.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * available from http://www.virtualbox.org. This file is free software;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * you can redistribute it and/or modify it under the terms of the GNU
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * General Public License (GPL) as published by the Free Software
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * additional information or have any questions.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * --------------------------------------------------------------------
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * This code is based on:
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * QEMU DMA emulation
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Copyright (c) 2003 Vassili Karpov (malc)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Permission is hereby granted, free of charge, to any person obtaining a copy
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * of this software and associated documentation files (the "Software"), to deal
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * in the Software without restriction, including without limitation the rights
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * copies of the Software, and to permit persons to whom the Software is
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * furnished to do so, subject to the following conditions:
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * The above copyright notice and this permission notice shall be included in
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * all copies or substantial portions of the Software.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * THE SOFTWARE.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/*******************************************************************************
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync* Header Files *
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync*******************************************************************************/
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define LOG_GROUP LOG_GROUP_DEFAULT ///@todo LOG_GROUP_DEV_DMA
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#else /* !VBOX */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/* #define DEBUG_DMA */
#ifndef __WIN32__
#ifdef DEBUG_DMA
#define lwarn(...)
#define linfo(...)
#define ldebug(...)
#define dolog()
#define lwarn()
#define linfo()
#define ldebug()
# ifdef LOG_ENABLED
# define DEBUG_DMA
if (LogIsEnabled ()) {
#define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))
struct dma_regs {
void *opaque;
#define ADDR 0
struct dma_cont {
unsigned int dshift;
} DMAState;
int ichan;
int ichan;
int ichan;
int ichan;
struct dma_regs *r;
int ff;
return ff;
struct dma_regs *r;
if (nreg)
struct dma_regs *r;
if (getff (d)) {
switch (iport) {
#ifdef DEBUG_DMA
d->flip_flop = 0;
d->flip_flop = 0;
d->mask = ~0;
d->status = 0;
d->command = 0;
d->mask = 0;
#ifdef DEBUG_DMA
switch (iport) {
val = 0;
return val;
#ifdef DEBUG_DMA
if (dir) {
struct dma_cont *d;
d = s->dma_controllers;
int mask;
void *opaque)
struct dma_regs *r;
unsigned nchan,
void *buf,
#ifdef VBOX
#ifdef VBOX
return len;
unsigned nchan,
const void *buf,
#ifdef VBOX
for (i = 0; i < len; i++) {
#ifdef VBOX
return len;
#ifndef VBOX
#ifdef VBOX
#define IO_READ_PROTO(n) \
void *pvUser, \
unsigned cb)
#define IO_WRITE_PROTO(n) \
void *pvUser, \
unsigned cb)
#ifdef PARANOID
return VINF_SUCCESS;
#ifdef PARANOID
return VINF_SUCCESS;
#ifdef PARANOID
return VINF_SUCCESS;
#ifdef PARANOID
return VINF_SUCCESS;
return VINF_SUCCESS;
return VERR_IOM_IOPORT_UNUSED;
return VINF_SUCCESS;
return VERR_IOM_IOPORT_UNUSED;
return VINF_SUCCESS;
return VERR_IOM_IOPORT_UNUSED;
return VINF_SUCCESS;
return VERR_IOM_IOPORT_UNUSED;
#ifdef VBOX
#ifdef VBOX
write_page, d);
read_page, d);
if (pageh_base >= 0) {
#ifdef VBOX
write_pageh, d);
read_pageh, d);
#ifdef VBOX
write_cont, d);
read_cont, d);
#ifndef VBOX
dma_reset(d);
#ifdef VBOX
return -EINVAL;
#ifndef VBOX
#ifdef VBOX
unsigned nchan,
void *opaque)
unsigned nchan,
void *buf,
unsigned nchan,
const void *buf,
unsigned nchan,
unsigned level)
if (level) {
return VINF_SUCCESS;
int iInstance,
bool high_page_enable = 0;
int rc;
return rc;
return rc;
return rc;
return VINF_SUCCESS;
sizeof(DMAState),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,