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 |