~ubuntu-branches/ubuntu/trusty/virtualbox/trusty-proposed

« back to all changes in this revision

Viewing changes to src/VBox/Devices/PC/BIOS/vds.c

  • Committer: Package Import Robot
  • Author(s): Felix Geyer
  • Date: 2013-03-07 16:38:36 UTC
  • mfrom: (1.1.13) (3.1.20 experimental)
  • Revision ID: package-import@ubuntu.com-20130307163836-p93jpbgx39tp3gb4
Tags: 4.2.8-dfsg-0ubuntu1
* New upstream release. (Closes: #691148)
  - Fixes compatibility with kernel 3.8. (Closes: #700823; LP: #1101867)
* Switch to my @debian.org email address.
* Move package to contrib as virtualbox 4.2 needs a non-free compiler to
  build the BIOS.
* Build-depend on libdevmapper-dev.
* Refresh patches.
  - Drop 36-fix-ftbfs-xserver-112.patch, cve-2012-3221.patch,
    CVE-2013-0420.patch 37-kcompat-3.6.patch and 38-kcompat-3.7.patch.
* Drop all virtualbox-ose transitional packages.
* Drop the virtualbox-fuse package as vdfuse fails to build with
  virtualbox 4.2.
* Update install files and VBox.sh.
* Bump required kbuild version to 0.1.9998svn2577.
* Fix path to VBoxCreateUSBNode.sh in virtualbox.postinst. (Closes: #700479)
* Add an init script to virtuabox-guest-x11 which loads the vboxvideo
  kernel module. The X Server 1.13 doesn't load it anymore. (Closes: #686994)
* Update man pages. (Closes: #680053)
* Add 36-python-multiarch.patch from Rico Tzschichholz to fix detection of
  python in multiarch paths using pkg-config.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/** @file
 
2
 * Utility routines for calling the Virtual DMA Services.
 
3
 */
 
4
 
 
5
/*
 
6
 * Copyright (C) 2011 Oracle Corporation
 
7
 *
 
8
 * This file is part of VirtualBox Open Source Edition (OSE), as
 
9
 * available from http://www.virtualbox.org. This file is free software;
 
10
 * you can redistribute it and/or modify it under the terms of the GNU
 
11
 * General Public License (GPL) as published by the Free Software
 
12
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 
13
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 
14
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 
15
 */
 
16
 
 
17
 
 
18
#include <stdint.h>
 
19
#include "biosint.h"
 
20
#include "vds.h"
 
21
 
 
22
typedef struct {
 
23
    uint8_t     major;      /* VDS spec major version number. */
 
24
    uint8_t     minor;      /* VDS spec minor version number. */
 
25
    uint16_t    flags;      /* Capabilities/status flags. */
 
26
    uint16_t    prod_no;    /* Product number. */
 
27
    uint16_t    prod_rev;   /* Product revision number. */
 
28
    uint32_t    max_buf;    /* Maximum buffer size supported. */
 
29
} vds_ver;
 
30
 
 
31
int vds_is_present( void )
 
32
{
 
33
    uint8_t __far   *vds_flags;
 
34
 
 
35
    vds_flags = MK_FP( 0x40, VDS_FLAGS_OFS );
 
36
    return( !!(*vds_flags & VDS_PRESENT) );
 
37
}
 
38
 
 
39
int vds_lock_sg( vds_edds __far *edds );
 
40
#pragma aux vds_lock_sg =   \
 
41
    "mov    ax, 8105h"      \
 
42
    "mov    dx, 0"          \
 
43
    "int    4Bh"            \
 
44
    "jc     error"          \
 
45
    "xor    al, al"         \
 
46
    "error:"                \
 
47
    "cbw"                   \
 
48
    parm [es di] value [ax];
 
49
 
 
50
int vds_unlock_sg( vds_edds __far *edds );
 
51
#pragma aux vds_unlock_sg = \
 
52
    "mov    ax, 8106h"      \
 
53
    "mov    dx, 0"          \
 
54
    "int    4Bh"            \
 
55
    "jc     error"          \
 
56
    "xor    al, al"         \
 
57
    "error:"                \
 
58
    "cbw"                   \
 
59
    parm [es di] value [ax];
 
60
 
 
61
 
 
62
/*
 
63
 * Convert a real mode 16:16 segmented address to a simple 32-bit 
 
64
 * linear address. 
 
65
 */
 
66
uint32_t vds_real_to_lin( void __far *ptr )
 
67
{
 
68
    return( ((uint32_t)FP_SEG( ptr ) << 4) + FP_OFF( ptr ) );
 
69
}
 
70
 
 
71
/*
 
72
 * Build a VDS-style scatter/gather list, regardless of whether VDS is
 
73
 * present or not. This routine either calls VDS to do the work or
 
74
 * trivially creates the list if no remapping is needed.
 
75
 */
 
76
int vds_build_sg_list( vds_edds __far *edds, void __far *buf, uint32_t len )
 
77
{
 
78
    int     rc;
 
79
 
 
80
    /* NB: The num_avail field in the EDDS must be set correctly! */
 
81
    edds->region_size = len;
 
82
    edds->offset = vds_real_to_lin( buf );
 
83
    edds->seg_sel = 0;  /* Indicates a linear address. */
 
84
    if( vds_is_present() ) {
 
85
        /* VDS is present, use it. */
 
86
        rc = vds_lock_sg( edds );
 
87
    } else {
 
88
        /* No VDS, do it ourselves with one S/G entry. */
 
89
        edds->num_used = 1;
 
90
        edds->u.sg[0].phys_addr = edds->offset;
 
91
        edds->u.sg[0].size      = len;
 
92
        rc = VDS_SUCCESS;
 
93
    }
 
94
    return( rc );
 
95
}
 
96
 
 
97
/*
 
98
 * Free a VDS-style scatter/gather list, regardless of whether VDS
 
99
 * is present or not.
 
100
 */
 
101
int vds_free_sg_list( vds_edds __far *edds )
 
102
{
 
103
    int     rc;
 
104
 
 
105
    if( vds_is_present() ) {
 
106
        /* VDS is present, use it. */
 
107
        rc = vds_unlock_sg( edds );
 
108
    } else {
 
109
        /* No VDS, not much to do. */
 
110
        /* We could check here if the EDDS had in fact been built by us.
 
111
         * But if VDS really went away, what can we do about it anyway?
 
112
         */
 
113
        rc = VDS_SUCCESS;
 
114
    }
 
115
    edds->num_used = 0;
 
116
    return( rc );
 
117
}