~ubuntu-branches/ubuntu/oneiric/virtualbox/oneiric-updates

« back to all changes in this revision

Viewing changes to src/VBox/Devices/PC/DevDMA.cpp

  • Committer: Package Import Robot
  • Author(s): Felix Geyer
  • Date: 2011-09-02 11:50:47 UTC
  • mfrom: (3.1.4 sid)
  • Revision ID: package-import@ubuntu.com-20110902115047-kfhmsikrpydgyoji
Tags: 4.1.2-dfsg-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add Apport hook.
    - debian/virtualbox.files/source_virtualbox.py
    - debian/virtualbox.install
  - Drop *-source packages.
  - Add vboxguest modalias the to the package control field.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: DevDMA.cpp 37423 2011-06-12 18:37:56Z vboxsync $ */
 
1
/* $Id: DevDMA.cpp 38221 2011-07-28 14:11:14Z vboxsync $ */
2
2
/** @file
3
3
 * DevDMA - DMA Controller Device.
4
4
 */
429
429
static DECLCALLBACK(int) dmaReadPage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port,
430
430
                                     uint32_t *pu32, unsigned cb)
431
431
{
 
432
    DMAControl  *dc = (DMAControl *)pvUser;
 
433
    int         reg;
 
434
 
432
435
    if (cb == 1)
433
436
    {
434
 
        DMAControl  *dc = (DMAControl *)pvUser;
435
 
        int         reg;
436
 
 
437
437
        reg   = port & 7;
438
438
        *pu32 = dc->au8Page[reg];
439
 
        Log2(("Read %#x to from page register %#x (channel %d)\n",
 
439
        Log2(("Read %#x (byte) from page register %#x (channel %d)\n",
 
440
              *pu32, port, DMAPG2CX(reg)));
 
441
        return VINF_SUCCESS;
 
442
    } 
 
443
    else if (cb == 2) 
 
444
    {
 
445
        reg   = port & 7;
 
446
        *pu32 = dc->au8Page[reg] | (dc->au8Page[(reg + 1) & 7] << 8);
 
447
        Log2(("Read %#x (word) from page register %#x (channel %d)\n",
440
448
              *pu32, port, DMAPG2CX(reg)));
441
449
        return VINF_SUCCESS;
442
450
    }
447
455
static DECLCALLBACK(int) dmaWritePage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port,
448
456
                                      uint32_t u32, unsigned cb)
449
457
{
 
458
    DMAControl  *dc = (DMAControl *)pvUser;
 
459
    int         reg;
 
460
 
450
461
    if (cb == 1)
451
462
    {
452
 
        DMAControl  *dc = (DMAControl *)pvUser;
453
 
        int         reg;
454
 
 
455
463
        Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */
456
464
        reg = port & 7;
457
465
        dc->au8Page[reg]   = u32;
459
467
        Log2(("Wrote %#x to page register %#x (channel %d)\n",
460
468
              u32, port, DMAPG2CX(reg)));
461
469
    }
 
470
    else if (cb == 2) 
 
471
    {
 
472
        Assert(!(u32 & ~0xffff)); /* Check for garbage in high bits. */
 
473
        reg = port & 7;
 
474
        dc->au8Page[reg]   = u32;
 
475
        dc->au8PageHi[reg] = 0;  /* Corresponding high page cleared. */
 
476
        reg = (port + 1) & 7;
 
477
        dc->au8Page[reg]   = u32 >> 8;
 
478
        dc->au8PageHi[reg] = 0;  /* Corresponding high page cleared. */
 
479
    }
462
480
    else
463
481
    {
464
482
        /* Likely a guest bug. */