1 /* SPDX-License-Identifier: MIT */ 2 /* 3 * Copyright (c) 2016, Citrix Systems, Inc. 4 */ 5 6 #ifndef __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ 7 #define __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ 8 9 /* 10 * Start of day structure passed to PVH guests and to HVM guests in %ebx. 11 * 12 * NOTE: nothing will be loaded at physical address 0, so a 0 value in any 13 * of the address fields should be treated as not present. 14 * 15 * 0 +----------------+ 16 * | magic | Contains the magic value XEN_HVM_START_MAGIC_VALUE 17 * | | ("xEn3" with the 0x80 bit of the "E" set). 18 * 4 +----------------+ 19 * | version | Version of this structure. Current version is 1. New 20 * | | versions are guaranteed to be backwards-compatible. 21 * 8 +----------------+ 22 * | flags | SIF_xxx flags. 23 * 12 +----------------+ 24 * | nr_modules | Number of modules passed to the kernel. 25 * 16 +----------------+ 26 * | modlist_paddr | Physical address of an array of modules 27 * | | (layout of the structure below). 28 * 24 +----------------+ 29 * | cmdline_paddr | Physical address of the command line, 30 * | | a zero-terminated ASCII string. 31 * 32 +----------------+ 32 * | rsdp_paddr | Physical address of the RSDP ACPI data structure. 33 * 40 +----------------+ 34 * | memmap_paddr | Physical address of the (optional) memory map. Only 35 * | | present in version 1 and newer of the structure. 36 * 48 +----------------+ 37 * | memmap_entries | Number of entries in the memory map table. Zero 38 * | | if there is no memory map being provided. Only 39 * | | present in version 1 and newer of the structure. 40 * 52 +----------------+ 41 * | reserved | Version 1 and newer only. 42 * 56 +----------------+ 43 * 44 * The layout of each entry in the module structure is the following: 45 * 46 * 0 +----------------+ 47 * | paddr | Physical address of the module. 48 * 8 +----------------+ 49 * | size | Size of the module in bytes. 50 * 16 +----------------+ 51 * | cmdline_paddr | Physical address of the command line, 52 * | | a zero-terminated ASCII string. 53 * 24 +----------------+ 54 * | reserved | 55 * 32 +----------------+ 56 * 57 * The layout of each entry in the memory map table is as follows: 58 * 59 * 0 +----------------+ 60 * | addr | Base address 61 * 8 +----------------+ 62 * | size | Size of mapping in bytes 63 * 16 +----------------+ 64 * | type | Type of mapping as defined between the hypervisor 65 * | | and guest. See XEN_HVM_MEMMAP_TYPE_* values below. 66 * 20 +----------------| 67 * | reserved | 68 * 24 +----------------+ 69 * 70 * The address and sizes are always a 64bit little endian unsigned integer. 71 * 72 * NB: Xen on x86 will always try to place all the data below the 4GiB 73 * boundary. 74 * 75 * Version numbers of the hvm_start_info structure have evolved like this: 76 * 77 * Version 0: Initial implementation. 78 * 79 * Version 1: Added the memmap_paddr/memmap_entries fields (plus 4 bytes of 80 * padding) to the end of the hvm_start_info struct. These new 81 * fields can be used to pass a memory map to the guest. The 82 * memory map is optional and so guests that understand version 1 83 * of the structure must check that memmap_entries is non-zero 84 * before trying to read the memory map. 85 */ 86 #define XEN_HVM_START_MAGIC_VALUE 0x336ec578 87 88 /* 89 * The values used in the type field of the memory map table entries are 90 * defined below and match the Address Range Types as defined in the "System 91 * Address Map Interfaces" section of the ACPI Specification. Please refer to 92 * section 15 in version 6.2 of the ACPI spec: http://uefi.org/specifications 93 */ 94 #define XEN_HVM_MEMMAP_TYPE_RAM 1 95 #define XEN_HVM_MEMMAP_TYPE_RESERVED 2 96 #define XEN_HVM_MEMMAP_TYPE_ACPI 3 97 #define XEN_HVM_MEMMAP_TYPE_NVS 4 98 #define XEN_HVM_MEMMAP_TYPE_UNUSABLE 5 99 #define XEN_HVM_MEMMAP_TYPE_DISABLED 6 100 #define XEN_HVM_MEMMAP_TYPE_PMEM 7 101 102 /* 103 * C representation of the x86/HVM start info layout. 104 * 105 * The canonical definition of this layout is above, this is just a way to 106 * represent the layout described there using C types. 107 */ 108 struct hvm_start_info { 109 uint32_t magic; /* Contains the magic value 0x336ec578 */ 110 /* ("xEn3" with the 0x80 bit of the "E" set).*/ 111 uint32_t version; /* Version of this structure. */ 112 uint32_t flags; /* SIF_xxx flags. */ 113 uint32_t nr_modules; /* Number of modules passed to the kernel. */ 114 uint64_t modlist_paddr; /* Physical address of an array of */ 115 /* hvm_modlist_entry. */ 116 uint64_t cmdline_paddr; /* Physical address of the command line. */ 117 uint64_t rsdp_paddr; /* Physical address of the RSDP ACPI data */ 118 /* structure. */ 119 /* All following fields only present in version 1 and newer */ 120 uint64_t memmap_paddr; /* Physical address of an array of */ 121 /* hvm_memmap_table_entry. */ 122 uint32_t memmap_entries; /* Number of entries in the memmap table. */ 123 /* Value will be zero if there is no memory */ 124 /* map being provided. */ 125 uint32_t reserved; /* Must be zero. */ 126 }; 127 128 struct hvm_modlist_entry { 129 uint64_t paddr; /* Physical address of the module. */ 130 uint64_t size; /* Size of the module in bytes. */ 131 uint64_t cmdline_paddr; /* Physical address of the command line. */ 132 uint64_t reserved; 133 }; 134 135 struct hvm_memmap_table_entry { 136 uint64_t addr; /* Base address of the memory region */ 137 uint64_t size; /* Size of the memory region in bytes */ 138 uint32_t type; /* Mapping type */ 139 uint32_t reserved; /* Must be zero for Version 1. */ 140 }; 141 142 #endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */ 143