xref: /qemu/pc-bios/optionrom/optionrom.h (revision 209ca750b9e1854fa8f63fae16aef15becb1cdea)
1dd4b2659SAlexander Graf /*
2dd4b2659SAlexander Graf  * Common Option ROM Functions
3dd4b2659SAlexander Graf  *
4dd4b2659SAlexander Graf  * This program is free software; you can redistribute it and/or modify
5dd4b2659SAlexander Graf  * it under the terms of the GNU General Public License as published by
6dd4b2659SAlexander Graf  * the Free Software Foundation; either version 2 of the License, or
7dd4b2659SAlexander Graf  * (at your option) any later version.
8dd4b2659SAlexander Graf  *
9dd4b2659SAlexander Graf  * This program is distributed in the hope that it will be useful,
10dd4b2659SAlexander Graf  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11dd4b2659SAlexander Graf  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12dd4b2659SAlexander Graf  * GNU General Public License for more details.
13dd4b2659SAlexander Graf  *
14dd4b2659SAlexander Graf  * You should have received a copy of the GNU General Public License
15dd4b2659SAlexander Graf  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16dd4b2659SAlexander Graf  *
17dd4b2659SAlexander Graf  * Copyright Novell Inc, 2009
18dd4b2659SAlexander Graf  *   Authors: Alexander Graf <agraf@suse.de>
19dd4b2659SAlexander Graf  */
20dd4b2659SAlexander Graf 
21dd4b2659SAlexander Graf 
22dd4b2659SAlexander Graf #define NO_QEMU_PROTOS
23dd4b2659SAlexander Graf #include "../../hw/fw_cfg.h"
24dd4b2659SAlexander Graf 
25dd4b2659SAlexander Graf #define BIOS_CFG_IOPORT_CFG	0x510
26dd4b2659SAlexander Graf #define BIOS_CFG_IOPORT_DATA	0x511
27dd4b2659SAlexander Graf 
28dd4b2659SAlexander Graf /* Break the translation block flow so -d cpu shows us values */
29dd4b2659SAlexander Graf #define DEBUG_HERE \
30dd4b2659SAlexander Graf 	jmp		1f;				\
31dd4b2659SAlexander Graf 	1:
32dd4b2659SAlexander Graf 
33dd4b2659SAlexander Graf /*
34dd4b2659SAlexander Graf  * Read a variable from the fw_cfg device.
35dd4b2659SAlexander Graf  * Clobbers:	%edx
36dd4b2659SAlexander Graf  * Out:		%eax
37dd4b2659SAlexander Graf  */
38dd4b2659SAlexander Graf .macro read_fw VAR
39dd4b2659SAlexander Graf 	mov		$\VAR, %ax
40dd4b2659SAlexander Graf 	mov		$BIOS_CFG_IOPORT_CFG, %dx
41dd4b2659SAlexander Graf 	outw		%ax, (%dx)
42dd4b2659SAlexander Graf 	mov		$BIOS_CFG_IOPORT_DATA, %dx
43dd4b2659SAlexander Graf 	inb		(%dx), %al
44dd4b2659SAlexander Graf 	shl		$8, %eax
45dd4b2659SAlexander Graf 	inb		(%dx), %al
46dd4b2659SAlexander Graf 	shl		$8, %eax
47dd4b2659SAlexander Graf 	inb		(%dx), %al
48dd4b2659SAlexander Graf 	shl		$8, %eax
49dd4b2659SAlexander Graf 	inb		(%dx), %al
50dd4b2659SAlexander Graf 	bswap		%eax
51dd4b2659SAlexander Graf .endm
52dd4b2659SAlexander Graf 
53590bf491SAlexander Graf #define read_fw_blob_pre(var)				\
54dd4b2659SAlexander Graf 	read_fw		var ## _ADDR;			\
55dd4b2659SAlexander Graf 	mov		%eax, %edi;			\
56dd4b2659SAlexander Graf 	read_fw		var ## _SIZE;			\
57dd4b2659SAlexander Graf 	mov		%eax, %ecx;			\
58dd4b2659SAlexander Graf 	mov		$var ## _DATA, %ax;		\
59dd4b2659SAlexander Graf 	mov		$BIOS_CFG_IOPORT_CFG, %edx;	\
60dd4b2659SAlexander Graf 	outw		%ax, (%dx);			\
61dd4b2659SAlexander Graf 	mov		$BIOS_CFG_IOPORT_DATA, %dx;	\
62590bf491SAlexander Graf 	cld
63590bf491SAlexander Graf 
64590bf491SAlexander Graf /*
65590bf491SAlexander Graf  * Read a blob from the fw_cfg device.
66590bf491SAlexander Graf  * Requires _ADDR, _SIZE and _DATA values for the parameter.
67590bf491SAlexander Graf  *
68590bf491SAlexander Graf  * Clobbers:	%eax, %edx, %es, %ecx, %edi
69590bf491SAlexander Graf  */
70590bf491SAlexander Graf #define read_fw_blob(var)				\
71590bf491SAlexander Graf 	read_fw_blob_pre(var);				\
72dd4239d6SJuergen Lock 	/* old as(1) doesn't like this insn so emit the bytes instead: \
73dd4239d6SJuergen Lock 	rep insb	(%dx), %es:(%edi);		\
74dd4239d6SJuergen Lock 	*/						\
75590bf491SAlexander Graf 	.dc.b		0xf3,0x6c
76590bf491SAlexander Graf 
77590bf491SAlexander Graf /*
78590bf491SAlexander Graf  * Read a blob from the fw_cfg device in forced addr32 mode.
79590bf491SAlexander Graf  * Requires _ADDR, _SIZE and _DATA values for the parameter.
80590bf491SAlexander Graf  *
81590bf491SAlexander Graf  * Clobbers:	%eax, %edx, %es, %ecx, %edi
82590bf491SAlexander Graf  */
83590bf491SAlexander Graf #define read_fw_blob_addr32(var)				\
84590bf491SAlexander Graf 	read_fw_blob_pre(var);				\
85590bf491SAlexander Graf 	/* old as(1) doesn't like this insn so emit the bytes instead: \
86590bf491SAlexander Graf 	addr32 rep insb	(%dx), %es:(%edi);		\
87590bf491SAlexander Graf 	*/						\
88dd4239d6SJuergen Lock 	.dc.b		0x67,0xf3,0x6c
89dd4b2659SAlexander Graf 
90dd4b2659SAlexander Graf #define OPTION_ROM_START					\
91dd4b2659SAlexander Graf     .code16;						\
92dd4b2659SAlexander Graf     .text;						\
93dd4b2659SAlexander Graf 	.global 	_start;				\
94dd4b2659SAlexander Graf     _start:;						\
95dd4b2659SAlexander Graf 	.short		0xaa55;				\
96dd4b2659SAlexander Graf 	.byte		(_end - _start) / 512;
97dd4b2659SAlexander Graf 
98dd4b2659SAlexander Graf #define BOOT_ROM_START					\
99dd4b2659SAlexander Graf 	OPTION_ROM_START				\
100dd4b2659SAlexander Graf 	lret;						\
10175b9f690SGleb Natapov 	.org 		0x18;				\
10275b9f690SGleb Natapov 	.short		0;				\
10375b9f690SGleb Natapov 	.short		_pnph;				\
10475b9f690SGleb Natapov     _pnph:						\
10575b9f690SGleb Natapov 	.ascii		"$PnP";				\
10675b9f690SGleb Natapov 	.byte		0x01;				\
10775b9f690SGleb Natapov 	.byte		( _pnph_len / 16 );		\
10875b9f690SGleb Natapov 	.short		0x0000;				\
10975b9f690SGleb Natapov 	.byte		0x00;				\
11075b9f690SGleb Natapov 	.byte		0x00;				\
11175b9f690SGleb Natapov 	.long		0x00000000;			\
11275b9f690SGleb Natapov 	.short		_manufacturer;			\
11375b9f690SGleb Natapov 	.short		_product;			\
11475b9f690SGleb Natapov 	.long		0x00000000;			\
11575b9f690SGleb Natapov 	.short		0x0000;				\
11675b9f690SGleb Natapov 	.short		0x0000;				\
11775b9f690SGleb Natapov 	.short		_bev;				\
11875b9f690SGleb Natapov 	.short		0x0000;				\
11975b9f690SGleb Natapov 	.short		0x0000;				\
12075b9f690SGleb Natapov 	.equ		_pnph_len, . - _pnph;		\
12175b9f690SGleb Natapov     _bev:;						\
122dd4b2659SAlexander Graf 	/* DS = CS */					\
123dd4b2659SAlexander Graf 	movw		%cs, %ax;			\
124dd4b2659SAlexander Graf 	movw		%ax, %ds;
125dd4b2659SAlexander Graf 
126dd4b2659SAlexander Graf #define OPTION_ROM_END					\
127*209ca750SJan Kiszka 	.byte		0;				\
128dd4b2659SAlexander Graf 	.align		512, 0;				\
129dd4b2659SAlexander Graf     _end:
130dd4b2659SAlexander Graf 
131dd4b2659SAlexander Graf #define BOOT_ROM_END					\
13275b9f690SGleb Natapov     _manufacturer:;					\
13375b9f690SGleb Natapov 	.asciz "QEMU";					\
13475b9f690SGleb Natapov     _product:;						\
13575b9f690SGleb Natapov 	.asciz BOOT_ROM_PRODUCT;			\
136dd4b2659SAlexander Graf 	OPTION_ROM_END
137dd4b2659SAlexander Graf 
138