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 165