~ahs3/+junk/cq-qemu

« back to all changes in this revision

Viewing changes to pc-bios/optionrom/optionrom.h

  • Committer: Al Stone
  • Date: 2012-02-09 01:17:20 UTC
  • Revision ID: albert.stone@canonical.com-20120209011720-tztl7ik3qayz80p4
first commit to bzr for qemu

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Common Option ROM Functions
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; either version 2 of the License, or
 
7
 * (at your option) any later version.
 
8
 *
 
9
 * This program is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 
12
 * GNU General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU General Public License
 
15
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 
16
 *
 
17
 * Copyright Novell Inc, 2009
 
18
 *   Authors: Alexander Graf <agraf@suse.de>
 
19
 */
 
20
 
 
21
 
 
22
#define NO_QEMU_PROTOS
 
23
#include "../../hw/fw_cfg.h"
 
24
 
 
25
#define BIOS_CFG_IOPORT_CFG     0x510
 
26
#define BIOS_CFG_IOPORT_DATA    0x511
 
27
 
 
28
/* Break the translation block flow so -d cpu shows us values */
 
29
#define DEBUG_HERE \
 
30
        jmp             1f;                             \
 
31
        1:
 
32
        
 
33
/*
 
34
 * Read a variable from the fw_cfg device.
 
35
 * Clobbers:    %edx
 
36
 * Out:         %eax
 
37
 */
 
38
.macro read_fw VAR
 
39
        mov             $\VAR, %ax
 
40
        mov             $BIOS_CFG_IOPORT_CFG, %dx
 
41
        outw            %ax, (%dx)
 
42
        mov             $BIOS_CFG_IOPORT_DATA, %dx
 
43
        inb             (%dx), %al
 
44
        shl             $8, %eax
 
45
        inb             (%dx), %al
 
46
        shl             $8, %eax
 
47
        inb             (%dx), %al
 
48
        shl             $8, %eax
 
49
        inb             (%dx), %al
 
50
        bswap           %eax
 
51
.endm
 
52
 
 
53
#define read_fw_blob_pre(var)                           \
 
54
        read_fw         var ## _ADDR;                   \
 
55
        mov             %eax, %edi;                     \
 
56
        read_fw         var ## _SIZE;                   \
 
57
        mov             %eax, %ecx;                     \
 
58
        mov             $var ## _DATA, %ax;             \
 
59
        mov             $BIOS_CFG_IOPORT_CFG, %edx;     \
 
60
        outw            %ax, (%dx);                     \
 
61
        mov             $BIOS_CFG_IOPORT_DATA, %dx;     \
 
62
        cld
 
63
 
 
64
/*
 
65
 * Read a blob from the fw_cfg device.
 
66
 * Requires _ADDR, _SIZE and _DATA values for the parameter.
 
67
 *
 
68
 * Clobbers:    %eax, %edx, %es, %ecx, %edi
 
69
 */
 
70
#define read_fw_blob(var)                               \
 
71
        read_fw_blob_pre(var);                          \
 
72
        /* old as(1) doesn't like this insn so emit the bytes instead: \
 
73
        rep insb        (%dx), %es:(%edi);              \
 
74
        */                                              \
 
75
        .dc.b           0xf3,0x6c
 
76
 
 
77
/*
 
78
 * Read a blob from the fw_cfg device in forced addr32 mode.
 
79
 * Requires _ADDR, _SIZE and _DATA values for the parameter.
 
80
 *
 
81
 * Clobbers:    %eax, %edx, %es, %ecx, %edi
 
82
 */
 
83
#define read_fw_blob_addr32(var)                                \
 
84
        read_fw_blob_pre(var);                          \
 
85
        /* old as(1) doesn't like this insn so emit the bytes instead: \
 
86
        addr32 rep insb (%dx), %es:(%edi);              \
 
87
        */                                              \
 
88
        .dc.b           0x67,0xf3,0x6c
 
89
 
 
90
#define OPTION_ROM_START                                        \
 
91
    .code16;                                            \
 
92
    .text;                                              \
 
93
        .global         _start;                         \
 
94
    _start:;                                            \
 
95
        .short          0xaa55;                         \
 
96
        .byte           (_end - _start) / 512;
 
97
 
 
98
#define BOOT_ROM_START                                  \
 
99
        OPTION_ROM_START                                \
 
100
        lret;                                           \
 
101
        .org            0x18;                           \
 
102
        .short          0;                              \
 
103
        .short          _pnph;                          \
 
104
    _pnph:                                              \
 
105
        .ascii          "$PnP";                         \
 
106
        .byte           0x01;                           \
 
107
        .byte           ( _pnph_len / 16 );             \
 
108
        .short          0x0000;                         \
 
109
        .byte           0x00;                           \
 
110
        .byte           0x00;                           \
 
111
        .long           0x00000000;                     \
 
112
        .short          _manufacturer;                  \
 
113
        .short          _product;                       \
 
114
        .long           0x00000000;                     \
 
115
        .short          0x0000;                         \
 
116
        .short          0x0000;                         \
 
117
        .short          _bev;                           \
 
118
        .short          0x0000;                         \
 
119
        .short          0x0000;                         \
 
120
        .equ            _pnph_len, . - _pnph;           \
 
121
    _bev:;                                              \
 
122
        /* DS = CS */                                   \
 
123
        movw            %cs, %ax;                       \
 
124
        movw            %ax, %ds;
 
125
 
 
126
#define OPTION_ROM_END                                  \
 
127
    .align 512, 0;                                      \
 
128
    _end:
 
129
 
 
130
#define BOOT_ROM_END                                    \
 
131
    _manufacturer:;                                     \
 
132
        .asciz "QEMU";                                  \
 
133
    _product:;                                          \
 
134
        .asciz BOOT_ROM_PRODUCT;                        \
 
135
        OPTION_ROM_END
 
136