qemu/include/hw/xen/start_info.h
<<
>>
Prefs
   1/*
   2 * Permission is hereby granted, free of charge, to any person obtaining a copy
   3 * of this software and associated documentation files (the "Software"), to
   4 * deal in the Software without restriction, including without limitation the
   5 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
   6 * sell copies of the Software, and to permit persons to whom the Software is
   7 * furnished to do so, subject to the following conditions:
   8 *
   9 * The above copyright notice and this permission notice shall be included in
  10 * all copies or substantial portions of the Software.
  11 *
  12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  15 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  16 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  17 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  18 * DEALINGS IN THE SOFTWARE.
  19 *
  20 * Copyright (c) 2016, Citrix Systems, Inc.
  21 */
  22
  23#ifndef XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H
  24#define XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H
  25
  26/*
  27 * Start of day structure passed to PVH guests and to HVM guests in %ebx.
  28 *
  29 * NOTE: nothing will be loaded at physical address 0, so a 0 value in any
  30 * of the address fields should be treated as not present.
  31 *
  32 *  0 +----------------+
  33 *    | magic          | Contains the magic value XEN_HVM_START_MAGIC_VALUE
  34 *    |                | ("xEn3" with the 0x80 bit of the "E" set).
  35 *  4 +----------------+
  36 *    | version        | Version of this structure. Current version is 1. New
  37 *    |                | versions are guaranteed to be backwards-compatible.
  38 *  8 +----------------+
  39 *    | flags          | SIF_xxx flags.
  40 * 12 +----------------+
  41 *    | nr_modules     | Number of modules passed to the kernel.
  42 * 16 +----------------+
  43 *    | modlist_paddr  | Physical address of an array of modules
  44 *    |                | (layout of the structure below).
  45 * 24 +----------------+
  46 *    | cmdline_paddr  | Physical address of the command line,
  47 *    |                | a zero-terminated ASCII string.
  48 * 32 +----------------+
  49 *    | rsdp_paddr     | Physical address of the RSDP ACPI data structure.
  50 * 40 +----------------+
  51 *    | memmap_paddr   | Physical address of the (optional) memory map. Only
  52 *    |                | present in version 1 and newer of the structure.
  53 * 48 +----------------+
  54 *    | memmap_entries | Number of entries in the memory map table. Only
  55 *    |                | present in version 1 and newer of the structure.
  56 *    |                | Zero if there is no memory map being provided.
  57 * 52 +----------------+
  58 *    | reserved       | Version 1 and newer only.
  59 * 56 +----------------+
  60 *
  61 * The layout of each entry in the module structure is the following:
  62 *
  63 *  0 +----------------+
  64 *    | paddr          | Physical address of the module.
  65 *  8 +----------------+
  66 *    | size           | Size of the module in bytes.
  67 * 16 +----------------+
  68 *    | cmdline_paddr  | Physical address of the command line,
  69 *    |                | a zero-terminated ASCII string.
  70 * 24 +----------------+
  71 *    | reserved       |
  72 * 32 +----------------+
  73 *
  74 * The layout of each entry in the memory map table is as follows:
  75 *
  76 *  0 +----------------+
  77 *    | addr           | Base address
  78 *  8 +----------------+
  79 *    | size           | Size of mapping in bytes
  80 * 16 +----------------+
  81 *    | type           | Type of mapping as defined between the hypervisor
  82 *    |                | and guest it's starting. E820_TYPE_xxx, for example.
  83 * 20 +----------------|
  84 *    | reserved       |
  85 * 24 +----------------+
  86 *
  87 * The address and sizes are always a 64bit little endian unsigned integer.
  88 *
  89 * NB: Xen on x86 will always try to place all the data below the 4GiB
  90 * boundary.
  91 *
  92 * Version numbers of the hvm_start_info structure have evolved like this:
  93 *
  94 * Version 0:
  95 *
  96 * Version 1:   Added the memmap_paddr/memmap_entries fields (plus 4 bytes of
  97 *              padding) to the end of the hvm_start_info struct. These new
  98 *              fields can be used to pass a memory map to the guest. The
  99 *              memory map is optional and so guests that understand version 1
 100 *              of the structure must check that memmap_entries is non-zero
 101 *              before trying to read the memory map.
 102 */
 103#define XEN_HVM_START_MAGIC_VALUE 0x336ec578
 104
 105/*
 106 * C representation of the x86/HVM start info layout.
 107 *
 108 * The canonical definition of this layout is above, this is just a way to
 109 * represent the layout described there using C types.
 110 */
 111struct hvm_start_info {
 112    uint32_t magic;             /* Contains the magic value 0x336ec578       */
 113                                /* ("xEn3" with the 0x80 bit of the "E" set).*/
 114    uint32_t version;           /* Version of this structure.                */
 115    uint32_t flags;             /* SIF_xxx flags.                            */
 116    uint32_t nr_modules;        /* Number of modules passed to the kernel.   */
 117    uint64_t modlist_paddr;     /* Physical address of an array of           */
 118                                /* hvm_modlist_entry.                        */
 119    uint64_t cmdline_paddr;     /* Physical address of the command line.     */
 120    uint64_t rsdp_paddr;        /* Physical address of the RSDP ACPI data    */
 121                                /* structure.                                */
 122    uint64_t memmap_paddr;      /* Physical address of an array of           */
 123                                /* hvm_memmap_table_entry. Only present in   */
 124                                /* version 1 and newer of the structure      */
 125    uint32_t memmap_entries;    /* Number of entries in the memmap table.    */
 126                                /* Only present in version 1 and newer of    */
 127                                /* the structure. Value will be zero if      */
 128                                /* there is no memory map being provided.    */
 129    uint32_t reserved;
 130};
 131
 132struct hvm_modlist_entry {
 133    uint64_t paddr;             /* Physical address of the module.           */
 134    uint64_t size;              /* Size of the module in bytes.              */
 135    uint64_t cmdline_paddr;     /* Physical address of the command line.     */
 136    uint64_t reserved;
 137};
 138
 139struct hvm_memmap_table_entry {
 140    uint64_t addr;              /* Base address of the memory region         */
 141    uint64_t size;              /* Size of the memory region in bytes        */
 142    uint32_t type;              /* Mapping type                              */
 143    uint32_t reserved;
 144};
 145
 146#endif /* XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H */
 147