qemu/pc-bios/optionrom/optionrom.h
<<
>>
Prefs
   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