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