cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

optionrom.h (4202B)


      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 FW_CFG_KERNEL_ADDR      0x07
     23#define FW_CFG_KERNEL_SIZE      0x08
     24#define FW_CFG_KERNEL_CMDLINE   0x09
     25#define FW_CFG_INITRD_ADDR      0x0a
     26#define FW_CFG_INITRD_SIZE      0x0b
     27#define FW_CFG_KERNEL_ENTRY     0x10
     28#define FW_CFG_KERNEL_DATA      0x11
     29#define FW_CFG_INITRD_DATA      0x12
     30#define FW_CFG_CMDLINE_ADDR     0x13
     31#define FW_CFG_CMDLINE_SIZE     0x14
     32#define FW_CFG_CMDLINE_DATA     0x15
     33#define FW_CFG_SETUP_ADDR       0x16
     34#define FW_CFG_SETUP_SIZE       0x17
     35#define FW_CFG_SETUP_DATA       0x18
     36
     37#define BIOS_CFG_IOPORT_CFG	0x510
     38#define BIOS_CFG_IOPORT_DATA	0x511
     39
     40/* Break the translation block flow so -d cpu shows us values */
     41#define DEBUG_HERE \
     42	jmp		1f;				\
     43	1:
     44	
     45/*
     46 * Read a variable from the fw_cfg device.
     47 * Clobbers:	%edx
     48 * Out:		%eax
     49 */
     50.macro read_fw VAR
     51	mov		$\VAR, %ax
     52	mov		$BIOS_CFG_IOPORT_CFG, %dx
     53	outw		%ax, (%dx)
     54	mov		$BIOS_CFG_IOPORT_DATA, %dx
     55	inb		(%dx), %al
     56	shl		$8, %eax
     57	inb		(%dx), %al
     58	shl		$8, %eax
     59	inb		(%dx), %al
     60	shl		$8, %eax
     61	inb		(%dx), %al
     62	bswap		%eax
     63.endm
     64
     65#define read_fw_blob_pre(var)				\
     66	read_fw		var ## _SIZE;			\
     67	mov		%eax, %ecx;			\
     68	mov		$var ## _DATA, %ax;		\
     69	mov		$BIOS_CFG_IOPORT_CFG, %edx;	\
     70	outw		%ax, (%dx);			\
     71	mov		$BIOS_CFG_IOPORT_DATA, %dx;	\
     72	cld
     73
     74/*
     75 * Read a blob from the fw_cfg device.
     76 * Requires _ADDR, _SIZE and _DATA values for the parameter.
     77 *
     78 * Clobbers:	%eax, %edx, %es, %ecx, %edi
     79 */
     80#define read_fw_blob(var)				\
     81	read_fw		var ## _ADDR;			\
     82	mov		%eax, %edi;			\
     83	read_fw_blob_pre(var);				\
     84	/* old as(1) doesn't like this insn so emit the bytes instead: \
     85	rep insb	(%dx), %es:(%edi);		\
     86	*/						\
     87	.dc.b		0xf3,0x6c
     88
     89/*
     90 * Read a blob from the fw_cfg device in forced addr32 mode.
     91 * Requires _ADDR, _SIZE and _DATA values for the parameter.
     92 *
     93 * Clobbers:	%eax, %edx, %es, %ecx, %edi
     94 */
     95#define read_fw_blob_addr32(var)			\
     96	read_fw		var ## _ADDR;			\
     97	mov		%eax, %edi;			\
     98	read_fw_blob_pre(var);				\
     99	/* old as(1) doesn't like this insn so emit the bytes instead: \
    100	addr32 rep insb	(%dx), %es:(%edi);		\
    101	*/						\
    102	.dc.b		0x67,0xf3,0x6c
    103
    104/*
    105 * Read a blob from the fw_cfg device in forced addr32 mode, address is in %edi.
    106 * Requires _SIZE and _DATA values for the parameter.
    107 *
    108 * Clobbers:	%eax, %edx, %edi, %es, %ecx
    109 */
    110#define read_fw_blob_addr32_edi(var)			\
    111	read_fw_blob_pre(var);				\
    112	/* old as(1) doesn't like this insn so emit the bytes instead: \
    113	addr32 rep insb	(%dx), %es:(%edi);		\
    114	*/						\
    115	.dc.b		0x67,0xf3,0x6c
    116
    117#define OPTION_ROM_START					\
    118    .code16;						\
    119    .text;						\
    120	.global 	_start;				\
    121    _start:;						\
    122	.short		0xaa55;				\
    123	.byte		(_end - _start) / 512;
    124
    125#define BOOT_ROM_START					\
    126	OPTION_ROM_START				\
    127	lret;						\
    128	.org 		0x18;				\
    129	.short		0;				\
    130	.short		_pnph;				\
    131    _pnph:						\
    132	.ascii		"$PnP";				\
    133	.byte		0x01;				\
    134	.byte		( _pnph_len / 16 );		\
    135	.short		0x0000;				\
    136	.byte		0x00;				\
    137	.byte		0x00;				\
    138	.long		0x00000000;			\
    139	.short		_manufacturer;			\
    140	.short		_product;			\
    141	.long		0x00000000;			\
    142	.short		0x0000;				\
    143	.short		0x0000;				\
    144	.short		_bev;				\
    145	.short		0x0000;				\
    146	.short		0x0000;				\
    147	.equ		_pnph_len, . - _pnph;		\
    148    _bev:;						\
    149	/* DS = CS */					\
    150	movw		%cs, %ax;			\
    151	movw		%ax, %ds;
    152
    153#define OPTION_ROM_END					\
    154	.byte		0;				\
    155	.align		512, 0;				\
    156    _end:
    157
    158#define BOOT_ROM_END					\
    159    _manufacturer:;					\
    160	.asciz "QEMU";					\
    161    _product:;						\
    162	.asciz BOOT_ROM_PRODUCT;			\
    163	OPTION_ROM_END
    164