Statistics
| Branch: | Revision:

root / pc-bios / optionrom / optionrom.h @ 75b9f690

History | View | Annotate | Download (3.2 kB)

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