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