1ebc9ac7cSZack Rusin /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2ebc9ac7cSZack Rusin /********************************************************** 3ebc9ac7cSZack Rusin * Copyright 2015-2021 VMware, Inc. 4ebc9ac7cSZack Rusin * 5ebc9ac7cSZack Rusin * Permission is hereby granted, free of charge, to any person 6ebc9ac7cSZack Rusin * obtaining a copy of this software and associated documentation 7ebc9ac7cSZack Rusin * files (the "Software"), to deal in the Software without 8ebc9ac7cSZack Rusin * restriction, including without limitation the rights to use, copy, 9ebc9ac7cSZack Rusin * modify, merge, publish, distribute, sublicense, and/or sell copies 10ebc9ac7cSZack Rusin * of the Software, and to permit persons to whom the Software is 11ebc9ac7cSZack Rusin * furnished to do so, subject to the following conditions: 12ebc9ac7cSZack Rusin * 13ebc9ac7cSZack Rusin * The above copyright notice and this permission notice shall be 14ebc9ac7cSZack Rusin * included in all copies or substantial portions of the Software. 15ebc9ac7cSZack Rusin * 16ebc9ac7cSZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17ebc9ac7cSZack Rusin * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18ebc9ac7cSZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19ebc9ac7cSZack Rusin * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 20ebc9ac7cSZack Rusin * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 21ebc9ac7cSZack Rusin * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22ebc9ac7cSZack Rusin * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23ebc9ac7cSZack Rusin * SOFTWARE. 24ebc9ac7cSZack Rusin * 25ebc9ac7cSZack Rusin **********************************************************/ 26ebc9ac7cSZack Rusin #ifndef VM_BASIC_TYPES_H 27ebc9ac7cSZack Rusin #define VM_BASIC_TYPES_H 28ebc9ac7cSZack Rusin 29ebc9ac7cSZack Rusin #include <linux/kernel.h> 30ebc9ac7cSZack Rusin #include <linux/mm.h> 31ebc9ac7cSZack Rusin #include <asm/page.h> 32ebc9ac7cSZack Rusin 33ebc9ac7cSZack Rusin typedef u32 uint32; 34ebc9ac7cSZack Rusin typedef s32 int32; 35ebc9ac7cSZack Rusin typedef u64 uint64; 36ebc9ac7cSZack Rusin typedef u16 uint16; 37ebc9ac7cSZack Rusin typedef s16 int16; 38ebc9ac7cSZack Rusin typedef u8 uint8; 39ebc9ac7cSZack Rusin typedef s8 int8; 40ebc9ac7cSZack Rusin 41ebc9ac7cSZack Rusin typedef uint64 PA; 42ebc9ac7cSZack Rusin typedef uint32 PPN; 43ebc9ac7cSZack Rusin typedef uint32 PPN32; 44ebc9ac7cSZack Rusin typedef uint64 PPN64; 45ebc9ac7cSZack Rusin 46ebc9ac7cSZack Rusin typedef bool Bool; 47ebc9ac7cSZack Rusin 48ebc9ac7cSZack Rusin #define MAX_UINT64 U64_MAX 49ebc9ac7cSZack Rusin #define MAX_UINT32 U32_MAX 50ebc9ac7cSZack Rusin #define MAX_UINT16 U16_MAX 51ebc9ac7cSZack Rusin 52ebc9ac7cSZack Rusin #define CONST64U(x) x##ULL 53ebc9ac7cSZack Rusin 54ebc9ac7cSZack Rusin #ifndef MBYTES_SHIFT 55ebc9ac7cSZack Rusin #define MBYTES_SHIFT 20 56ebc9ac7cSZack Rusin #endif 57ebc9ac7cSZack Rusin #ifndef MBYTES_2_BYTES 58ebc9ac7cSZack Rusin #define MBYTES_2_BYTES(_nbytes) ((uint64)(_nbytes) << MBYTES_SHIFT) 59ebc9ac7cSZack Rusin #endif 60ebc9ac7cSZack Rusin 61ebc9ac7cSZack Rusin /* 62ebc9ac7cSZack Rusin * MKS Guest Stats types 63ebc9ac7cSZack Rusin */ 64ebc9ac7cSZack Rusin 65ebc9ac7cSZack Rusin typedef struct MKSGuestStatCounter { 66ebc9ac7cSZack Rusin atomic64_t count; 67ebc9ac7cSZack Rusin } MKSGuestStatCounter; 68ebc9ac7cSZack Rusin 69ebc9ac7cSZack Rusin typedef struct MKSGuestStatCounterTime { 70ebc9ac7cSZack Rusin MKSGuestStatCounter counter; 71ebc9ac7cSZack Rusin atomic64_t selfCycles; 72ebc9ac7cSZack Rusin atomic64_t totalCycles; 73ebc9ac7cSZack Rusin } MKSGuestStatCounterTime; 74ebc9ac7cSZack Rusin 75ebc9ac7cSZack Rusin /* 76ebc9ac7cSZack Rusin * Flags for MKSGuestStatInfoEntry::flags below 77ebc9ac7cSZack Rusin */ 78ebc9ac7cSZack Rusin 79ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_FLAG_NONE 0 80ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_FLAG_TIME (1U << 0) 81ebc9ac7cSZack Rusin 82ebc9ac7cSZack Rusin typedef __attribute__((aligned(32))) struct MKSGuestStatInfoEntry { 83ebc9ac7cSZack Rusin union { 84ebc9ac7cSZack Rusin const char *s; 85ebc9ac7cSZack Rusin uint64 u; 86ebc9ac7cSZack Rusin } name; 87ebc9ac7cSZack Rusin union { 88ebc9ac7cSZack Rusin const char *s; 89ebc9ac7cSZack Rusin uint64 u; 90ebc9ac7cSZack Rusin } description; 91ebc9ac7cSZack Rusin uint64 flags; 92ebc9ac7cSZack Rusin union { 93ebc9ac7cSZack Rusin MKSGuestStatCounter *counter; 94ebc9ac7cSZack Rusin MKSGuestStatCounterTime *counterTime; 95ebc9ac7cSZack Rusin uint64 u; 96ebc9ac7cSZack Rusin } stat; 97ebc9ac7cSZack Rusin } MKSGuestStatInfoEntry; 98ebc9ac7cSZack Rusin 99ebc9ac7cSZack Rusin #define INVALID_PPN64 ((PPN64)0x000fffffffffffffULL) 100ebc9ac7cSZack Rusin 101ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_INSTANCE_DESC_LENGTH 1024 102ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_INSTANCE_MAX_STATS 4096 103ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_INSTANCE_MAX_STAT_PPNS \ 1045f50b765SCai Huoqing (PFN_UP(MKS_GUEST_STAT_INSTANCE_MAX_STATS * \ 105ebc9ac7cSZack Rusin sizeof(MKSGuestStatCounterTime))) 106ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_INSTANCE_MAX_INFO_PPNS \ 1075f50b765SCai Huoqing (PFN_UP(MKS_GUEST_STAT_INSTANCE_MAX_STATS * \ 108ebc9ac7cSZack Rusin sizeof(MKSGuestStatInfoEntry))) 109ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_AVERAGE_NAME_LENGTH 40 110ebc9ac7cSZack Rusin #define MKS_GUEST_STAT_INSTANCE_MAX_STRS_PPNS \ 1115f50b765SCai Huoqing (PFN_UP(MKS_GUEST_STAT_INSTANCE_MAX_STATS * \ 112ebc9ac7cSZack Rusin MKS_GUEST_STAT_AVERAGE_NAME_LENGTH)) 113ebc9ac7cSZack Rusin 114ebc9ac7cSZack Rusin /* 115ebc9ac7cSZack Rusin * The MKSGuestStatInstanceDescriptor is used as main interface to 116ebc9ac7cSZack Rusin * communicate guest stats back to the host code. The guest must 117ebc9ac7cSZack Rusin * allocate an instance of this structure at the start of a page and 118ebc9ac7cSZack Rusin * provide the physical address to the host. From there the host code 119ebc9ac7cSZack Rusin * can walk this structure to find other (pinned) pages containing the 120ebc9ac7cSZack Rusin * stats data. 121ebc9ac7cSZack Rusin * 122ebc9ac7cSZack Rusin * Since the MKSGuestStatInfoEntry structures contain userlevel 123ebc9ac7cSZack Rusin * pointers, the InstanceDescriptor also contains pointers to the 124*05436815STom Rix * beginning of these sections allowing the host side code to correctly 125ebc9ac7cSZack Rusin * interpret the pointers. 126ebc9ac7cSZack Rusin * 127ebc9ac7cSZack Rusin * Because the host side code never acknowledges anything back to the 128ebc9ac7cSZack Rusin * guest there is no strict requirement to maintain compatability 129ebc9ac7cSZack Rusin * across releases. If the interface changes the host might not be 130ebc9ac7cSZack Rusin * able to log stats, but the guest will continue to run normally. 131ebc9ac7cSZack Rusin */ 132ebc9ac7cSZack Rusin 133ebc9ac7cSZack Rusin typedef struct MKSGuestStatInstanceDescriptor { 134ebc9ac7cSZack Rusin uint64 reservedMBZ; /* must be zero for now. */ 135ebc9ac7cSZack Rusin uint64 statStartVA; /* VA of the start of the stats section. */ 136ebc9ac7cSZack Rusin uint64 strsStartVA; /* VA of the start of the strings section. */ 137ebc9ac7cSZack Rusin uint64 statLength; /* length of the stats section in bytes. */ 138ebc9ac7cSZack Rusin uint64 infoLength; /* length of the info entry section in bytes. */ 139ebc9ac7cSZack Rusin uint64 strsLength; /* length of the strings section in bytes. */ 140ebc9ac7cSZack Rusin PPN64 statPPNs[MKS_GUEST_STAT_INSTANCE_MAX_STAT_PPNS]; /* stat counters */ 141ebc9ac7cSZack Rusin PPN64 infoPPNs[MKS_GUEST_STAT_INSTANCE_MAX_INFO_PPNS]; /* stat info */ 142ebc9ac7cSZack Rusin PPN64 strsPPNs[MKS_GUEST_STAT_INSTANCE_MAX_STRS_PPNS]; /* strings */ 143ebc9ac7cSZack Rusin char description[MKS_GUEST_STAT_INSTANCE_DESC_LENGTH]; 144ebc9ac7cSZack Rusin } MKSGuestStatInstanceDescriptor; 145ebc9ac7cSZack Rusin 146ebc9ac7cSZack Rusin #endif 147