14f80cd2fSMaciej S. Szmigiero #ifndef HW_HYPERV_DYNMEM_PROTO_H 24f80cd2fSMaciej S. Szmigiero #define HW_HYPERV_DYNMEM_PROTO_H 34f80cd2fSMaciej S. Szmigiero 44f80cd2fSMaciej S. Szmigiero /* 54f80cd2fSMaciej S. Szmigiero * Hyper-V Dynamic Memory Protocol definitions 64f80cd2fSMaciej S. Szmigiero * 74f80cd2fSMaciej S. Szmigiero * Copyright (C) 2020-2023 Oracle and/or its affiliates. 84f80cd2fSMaciej S. Szmigiero * 94f80cd2fSMaciej S. Szmigiero * Based on drivers/hv/hv_balloon.c from Linux kernel: 104f80cd2fSMaciej S. Szmigiero * Copyright (c) 2012, Microsoft Corporation. 114f80cd2fSMaciej S. Szmigiero * 124f80cd2fSMaciej S. Szmigiero * Author: K. Y. Srinivasan <kys@microsoft.com> 134f80cd2fSMaciej S. Szmigiero * 144f80cd2fSMaciej S. Szmigiero * This work is licensed under the terms of the GNU GPL, version 2. 154f80cd2fSMaciej S. Szmigiero * See the COPYING file in the top-level directory. 164f80cd2fSMaciej S. Szmigiero */ 174f80cd2fSMaciej S. Szmigiero 184f80cd2fSMaciej S. Szmigiero /* 194f80cd2fSMaciej S. Szmigiero * Protocol versions. The low word is the minor version, the high word the major 204f80cd2fSMaciej S. Szmigiero * version. 214f80cd2fSMaciej S. Szmigiero * 224f80cd2fSMaciej S. Szmigiero * History: 234f80cd2fSMaciej S. Szmigiero * Initial version 1.0 244f80cd2fSMaciej S. Szmigiero * Changed to 0.1 on 2009/03/25 254f80cd2fSMaciej S. Szmigiero * Changes to 0.2 on 2009/05/14 264f80cd2fSMaciej S. Szmigiero * Changes to 0.3 on 2009/12/03 274f80cd2fSMaciej S. Szmigiero * Changed to 1.0 on 2011/04/05 284f80cd2fSMaciej S. Szmigiero * Changed to 2.0 on 2019/12/10 294f80cd2fSMaciej S. Szmigiero */ 304f80cd2fSMaciej S. Szmigiero 314f80cd2fSMaciej S. Szmigiero #define DYNMEM_MAKE_VERSION(Major, Minor) ((uint32_t)(((Major) << 16) | (Minor))) 324f80cd2fSMaciej S. Szmigiero #define DYNMEM_MAJOR_VERSION(Version) ((uint32_t)(Version) >> 16) 334f80cd2fSMaciej S. Szmigiero #define DYNMEM_MINOR_VERSION(Version) ((uint32_t)(Version) & 0xff) 344f80cd2fSMaciej S. Szmigiero 354f80cd2fSMaciej S. Szmigiero enum { 364f80cd2fSMaciej S. Szmigiero DYNMEM_PROTOCOL_VERSION_1 = DYNMEM_MAKE_VERSION(0, 3), 374f80cd2fSMaciej S. Szmigiero DYNMEM_PROTOCOL_VERSION_2 = DYNMEM_MAKE_VERSION(1, 0), 384f80cd2fSMaciej S. Szmigiero DYNMEM_PROTOCOL_VERSION_3 = DYNMEM_MAKE_VERSION(2, 0), 394f80cd2fSMaciej S. Szmigiero 404f80cd2fSMaciej S. Szmigiero DYNMEM_PROTOCOL_VERSION_WIN7 = DYNMEM_PROTOCOL_VERSION_1, 414f80cd2fSMaciej S. Szmigiero DYNMEM_PROTOCOL_VERSION_WIN8 = DYNMEM_PROTOCOL_VERSION_2, 424f80cd2fSMaciej S. Szmigiero DYNMEM_PROTOCOL_VERSION_WIN10 = DYNMEM_PROTOCOL_VERSION_3, 434f80cd2fSMaciej S. Szmigiero 444f80cd2fSMaciej S. Szmigiero DYNMEM_PROTOCOL_VERSION_CURRENT = DYNMEM_PROTOCOL_VERSION_WIN10 454f80cd2fSMaciej S. Szmigiero }; 464f80cd2fSMaciej S. Szmigiero 474f80cd2fSMaciej S. Szmigiero 484f80cd2fSMaciej S. Szmigiero 494f80cd2fSMaciej S. Szmigiero /* 504f80cd2fSMaciej S. Szmigiero * Message Types 514f80cd2fSMaciej S. Szmigiero */ 524f80cd2fSMaciej S. Szmigiero 534f80cd2fSMaciej S. Szmigiero enum dm_message_type { 544f80cd2fSMaciej S. Szmigiero /* 554f80cd2fSMaciej S. Szmigiero * Version 0.3 564f80cd2fSMaciej S. Szmigiero */ 574f80cd2fSMaciej S. Szmigiero DM_ERROR = 0, 584f80cd2fSMaciej S. Szmigiero DM_VERSION_REQUEST = 1, 594f80cd2fSMaciej S. Szmigiero DM_VERSION_RESPONSE = 2, 604f80cd2fSMaciej S. Szmigiero DM_CAPABILITIES_REPORT = 3, 614f80cd2fSMaciej S. Szmigiero DM_CAPABILITIES_RESPONSE = 4, 624f80cd2fSMaciej S. Szmigiero DM_STATUS_REPORT = 5, 634f80cd2fSMaciej S. Szmigiero DM_BALLOON_REQUEST = 6, 644f80cd2fSMaciej S. Szmigiero DM_BALLOON_RESPONSE = 7, 654f80cd2fSMaciej S. Szmigiero DM_UNBALLOON_REQUEST = 8, 664f80cd2fSMaciej S. Szmigiero DM_UNBALLOON_RESPONSE = 9, 674f80cd2fSMaciej S. Szmigiero DM_MEM_HOT_ADD_REQUEST = 10, 684f80cd2fSMaciej S. Szmigiero DM_MEM_HOT_ADD_RESPONSE = 11, 694f80cd2fSMaciej S. Szmigiero DM_VERSION_03_MAX = 11, 704f80cd2fSMaciej S. Szmigiero /* 714f80cd2fSMaciej S. Szmigiero * Version 1.0. 724f80cd2fSMaciej S. Szmigiero */ 734f80cd2fSMaciej S. Szmigiero DM_INFO_MESSAGE = 12, 744f80cd2fSMaciej S. Szmigiero DM_VERSION_1_MAX = 12, 754f80cd2fSMaciej S. Szmigiero 764f80cd2fSMaciej S. Szmigiero /* 774f80cd2fSMaciej S. Szmigiero * Version 2.0 784f80cd2fSMaciej S. Szmigiero */ 794f80cd2fSMaciej S. Szmigiero DM_MEM_HOT_REMOVE_REQUEST = 13, 804f80cd2fSMaciej S. Szmigiero DM_MEM_HOT_REMOVE_RESPONSE = 14 814f80cd2fSMaciej S. Szmigiero }; 824f80cd2fSMaciej S. Szmigiero 834f80cd2fSMaciej S. Szmigiero 844f80cd2fSMaciej S. Szmigiero /* 854f80cd2fSMaciej S. Szmigiero * Structures defining the dynamic memory management 864f80cd2fSMaciej S. Szmigiero * protocol. 874f80cd2fSMaciej S. Szmigiero */ 884f80cd2fSMaciej S. Szmigiero 894f80cd2fSMaciej S. Szmigiero union dm_version { 904f80cd2fSMaciej S. Szmigiero struct { 914f80cd2fSMaciej S. Szmigiero uint16_t minor_version; 924f80cd2fSMaciej S. Szmigiero uint16_t major_version; 934f80cd2fSMaciej S. Szmigiero }; 944f80cd2fSMaciej S. Szmigiero uint32_t version; 954f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 964f80cd2fSMaciej S. Szmigiero 974f80cd2fSMaciej S. Szmigiero 984f80cd2fSMaciej S. Szmigiero union dm_caps { 994f80cd2fSMaciej S. Szmigiero struct { 1004f80cd2fSMaciej S. Szmigiero uint64_t balloon:1; 1014f80cd2fSMaciej S. Szmigiero uint64_t hot_add:1; 1024f80cd2fSMaciej S. Szmigiero /* 1034f80cd2fSMaciej S. Szmigiero * To support guests that may have alignment 1044f80cd2fSMaciej S. Szmigiero * limitations on hot-add, the guest can specify 1054f80cd2fSMaciej S. Szmigiero * its alignment requirements; a value of n 1064f80cd2fSMaciej S. Szmigiero * represents an alignment of 2^n in mega bytes. 1074f80cd2fSMaciej S. Szmigiero */ 1084f80cd2fSMaciej S. Szmigiero uint64_t hot_add_alignment:4; 1094f80cd2fSMaciej S. Szmigiero uint64_t hot_remove:1; 1104f80cd2fSMaciej S. Szmigiero uint64_t reservedz:57; 1114f80cd2fSMaciej S. Szmigiero } cap_bits; 1124f80cd2fSMaciej S. Szmigiero uint64_t caps; 1134f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 1144f80cd2fSMaciej S. Szmigiero 1154f80cd2fSMaciej S. Szmigiero union dm_mem_page_range { 1164f80cd2fSMaciej S. Szmigiero struct { 1174f80cd2fSMaciej S. Szmigiero /* 1184f80cd2fSMaciej S. Szmigiero * The PFN number of the first page in the range. 1194f80cd2fSMaciej S. Szmigiero * 40 bits is the architectural limit of a PFN 1204f80cd2fSMaciej S. Szmigiero * number for AMD64. 1214f80cd2fSMaciej S. Szmigiero */ 1224f80cd2fSMaciej S. Szmigiero uint64_t start_page:40; 1234f80cd2fSMaciej S. Szmigiero /* 1244f80cd2fSMaciej S. Szmigiero * The number of pages in the range. 1254f80cd2fSMaciej S. Szmigiero */ 1264f80cd2fSMaciej S. Szmigiero uint64_t page_cnt:24; 1274f80cd2fSMaciej S. Szmigiero } finfo; 1284f80cd2fSMaciej S. Szmigiero uint64_t page_range; 1294f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 1304f80cd2fSMaciej S. Szmigiero 1314f80cd2fSMaciej S. Szmigiero 1324f80cd2fSMaciej S. Szmigiero 1334f80cd2fSMaciej S. Szmigiero /* 1344f80cd2fSMaciej S. Szmigiero * The header for all dynamic memory messages: 1354f80cd2fSMaciej S. Szmigiero * 1364f80cd2fSMaciej S. Szmigiero * type: Type of the message. 1374f80cd2fSMaciej S. Szmigiero * size: Size of the message in bytes; including the header. 1384f80cd2fSMaciej S. Szmigiero * trans_id: The guest is responsible for manufacturing this ID. 1394f80cd2fSMaciej S. Szmigiero */ 1404f80cd2fSMaciej S. Szmigiero 1414f80cd2fSMaciej S. Szmigiero struct dm_header { 1424f80cd2fSMaciej S. Szmigiero uint16_t type; 1434f80cd2fSMaciej S. Szmigiero uint16_t size; 1444f80cd2fSMaciej S. Szmigiero uint32_t trans_id; 1454f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 1464f80cd2fSMaciej S. Szmigiero 1474f80cd2fSMaciej S. Szmigiero /* 1484f80cd2fSMaciej S. Szmigiero * A generic message format for dynamic memory. 1494f80cd2fSMaciej S. Szmigiero * Specific message formats are defined later in the file. 1504f80cd2fSMaciej S. Szmigiero */ 1514f80cd2fSMaciej S. Szmigiero 1524f80cd2fSMaciej S. Szmigiero struct dm_message { 1534f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 1544f80cd2fSMaciej S. Szmigiero uint8_t data[]; /* enclosed message */ 1554f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 1564f80cd2fSMaciej S. Szmigiero 1574f80cd2fSMaciej S. Szmigiero 1584f80cd2fSMaciej S. Szmigiero /* 1594f80cd2fSMaciej S. Szmigiero * Specific message types supporting the dynamic memory protocol. 1604f80cd2fSMaciej S. Szmigiero */ 1614f80cd2fSMaciej S. Szmigiero 1624f80cd2fSMaciej S. Szmigiero /* 1634f80cd2fSMaciej S. Szmigiero * Version negotiation message. Sent from the guest to the host. 1644f80cd2fSMaciej S. Szmigiero * The guest is free to try different versions until the host 1654f80cd2fSMaciej S. Szmigiero * accepts the version. 1664f80cd2fSMaciej S. Szmigiero * 1674f80cd2fSMaciej S. Szmigiero * dm_version: The protocol version requested. 1684f80cd2fSMaciej S. Szmigiero * is_last_attempt: If TRUE, this is the last version guest will request. 1694f80cd2fSMaciej S. Szmigiero * reservedz: Reserved field, set to zero. 1704f80cd2fSMaciej S. Szmigiero */ 1714f80cd2fSMaciej S. Szmigiero 1724f80cd2fSMaciej S. Szmigiero struct dm_version_request { 1734f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 1744f80cd2fSMaciej S. Szmigiero union dm_version version; 1754f80cd2fSMaciej S. Szmigiero uint32_t is_last_attempt:1; 1764f80cd2fSMaciej S. Szmigiero uint32_t reservedz:31; 1774f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 1784f80cd2fSMaciej S. Szmigiero 1794f80cd2fSMaciej S. Szmigiero /* 1804f80cd2fSMaciej S. Szmigiero * Version response message; Host to Guest and indicates 1814f80cd2fSMaciej S. Szmigiero * if the host has accepted the version sent by the guest. 1824f80cd2fSMaciej S. Szmigiero * 1834f80cd2fSMaciej S. Szmigiero * is_accepted: If TRUE, host has accepted the version and the guest 1844f80cd2fSMaciej S. Szmigiero * should proceed to the next stage of the protocol. FALSE indicates that 1854f80cd2fSMaciej S. Szmigiero * guest should re-try with a different version. 1864f80cd2fSMaciej S. Szmigiero * 1874f80cd2fSMaciej S. Szmigiero * reservedz: Reserved field, set to zero. 1884f80cd2fSMaciej S. Szmigiero */ 1894f80cd2fSMaciej S. Szmigiero 1904f80cd2fSMaciej S. Szmigiero struct dm_version_response { 1914f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 1924f80cd2fSMaciej S. Szmigiero uint64_t is_accepted:1; 1934f80cd2fSMaciej S. Szmigiero uint64_t reservedz:63; 1944f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 1954f80cd2fSMaciej S. Szmigiero 1964f80cd2fSMaciej S. Szmigiero /* 1974f80cd2fSMaciej S. Szmigiero * Message reporting capabilities. This is sent from the guest to the 1984f80cd2fSMaciej S. Szmigiero * host. 1994f80cd2fSMaciej S. Szmigiero */ 2004f80cd2fSMaciej S. Szmigiero 2014f80cd2fSMaciej S. Szmigiero struct dm_capabilities { 2024f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 2034f80cd2fSMaciej S. Szmigiero union dm_caps caps; 2044f80cd2fSMaciej S. Szmigiero uint64_t min_page_cnt; 2054f80cd2fSMaciej S. Szmigiero uint64_t max_page_number; 2064f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 2074f80cd2fSMaciej S. Szmigiero 2084f80cd2fSMaciej S. Szmigiero /* 2094f80cd2fSMaciej S. Szmigiero * Response to the capabilities message. This is sent from the host to the 2104f80cd2fSMaciej S. Szmigiero * guest. This message notifies if the host has accepted the guest's 2114f80cd2fSMaciej S. Szmigiero * capabilities. If the host has not accepted, the guest must shutdown 2124f80cd2fSMaciej S. Szmigiero * the service. 2134f80cd2fSMaciej S. Szmigiero * 2144f80cd2fSMaciej S. Szmigiero * is_accepted: Indicates if the host has accepted guest's capabilities. 2154f80cd2fSMaciej S. Szmigiero * reservedz: Must be 0. 2164f80cd2fSMaciej S. Szmigiero */ 2174f80cd2fSMaciej S. Szmigiero 2184f80cd2fSMaciej S. Szmigiero struct dm_capabilities_resp_msg { 2194f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 2204f80cd2fSMaciej S. Szmigiero uint64_t is_accepted:1; 2214f80cd2fSMaciej S. Szmigiero uint64_t hot_remove:1; 2224f80cd2fSMaciej S. Szmigiero uint64_t suppress_pressure_reports:1; 2234f80cd2fSMaciej S. Szmigiero uint64_t reservedz:61; 2244f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 2254f80cd2fSMaciej S. Szmigiero 2264f80cd2fSMaciej S. Szmigiero /* 2274f80cd2fSMaciej S. Szmigiero * This message is used to report memory pressure from the guest. 2284f80cd2fSMaciej S. Szmigiero * This message is not part of any transaction and there is no 2294f80cd2fSMaciej S. Szmigiero * response to this message. 2304f80cd2fSMaciej S. Szmigiero * 2314f80cd2fSMaciej S. Szmigiero * num_avail: Available memory in pages. 2324f80cd2fSMaciej S. Szmigiero * num_committed: Committed memory in pages. 2334f80cd2fSMaciej S. Szmigiero * page_file_size: The accumulated size of all page files 2344f80cd2fSMaciej S. Szmigiero * in the system in pages. 235c437eb1dSMichael Tokarev * zero_free: The number of zero and free pages. 2364f80cd2fSMaciej S. Szmigiero * page_file_writes: The writes to the page file in pages. 2374f80cd2fSMaciej S. Szmigiero * io_diff: An indicator of file cache efficiency or page file activity, 2384f80cd2fSMaciej S. Szmigiero * calculated as File Cache Page Fault Count - Page Read Count. 2394f80cd2fSMaciej S. Szmigiero * This value is in pages. 2404f80cd2fSMaciej S. Szmigiero * 2414f80cd2fSMaciej S. Szmigiero * Some of these metrics are Windows specific and fortunately 2424f80cd2fSMaciej S. Szmigiero * the algorithm on the host side that computes the guest memory 2434f80cd2fSMaciej S. Szmigiero * pressure only uses num_committed value. 2444f80cd2fSMaciej S. Szmigiero */ 2454f80cd2fSMaciej S. Szmigiero 2464f80cd2fSMaciej S. Szmigiero struct dm_status { 2474f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 2484f80cd2fSMaciej S. Szmigiero uint64_t num_avail; 2494f80cd2fSMaciej S. Szmigiero uint64_t num_committed; 2504f80cd2fSMaciej S. Szmigiero uint64_t page_file_size; 2514f80cd2fSMaciej S. Szmigiero uint64_t zero_free; 2524f80cd2fSMaciej S. Szmigiero uint32_t page_file_writes; 2534f80cd2fSMaciej S. Szmigiero uint32_t io_diff; 2544f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 2554f80cd2fSMaciej S. Szmigiero 2564f80cd2fSMaciej S. Szmigiero 2574f80cd2fSMaciej S. Szmigiero /* 2584f80cd2fSMaciej S. Szmigiero * Message to ask the guest to allocate memory - balloon up message. 2594f80cd2fSMaciej S. Szmigiero * This message is sent from the host to the guest. The guest may not be 2604f80cd2fSMaciej S. Szmigiero * able to allocate as much memory as requested. 2614f80cd2fSMaciej S. Szmigiero * 2624f80cd2fSMaciej S. Szmigiero * num_pages: number of pages to allocate. 2634f80cd2fSMaciej S. Szmigiero */ 2644f80cd2fSMaciej S. Szmigiero 2654f80cd2fSMaciej S. Szmigiero struct dm_balloon { 2664f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 2674f80cd2fSMaciej S. Szmigiero uint32_t num_pages; 2684f80cd2fSMaciej S. Szmigiero uint32_t reservedz; 2694f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 2704f80cd2fSMaciej S. Szmigiero 2714f80cd2fSMaciej S. Szmigiero 2724f80cd2fSMaciej S. Szmigiero /* 2734f80cd2fSMaciej S. Szmigiero * Balloon response message; this message is sent from the guest 2744f80cd2fSMaciej S. Szmigiero * to the host in response to the balloon message. 2754f80cd2fSMaciej S. Szmigiero * 2764f80cd2fSMaciej S. Szmigiero * reservedz: Reserved; must be set to zero. 2774f80cd2fSMaciej S. Szmigiero * more_pages: If FALSE, this is the last message of the transaction. 278c437eb1dSMichael Tokarev * if TRUE there will be at least one more message from the guest. 2794f80cd2fSMaciej S. Szmigiero * 2804f80cd2fSMaciej S. Szmigiero * range_count: The number of ranges in the range array. 2814f80cd2fSMaciej S. Szmigiero * 2824f80cd2fSMaciej S. Szmigiero * range_array: An array of page ranges returned to the host. 2834f80cd2fSMaciej S. Szmigiero * 2844f80cd2fSMaciej S. Szmigiero */ 2854f80cd2fSMaciej S. Szmigiero 2864f80cd2fSMaciej S. Szmigiero struct dm_balloon_response { 2874f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 2884f80cd2fSMaciej S. Szmigiero uint32_t reservedz; 2894f80cd2fSMaciej S. Szmigiero uint32_t more_pages:1; 2904f80cd2fSMaciej S. Szmigiero uint32_t range_count:31; 2914f80cd2fSMaciej S. Szmigiero union dm_mem_page_range range_array[]; 2924f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 2934f80cd2fSMaciej S. Szmigiero 2944f80cd2fSMaciej S. Szmigiero /* 2954f80cd2fSMaciej S. Szmigiero * Un-balloon message; this message is sent from the host 2964f80cd2fSMaciej S. Szmigiero * to the guest to give guest more memory. 2974f80cd2fSMaciej S. Szmigiero * 2984f80cd2fSMaciej S. Szmigiero * more_pages: If FALSE, this is the last message of the transaction. 299c437eb1dSMichael Tokarev * if TRUE there will be at least one more message from the guest. 3004f80cd2fSMaciej S. Szmigiero * 3014f80cd2fSMaciej S. Szmigiero * reservedz: Reserved; must be set to zero. 3024f80cd2fSMaciej S. Szmigiero * 3034f80cd2fSMaciej S. Szmigiero * range_count: The number of ranges in the range array. 3044f80cd2fSMaciej S. Szmigiero * 3054f80cd2fSMaciej S. Szmigiero * range_array: An array of page ranges returned to the host. 3064f80cd2fSMaciej S. Szmigiero * 3074f80cd2fSMaciej S. Szmigiero */ 3084f80cd2fSMaciej S. Szmigiero 3094f80cd2fSMaciej S. Szmigiero struct dm_unballoon_request { 3104f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 3114f80cd2fSMaciej S. Szmigiero uint32_t more_pages:1; 3124f80cd2fSMaciej S. Szmigiero uint32_t reservedz:31; 3134f80cd2fSMaciej S. Szmigiero uint32_t range_count; 3144f80cd2fSMaciej S. Szmigiero union dm_mem_page_range range_array[]; 3154f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 3164f80cd2fSMaciej S. Szmigiero 3174f80cd2fSMaciej S. Szmigiero /* 3184f80cd2fSMaciej S. Szmigiero * Un-balloon response message; this message is sent from the guest 3194f80cd2fSMaciej S. Szmigiero * to the host in response to an unballoon request. 3204f80cd2fSMaciej S. Szmigiero * 3214f80cd2fSMaciej S. Szmigiero */ 3224f80cd2fSMaciej S. Szmigiero 3234f80cd2fSMaciej S. Szmigiero struct dm_unballoon_response { 3244f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 3254f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 3264f80cd2fSMaciej S. Szmigiero 3274f80cd2fSMaciej S. Szmigiero 3284f80cd2fSMaciej S. Szmigiero /* 3294f80cd2fSMaciej S. Szmigiero * Hot add request message. Message sent from the host to the guest. 3304f80cd2fSMaciej S. Szmigiero * 331*54698728SMaciej S. Szmigiero * range: Memory range to hot add. 332*54698728SMaciej S. Szmigiero * region: Explicit hot add memory region for guest to use. Optional. 3334f80cd2fSMaciej S. Szmigiero * 3344f80cd2fSMaciej S. Szmigiero */ 3354f80cd2fSMaciej S. Szmigiero 3364f80cd2fSMaciej S. Szmigiero struct dm_hot_add { 3374f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 3384f80cd2fSMaciej S. Szmigiero union dm_mem_page_range range; 3394f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 3404f80cd2fSMaciej S. Szmigiero 341*54698728SMaciej S. Szmigiero struct dm_hot_add_with_region { 342*54698728SMaciej S. Szmigiero struct dm_header hdr; 343*54698728SMaciej S. Szmigiero union dm_mem_page_range range; 344*54698728SMaciej S. Szmigiero union dm_mem_page_range region; 345*54698728SMaciej S. Szmigiero } QEMU_PACKED; 346*54698728SMaciej S. Szmigiero 3474f80cd2fSMaciej S. Szmigiero /* 3484f80cd2fSMaciej S. Szmigiero * Hot add response message. 3494f80cd2fSMaciej S. Szmigiero * This message is sent by the guest to report the status of a hot add request. 3504f80cd2fSMaciej S. Szmigiero * If page_count is less than the requested page count, then the host should 3514f80cd2fSMaciej S. Szmigiero * assume all further hot add requests will fail, since this indicates that 3524f80cd2fSMaciej S. Szmigiero * the guest has hit an upper physical memory barrier. 3534f80cd2fSMaciej S. Szmigiero * 3544f80cd2fSMaciej S. Szmigiero * Hot adds may also fail due to low resources; in this case, the guest must 3554f80cd2fSMaciej S. Szmigiero * not complete this message until the hot add can succeed, and the host must 3564f80cd2fSMaciej S. Szmigiero * not send a new hot add request until the response is sent. 3574f80cd2fSMaciej S. Szmigiero * If VSC fails to hot add memory DYNMEM_NUMBER_OF_UNSUCCESSFUL_HOTADD_ATTEMPTS 3584f80cd2fSMaciej S. Szmigiero * times it fails the request. 3594f80cd2fSMaciej S. Szmigiero * 3604f80cd2fSMaciej S. Szmigiero * 3614f80cd2fSMaciej S. Szmigiero * page_count: number of pages that were successfully hot added. 3624f80cd2fSMaciej S. Szmigiero * 3634f80cd2fSMaciej S. Szmigiero * result: result of the operation 1: success, 0: failure. 3644f80cd2fSMaciej S. Szmigiero * 3654f80cd2fSMaciej S. Szmigiero */ 3664f80cd2fSMaciej S. Szmigiero 3674f80cd2fSMaciej S. Szmigiero struct dm_hot_add_response { 3684f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 3694f80cd2fSMaciej S. Szmigiero uint32_t page_count; 3704f80cd2fSMaciej S. Szmigiero uint32_t result; 3714f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 3724f80cd2fSMaciej S. Szmigiero 3734f80cd2fSMaciej S. Szmigiero struct dm_hot_remove { 3744f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 3754f80cd2fSMaciej S. Szmigiero uint32_t virtual_node; 3764f80cd2fSMaciej S. Szmigiero uint32_t page_count; 3774f80cd2fSMaciej S. Szmigiero uint32_t qos_flags; 3784f80cd2fSMaciej S. Szmigiero uint32_t reservedZ; 3794f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 3804f80cd2fSMaciej S. Szmigiero 3814f80cd2fSMaciej S. Szmigiero struct dm_hot_remove_response { 3824f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 3834f80cd2fSMaciej S. Szmigiero uint32_t result; 3844f80cd2fSMaciej S. Szmigiero uint32_t range_count; 3854f80cd2fSMaciej S. Szmigiero uint64_t more_pages:1; 3864f80cd2fSMaciej S. Szmigiero uint64_t reservedz:63; 3874f80cd2fSMaciej S. Szmigiero union dm_mem_page_range range_array[]; 3884f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 3894f80cd2fSMaciej S. Szmigiero 3904f80cd2fSMaciej S. Szmigiero #define DM_REMOVE_QOS_LARGE (1 << 0) 3914f80cd2fSMaciej S. Szmigiero #define DM_REMOVE_QOS_LOCAL (1 << 1) 3924f80cd2fSMaciej S. Szmigiero #define DM_REMOVE_QOS_MASK (0x3) 3934f80cd2fSMaciej S. Szmigiero 3944f80cd2fSMaciej S. Szmigiero /* 3954f80cd2fSMaciej S. Szmigiero * Types of information sent from host to the guest. 3964f80cd2fSMaciej S. Szmigiero */ 3974f80cd2fSMaciej S. Szmigiero 3984f80cd2fSMaciej S. Szmigiero enum dm_info_type { 3994f80cd2fSMaciej S. Szmigiero INFO_TYPE_MAX_PAGE_CNT = 0, 4004f80cd2fSMaciej S. Szmigiero MAX_INFO_TYPE 4014f80cd2fSMaciej S. Szmigiero }; 4024f80cd2fSMaciej S. Szmigiero 4034f80cd2fSMaciej S. Szmigiero 4044f80cd2fSMaciej S. Szmigiero /* 4054f80cd2fSMaciej S. Szmigiero * Header for the information message. 4064f80cd2fSMaciej S. Szmigiero */ 4074f80cd2fSMaciej S. Szmigiero 4084f80cd2fSMaciej S. Szmigiero struct dm_info_header { 4094f80cd2fSMaciej S. Szmigiero enum dm_info_type type; 4104f80cd2fSMaciej S. Szmigiero uint32_t data_size; 4114f80cd2fSMaciej S. Szmigiero uint8_t data[]; 4124f80cd2fSMaciej S. Szmigiero } QEMU_PACKED; 4134f80cd2fSMaciej S. Szmigiero 4144f80cd2fSMaciej S. Szmigiero /* 4154f80cd2fSMaciej S. Szmigiero * This message is sent from the host to the guest to pass 4164f80cd2fSMaciej S. Szmigiero * some relevant information (win8 addition). 4174f80cd2fSMaciej S. Szmigiero * 4184f80cd2fSMaciej S. Szmigiero * reserved: no used. 4194f80cd2fSMaciej S. Szmigiero * info_size: size of the information blob. 4204f80cd2fSMaciej S. Szmigiero * info: information blob. 4214f80cd2fSMaciej S. Szmigiero */ 4224f80cd2fSMaciej S. Szmigiero 4234f80cd2fSMaciej S. Szmigiero struct dm_info_msg { 4244f80cd2fSMaciej S. Szmigiero struct dm_header hdr; 4254f80cd2fSMaciej S. Szmigiero uint32_t reserved; 4264f80cd2fSMaciej S. Szmigiero uint32_t info_size; 4274f80cd2fSMaciej S. Szmigiero uint8_t info[]; 4284f80cd2fSMaciej S. Szmigiero }; 4294f80cd2fSMaciej S. Szmigiero 4304f80cd2fSMaciej S. Szmigiero #endif 431