linux/include/xen/interface/hvm/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. Zero
  55 *    |                | if there is no memory map being provided. Only
  56 *    |                | present in version 1 and newer of the structure.
  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. See XEN_HVM_MEMMAP_TYPE_* values below.
  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:  Initial implementation.
  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 * The values used in the type field of the memory map table entries are
 107 * defined below and match the Address Range Types as defined in the "System
 108 * Address Map Interfaces" section of the ACPI Specification. Please refer to
 109 * section 15 in version 6.2 of the ACPI spec: http://uefi.org/specifications
 110 */
 111#define XEN_HVM_MEMMAP_TYPE_RAM       1
 112#define XEN_HVM_MEMMAP_TYPE_RESERVED  2
 113#define XEN_HVM_MEMMAP_TYPE_ACPI      3
 114#define XEN_HVM_MEMMAP_TYPE_NVS       4
 115#define XEN_HVM_MEMMAP_TYPE_UNUSABLE  5
 116#define XEN_HVM_MEMMAP_TYPE_DISABLED  6
 117#define XEN_HVM_MEMMAP_TYPE_PMEM      7
 118
 119/*
 120 * C representation of the x86/HVM start info layout.
 121 *
 122 * The canonical definition of this layout is above, this is just a way to
 123 * represent the layout described there using C types.
 124 */
 125struct hvm_start_info {
 126    uint32_t magic;             /* Contains the magic value 0x336ec578       */
 127                                /* ("xEn3" with the 0x80 bit of the "E" set).*/
 128    uint32_t version;           /* Version of this structure.                */
 129    uint32_t flags;             /* SIF_xxx flags.                            */
 130    uint32_t nr_modules;        /* Number of modules passed to the kernel.   */
 131    uint64_t modlist_paddr;     /* Physical address of an array of           */
 132                                /* hvm_modlist_entry.                        */
 133    uint64_t cmdline_paddr;     /* Physical address of the command line.     */
 134    uint64_t rsdp_paddr;        /* Physical address of the RSDP ACPI data    */
 135                                /* structure.                                */
 136    /* All following fields only present in version 1 and newer */
 137    uint64_t memmap_paddr;      /* Physical address of an array of           */
 138                                /* hvm_memmap_table_entry.                   */
 139    uint32_t memmap_entries;    /* Number of entries in the memmap table.    */
 140                                /* Value will be zero if there is no memory  */
 141                                /* map being provided.                       */
 142    uint32_t reserved;          /* Must be zero.                             */
 143};
 144
 145struct hvm_modlist_entry {
 146    uint64_t paddr;             /* Physical address of the module.           */
 147    uint64_t size;              /* Size of the module in bytes.              */
 148    uint64_t cmdline_paddr;     /* Physical address of the command line.     */
 149    uint64_t reserved;
 150};
 151
 152struct hvm_memmap_table_entry {
 153    uint64_t addr;              /* Base address of the memory region         */
 154    uint64_t size;              /* Size of the memory region in bytes        */
 155    uint32_t type;              /* Mapping type                              */
 156    uint32_t reserved;          /* Must be zero for Version 1.               */
 157};
 158
 159#endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */
 160