Add qemu 2.4.0
[kvmfornfv.git] / qemu / pc-bios / optionrom / optionrom.h
diff --git a/qemu/pc-bios/optionrom/optionrom.h b/qemu/pc-bios/optionrom/optionrom.h
new file mode 100644 (file)
index 0000000..f1a9021
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Common Option ROM Functions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright Novell Inc, 2009
+ *   Authors: Alexander Graf <agraf@suse.de>
+ */
+
+
+#define NO_QEMU_PROTOS
+#include "../../include/hw/nvram/fw_cfg.h"
+
+#define BIOS_CFG_IOPORT_CFG    0x510
+#define BIOS_CFG_IOPORT_DATA   0x511
+
+/* Break the translation block flow so -d cpu shows us values */
+#define DEBUG_HERE \
+       jmp             1f;                             \
+       1:
+       
+/*
+ * Read a variable from the fw_cfg device.
+ * Clobbers:   %edx
+ * Out:                %eax
+ */
+.macro read_fw VAR
+       mov             $\VAR, %ax
+       mov             $BIOS_CFG_IOPORT_CFG, %dx
+       outw            %ax, (%dx)
+       mov             $BIOS_CFG_IOPORT_DATA, %dx
+       inb             (%dx), %al
+       shl             $8, %eax
+       inb             (%dx), %al
+       shl             $8, %eax
+       inb             (%dx), %al
+       shl             $8, %eax
+       inb             (%dx), %al
+       bswap           %eax
+.endm
+
+#define read_fw_blob_pre(var)                          \
+       read_fw         var ## _SIZE;                   \
+       mov             %eax, %ecx;                     \
+       mov             $var ## _DATA, %ax;             \
+       mov             $BIOS_CFG_IOPORT_CFG, %edx;     \
+       outw            %ax, (%dx);                     \
+       mov             $BIOS_CFG_IOPORT_DATA, %dx;     \
+       cld
+
+/*
+ * Read a blob from the fw_cfg device.
+ * Requires _ADDR, _SIZE and _DATA values for the parameter.
+ *
+ * Clobbers:   %eax, %edx, %es, %ecx, %edi
+ */
+#define read_fw_blob(var)                              \
+       read_fw         var ## _ADDR;                   \
+       mov             %eax, %edi;                     \
+       read_fw_blob_pre(var);                          \
+       /* old as(1) doesn't like this insn so emit the bytes instead: \
+       rep insb        (%dx), %es:(%edi);              \
+       */                                              \
+       .dc.b           0xf3,0x6c
+
+/*
+ * Read a blob from the fw_cfg device in forced addr32 mode.
+ * Requires _ADDR, _SIZE and _DATA values for the parameter.
+ *
+ * Clobbers:   %eax, %edx, %es, %ecx, %edi
+ */
+#define read_fw_blob_addr32(var)                       \
+       read_fw         var ## _ADDR;                   \
+       mov             %eax, %edi;                     \
+       read_fw_blob_pre(var);                          \
+       /* old as(1) doesn't like this insn so emit the bytes instead: \
+       addr32 rep insb (%dx), %es:(%edi);              \
+       */                                              \
+       .dc.b           0x67,0xf3,0x6c
+
+/*
+ * Read a blob from the fw_cfg device in forced addr32 mode, address is in %edi.
+ * Requires _SIZE and _DATA values for the parameter.
+ *
+ * Clobbers:   %eax, %edx, %edi, %es, %ecx
+ */
+#define read_fw_blob_addr32_edi(var)                   \
+       read_fw_blob_pre(var);                          \
+       /* old as(1) doesn't like this insn so emit the bytes instead: \
+       addr32 rep insb (%dx), %es:(%edi);              \
+       */                                              \
+       .dc.b           0x67,0xf3,0x6c
+
+#define OPTION_ROM_START                                       \
+    .code16;                                           \
+    .text;                                             \
+       .global         _start;                         \
+    _start:;                                           \
+       .short          0xaa55;                         \
+       .byte           (_end - _start) / 512;
+
+#define BOOT_ROM_START                                 \
+       OPTION_ROM_START                                \
+       lret;                                           \
+       .org            0x18;                           \
+       .short          0;                              \
+       .short          _pnph;                          \
+    _pnph:                                             \
+       .ascii          "$PnP";                         \
+       .byte           0x01;                           \
+       .byte           ( _pnph_len / 16 );             \
+       .short          0x0000;                         \
+       .byte           0x00;                           \
+       .byte           0x00;                           \
+       .long           0x00000000;                     \
+       .short          _manufacturer;                  \
+       .short          _product;                       \
+       .long           0x00000000;                     \
+       .short          0x0000;                         \
+       .short          0x0000;                         \
+       .short          _bev;                           \
+       .short          0x0000;                         \
+       .short          0x0000;                         \
+       .equ            _pnph_len, . - _pnph;           \
+    _bev:;                                             \
+       /* DS = CS */                                   \
+       movw            %cs, %ax;                       \
+       movw            %ax, %ds;
+
+#define OPTION_ROM_END                                 \
+       .byte           0;                              \
+       .align          512, 0;                         \
+    _end:
+
+#define BOOT_ROM_END                                   \
+    _manufacturer:;                                    \
+       .asciz "QEMU";                                  \
+    _product:;                                         \
+       .asciz BOOT_ROM_PRODUCT;                        \
+       OPTION_ROM_END
+