15084Sjohnlev /****************************************************************************** 25084Sjohnlev * sysctl.h 35084Sjohnlev * 45084Sjohnlev * System management operations. For use by node control stack. 55084Sjohnlev * 65084Sjohnlev * Permission is hereby granted, free of charge, to any person obtaining a copy 75084Sjohnlev * of this software and associated documentation files (the "Software"), to 85084Sjohnlev * deal in the Software without restriction, including without limitation the 95084Sjohnlev * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 105084Sjohnlev * sell copies of the Software, and to permit persons to whom the Software is 115084Sjohnlev * furnished to do so, subject to the following conditions: 125084Sjohnlev * 135084Sjohnlev * The above copyright notice and this permission notice shall be included in 145084Sjohnlev * all copies or substantial portions of the Software. 155084Sjohnlev * 165084Sjohnlev * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 175084Sjohnlev * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 185084Sjohnlev * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 195084Sjohnlev * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 205084Sjohnlev * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 215084Sjohnlev * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 225084Sjohnlev * DEALINGS IN THE SOFTWARE. 235084Sjohnlev * 245084Sjohnlev * Copyright (c) 2002-2006, K Fraser 255084Sjohnlev */ 265084Sjohnlev 275084Sjohnlev #ifndef __XEN_PUBLIC_SYSCTL_H__ 285084Sjohnlev #define __XEN_PUBLIC_SYSCTL_H__ 295084Sjohnlev 305084Sjohnlev #if !defined(__XEN__) && !defined(__XEN_TOOLS__) 315084Sjohnlev #error "sysctl operations are intended for use by node control tools only" 325084Sjohnlev #endif 335084Sjohnlev 345084Sjohnlev #include "xen.h" 355084Sjohnlev #include "domctl.h" 365084Sjohnlev 37*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_INTERFACE_VERSION 0x00000006 385084Sjohnlev 395084Sjohnlev /* 405084Sjohnlev * Read console content from Xen buffer ring. 415084Sjohnlev */ 425084Sjohnlev #define XEN_SYSCTL_readconsole 1 435084Sjohnlev struct xen_sysctl_readconsole { 44*10175SStuart.Maybee@Sun.COM /* IN: Non-zero -> clear after reading. */ 45*10175SStuart.Maybee@Sun.COM uint8_t clear; 46*10175SStuart.Maybee@Sun.COM /* IN: Non-zero -> start index specified by @index field. */ 47*10175SStuart.Maybee@Sun.COM uint8_t incremental; 48*10175SStuart.Maybee@Sun.COM uint8_t pad0, pad1; 49*10175SStuart.Maybee@Sun.COM /* 50*10175SStuart.Maybee@Sun.COM * IN: Start index for consuming from ring buffer (if @incremental); 51*10175SStuart.Maybee@Sun.COM * OUT: End index after consuming from ring buffer. 52*10175SStuart.Maybee@Sun.COM */ 53*10175SStuart.Maybee@Sun.COM uint32_t index; 54*10175SStuart.Maybee@Sun.COM /* IN: Virtual address to write console data. */ 55*10175SStuart.Maybee@Sun.COM XEN_GUEST_HANDLE_64(char) buffer; 56*10175SStuart.Maybee@Sun.COM /* IN: Size of buffer; OUT: Bytes written to buffer. */ 57*10175SStuart.Maybee@Sun.COM uint32_t count; 585084Sjohnlev }; 595084Sjohnlev typedef struct xen_sysctl_readconsole xen_sysctl_readconsole_t; 605084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_readconsole_t); 615084Sjohnlev 625084Sjohnlev /* Get trace buffers machine base address */ 635084Sjohnlev #define XEN_SYSCTL_tbuf_op 2 645084Sjohnlev struct xen_sysctl_tbuf_op { 655084Sjohnlev /* IN variables */ 665084Sjohnlev #define XEN_SYSCTL_TBUFOP_get_info 0 675084Sjohnlev #define XEN_SYSCTL_TBUFOP_set_cpu_mask 1 685084Sjohnlev #define XEN_SYSCTL_TBUFOP_set_evt_mask 2 695084Sjohnlev #define XEN_SYSCTL_TBUFOP_set_size 3 705084Sjohnlev #define XEN_SYSCTL_TBUFOP_enable 4 715084Sjohnlev #define XEN_SYSCTL_TBUFOP_disable 5 725084Sjohnlev uint32_t cmd; 735084Sjohnlev /* IN/OUT variables */ 745084Sjohnlev struct xenctl_cpumap cpu_mask; 755084Sjohnlev uint32_t evt_mask; 765084Sjohnlev /* OUT variables */ 776144Srab uint64_aligned_t buffer_mfn; 785084Sjohnlev uint32_t size; 795084Sjohnlev }; 805084Sjohnlev typedef struct xen_sysctl_tbuf_op xen_sysctl_tbuf_op_t; 815084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_tbuf_op_t); 825084Sjohnlev 835084Sjohnlev /* 845084Sjohnlev * Get physical information about the host machine 855084Sjohnlev */ 865084Sjohnlev #define XEN_SYSCTL_physinfo 3 87*10175SStuart.Maybee@Sun.COM /* (x86) The platform supports HVM guests. */ 88*10175SStuart.Maybee@Sun.COM #define _XEN_SYSCTL_PHYSCAP_hvm 0 89*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_PHYSCAP_hvm (1u<<_XEN_SYSCTL_PHYSCAP_hvm) 90*10175SStuart.Maybee@Sun.COM /* (x86) The platform supports HVM-guest direct access to I/O devices. */ 91*10175SStuart.Maybee@Sun.COM #define _XEN_SYSCTL_PHYSCAP_hvm_directio 1 92*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_PHYSCAP_hvm_directio (1u<<_XEN_SYSCTL_PHYSCAP_hvm_directio) 935084Sjohnlev struct xen_sysctl_physinfo { 945084Sjohnlev uint32_t threads_per_core; 955084Sjohnlev uint32_t cores_per_socket; 96*10175SStuart.Maybee@Sun.COM uint32_t nr_cpus; 975084Sjohnlev uint32_t nr_nodes; 985084Sjohnlev uint32_t cpu_khz; 996144Srab uint64_aligned_t total_pages; 1006144Srab uint64_aligned_t free_pages; 1016144Srab uint64_aligned_t scrub_pages; 1025084Sjohnlev uint32_t hw_cap[8]; 103*10175SStuart.Maybee@Sun.COM 104*10175SStuart.Maybee@Sun.COM /* 105*10175SStuart.Maybee@Sun.COM * IN: maximum addressable entry in the caller-provided cpu_to_node array. 106*10175SStuart.Maybee@Sun.COM * OUT: largest cpu identifier in the system. 107*10175SStuart.Maybee@Sun.COM * If OUT is greater than IN then the cpu_to_node array is truncated! 108*10175SStuart.Maybee@Sun.COM */ 109*10175SStuart.Maybee@Sun.COM uint32_t max_cpu_id; 110*10175SStuart.Maybee@Sun.COM /* 111*10175SStuart.Maybee@Sun.COM * If not NULL, this array is filled with node identifier for each cpu. 112*10175SStuart.Maybee@Sun.COM * If a cpu has no node information (e.g., cpu not present) then the 113*10175SStuart.Maybee@Sun.COM * sentinel value ~0u is written. 114*10175SStuart.Maybee@Sun.COM * The size of this array is specified by the caller in @max_cpu_id. 115*10175SStuart.Maybee@Sun.COM * If the actual @max_cpu_id is smaller than the array then the trailing 116*10175SStuart.Maybee@Sun.COM * elements of the array will not be written by the sysctl. 117*10175SStuart.Maybee@Sun.COM */ 118*10175SStuart.Maybee@Sun.COM XEN_GUEST_HANDLE_64(uint32) cpu_to_node; 119*10175SStuart.Maybee@Sun.COM 120*10175SStuart.Maybee@Sun.COM /* XEN_SYSCTL_PHYSCAP_??? */ 121*10175SStuart.Maybee@Sun.COM uint32_t capabilities; 1225084Sjohnlev }; 1235084Sjohnlev typedef struct xen_sysctl_physinfo xen_sysctl_physinfo_t; 1245084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_physinfo_t); 1255084Sjohnlev 1265084Sjohnlev /* 1275084Sjohnlev * Get the ID of the current scheduler. 1285084Sjohnlev */ 1295084Sjohnlev #define XEN_SYSCTL_sched_id 4 1305084Sjohnlev struct xen_sysctl_sched_id { 1315084Sjohnlev /* OUT variable */ 1325084Sjohnlev uint32_t sched_id; 1335084Sjohnlev }; 1345084Sjohnlev typedef struct xen_sysctl_sched_id xen_sysctl_sched_id_t; 1355084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_sched_id_t); 1365084Sjohnlev 1375084Sjohnlev /* Interface for controlling Xen software performance counters. */ 1385084Sjohnlev #define XEN_SYSCTL_perfc_op 5 1395084Sjohnlev /* Sub-operations: */ 1405084Sjohnlev #define XEN_SYSCTL_PERFCOP_reset 1 /* Reset all counters to zero. */ 1415084Sjohnlev #define XEN_SYSCTL_PERFCOP_query 2 /* Get perfctr information. */ 1425084Sjohnlev struct xen_sysctl_perfc_desc { 1435084Sjohnlev char name[80]; /* name of perf counter */ 1445084Sjohnlev uint32_t nr_vals; /* number of values for this counter */ 1455084Sjohnlev }; 1465084Sjohnlev typedef struct xen_sysctl_perfc_desc xen_sysctl_perfc_desc_t; 1475084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_desc_t); 1485084Sjohnlev typedef uint32_t xen_sysctl_perfc_val_t; 1495084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t); 1505084Sjohnlev 1515084Sjohnlev struct xen_sysctl_perfc_op { 1525084Sjohnlev /* IN variables. */ 1535084Sjohnlev uint32_t cmd; /* XEN_SYSCTL_PERFCOP_??? */ 1545084Sjohnlev /* OUT variables. */ 1555084Sjohnlev uint32_t nr_counters; /* number of counters description */ 1565084Sjohnlev uint32_t nr_vals; /* number of values */ 1575084Sjohnlev /* counter information (or NULL) */ 1586144Srab XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc; 1595084Sjohnlev /* counter values (or NULL) */ 1606144Srab XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val; 1615084Sjohnlev }; 1625084Sjohnlev typedef struct xen_sysctl_perfc_op xen_sysctl_perfc_op_t; 1635084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_op_t); 1645084Sjohnlev 1655084Sjohnlev #define XEN_SYSCTL_getdomaininfolist 6 1665084Sjohnlev struct xen_sysctl_getdomaininfolist { 1675084Sjohnlev /* IN variables. */ 1685084Sjohnlev domid_t first_domain; 1695084Sjohnlev uint32_t max_domains; 1706144Srab XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer; 1715084Sjohnlev /* OUT variables. */ 1725084Sjohnlev uint32_t num_domains; 1735084Sjohnlev }; 1745084Sjohnlev typedef struct xen_sysctl_getdomaininfolist xen_sysctl_getdomaininfolist_t; 1755084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getdomaininfolist_t); 1765084Sjohnlev 1776144Srab /* Inject debug keys into Xen. */ 1786144Srab #define XEN_SYSCTL_debug_keys 7 1796144Srab struct xen_sysctl_debug_keys { 1806144Srab /* IN variables. */ 1816144Srab XEN_GUEST_HANDLE_64(char) keys; 1826144Srab uint32_t nr_keys; 1836144Srab }; 1846144Srab typedef struct xen_sysctl_debug_keys xen_sysctl_debug_keys_t; 1856144Srab DEFINE_XEN_GUEST_HANDLE(xen_sysctl_debug_keys_t); 1866144Srab 1876144Srab /* Get physical CPU information. */ 1886144Srab #define XEN_SYSCTL_getcpuinfo 8 1896144Srab struct xen_sysctl_cpuinfo { 190*10175SStuart.Maybee@Sun.COM uint64_aligned_t idletime; 1916144Srab }; 1926144Srab typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t; 1936144Srab DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t); 1946144Srab struct xen_sysctl_getcpuinfo { 1956144Srab /* IN variables. */ 1966144Srab uint32_t max_cpus; 1976144Srab XEN_GUEST_HANDLE_64(xen_sysctl_cpuinfo_t) info; 1986144Srab /* OUT variables. */ 1996144Srab uint32_t nr_cpus; 2006144Srab }; 2016144Srab typedef struct xen_sysctl_getcpuinfo xen_sysctl_getcpuinfo_t; 2026144Srab DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getcpuinfo_t); 2036144Srab 204*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_availheap 9 205*10175SStuart.Maybee@Sun.COM struct xen_sysctl_availheap { 206*10175SStuart.Maybee@Sun.COM /* IN variables. */ 207*10175SStuart.Maybee@Sun.COM uint32_t min_bitwidth; /* Smallest address width (zero if don't care). */ 208*10175SStuart.Maybee@Sun.COM uint32_t max_bitwidth; /* Largest address width (zero if don't care). */ 209*10175SStuart.Maybee@Sun.COM int32_t node; /* NUMA node of interest (-1 for all nodes). */ 210*10175SStuart.Maybee@Sun.COM /* OUT variables. */ 211*10175SStuart.Maybee@Sun.COM uint64_aligned_t avail_bytes;/* Bytes available in the specified region. */ 212*10175SStuart.Maybee@Sun.COM }; 213*10175SStuart.Maybee@Sun.COM typedef struct xen_sysctl_availheap xen_sysctl_availheap_t; 214*10175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(xen_sysctl_availheap_t); 215*10175SStuart.Maybee@Sun.COM 216*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_get_pmstat 10 217*10175SStuart.Maybee@Sun.COM struct pm_px_val { 218*10175SStuart.Maybee@Sun.COM uint64_aligned_t freq; /* Px core frequency */ 219*10175SStuart.Maybee@Sun.COM uint64_aligned_t residency; /* Px residency time */ 220*10175SStuart.Maybee@Sun.COM uint64_aligned_t count; /* Px transition count */ 221*10175SStuart.Maybee@Sun.COM }; 222*10175SStuart.Maybee@Sun.COM typedef struct pm_px_val pm_px_val_t; 223*10175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(pm_px_val_t); 224*10175SStuart.Maybee@Sun.COM 225*10175SStuart.Maybee@Sun.COM struct pm_px_stat { 226*10175SStuart.Maybee@Sun.COM uint8_t total; /* total Px states */ 227*10175SStuart.Maybee@Sun.COM uint8_t usable; /* usable Px states */ 228*10175SStuart.Maybee@Sun.COM uint8_t last; /* last Px state */ 229*10175SStuart.Maybee@Sun.COM uint8_t cur; /* current Px state */ 230*10175SStuart.Maybee@Sun.COM XEN_GUEST_HANDLE_64(uint64) trans_pt; /* Px transition table */ 231*10175SStuart.Maybee@Sun.COM XEN_GUEST_HANDLE_64(pm_px_val_t) pt; 232*10175SStuart.Maybee@Sun.COM }; 233*10175SStuart.Maybee@Sun.COM typedef struct pm_px_stat pm_px_stat_t; 234*10175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(pm_px_stat_t); 235*10175SStuart.Maybee@Sun.COM 236*10175SStuart.Maybee@Sun.COM struct pm_cx_stat { 237*10175SStuart.Maybee@Sun.COM uint32_t nr; /* entry nr in triggers & residencies, including C0 */ 238*10175SStuart.Maybee@Sun.COM uint32_t last; /* last Cx state */ 239*10175SStuart.Maybee@Sun.COM uint64_aligned_t idle_time; /* idle time from boot */ 240*10175SStuart.Maybee@Sun.COM XEN_GUEST_HANDLE_64(uint64) triggers; /* Cx trigger counts */ 241*10175SStuart.Maybee@Sun.COM XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */ 242*10175SStuart.Maybee@Sun.COM }; 243*10175SStuart.Maybee@Sun.COM 244*10175SStuart.Maybee@Sun.COM struct xen_sysctl_get_pmstat { 245*10175SStuart.Maybee@Sun.COM #define PMSTAT_CATEGORY_MASK 0xf0 246*10175SStuart.Maybee@Sun.COM #define PMSTAT_PX 0x10 247*10175SStuart.Maybee@Sun.COM #define PMSTAT_CX 0x20 248*10175SStuart.Maybee@Sun.COM #define PMSTAT_get_max_px (PMSTAT_PX | 0x1) 249*10175SStuart.Maybee@Sun.COM #define PMSTAT_get_pxstat (PMSTAT_PX | 0x2) 250*10175SStuart.Maybee@Sun.COM #define PMSTAT_reset_pxstat (PMSTAT_PX | 0x3) 251*10175SStuart.Maybee@Sun.COM #define PMSTAT_get_max_cx (PMSTAT_CX | 0x1) 252*10175SStuart.Maybee@Sun.COM #define PMSTAT_get_cxstat (PMSTAT_CX | 0x2) 253*10175SStuart.Maybee@Sun.COM #define PMSTAT_reset_cxstat (PMSTAT_CX | 0x3) 254*10175SStuart.Maybee@Sun.COM uint32_t type; 255*10175SStuart.Maybee@Sun.COM uint32_t cpuid; 256*10175SStuart.Maybee@Sun.COM union { 257*10175SStuart.Maybee@Sun.COM struct pm_px_stat getpx; 258*10175SStuart.Maybee@Sun.COM struct pm_cx_stat getcx; 259*10175SStuart.Maybee@Sun.COM /* other struct for tx, etc */ 260*10175SStuart.Maybee@Sun.COM } u; 261*10175SStuart.Maybee@Sun.COM }; 262*10175SStuart.Maybee@Sun.COM typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t; 263*10175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t); 264*10175SStuart.Maybee@Sun.COM 265*10175SStuart.Maybee@Sun.COM /* 266*10175SStuart.Maybee@Sun.COM * Status codes. Must be greater than 0 to avoid confusing 267*10175SStuart.Maybee@Sun.COM * sysctl callers that see 0 as a plain successful return. 268*10175SStuart.Maybee@Sun.COM */ 269*10175SStuart.Maybee@Sun.COM #define XEN_CPU_HOTPLUG_STATUS_OFFLINE 1 270*10175SStuart.Maybee@Sun.COM #define XEN_CPU_HOTPLUG_STATUS_ONLINE 2 271*10175SStuart.Maybee@Sun.COM #define XEN_CPU_HOTPLUG_STATUS_NEW 3 272*10175SStuart.Maybee@Sun.COM 273*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_cpu_hotplug 11 274*10175SStuart.Maybee@Sun.COM struct xen_sysctl_cpu_hotplug { 275*10175SStuart.Maybee@Sun.COM /* IN variables */ 276*10175SStuart.Maybee@Sun.COM uint32_t cpu; /* Physical cpu. */ 277*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_CPU_HOTPLUG_ONLINE 0 278*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1 279*10175SStuart.Maybee@Sun.COM #define XEN_SYSCTL_CPU_HOTPLUG_STATUS 2 280*10175SStuart.Maybee@Sun.COM uint32_t op; /* hotplug opcode */ 281*10175SStuart.Maybee@Sun.COM }; 282*10175SStuart.Maybee@Sun.COM typedef struct xen_sysctl_cpu_hotplug xen_sysctl_cpu_hotplug_t; 283*10175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_hotplug_t); 284*10175SStuart.Maybee@Sun.COM 285*10175SStuart.Maybee@Sun.COM 2865084Sjohnlev struct xen_sysctl { 2875084Sjohnlev uint32_t cmd; 2885084Sjohnlev uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */ 2895084Sjohnlev union { 2905084Sjohnlev struct xen_sysctl_readconsole readconsole; 2915084Sjohnlev struct xen_sysctl_tbuf_op tbuf_op; 2925084Sjohnlev struct xen_sysctl_physinfo physinfo; 2935084Sjohnlev struct xen_sysctl_sched_id sched_id; 2945084Sjohnlev struct xen_sysctl_perfc_op perfc_op; 2955084Sjohnlev struct xen_sysctl_getdomaininfolist getdomaininfolist; 2966144Srab struct xen_sysctl_debug_keys debug_keys; 2976144Srab struct xen_sysctl_getcpuinfo getcpuinfo; 298*10175SStuart.Maybee@Sun.COM struct xen_sysctl_availheap availheap; 299*10175SStuart.Maybee@Sun.COM struct xen_sysctl_get_pmstat get_pmstat; 300*10175SStuart.Maybee@Sun.COM struct xen_sysctl_cpu_hotplug cpu_hotplug; 3015084Sjohnlev uint8_t pad[128]; 3025084Sjohnlev } u; 3035084Sjohnlev }; 3045084Sjohnlev typedef struct xen_sysctl xen_sysctl_t; 3055084Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_sysctl_t); 3065084Sjohnlev 3075084Sjohnlev #endif /* __XEN_PUBLIC_SYSCTL_H__ */ 3085084Sjohnlev 3095084Sjohnlev /* 3105084Sjohnlev * Local variables: 3115084Sjohnlev * mode: C 3125084Sjohnlev * c-set-style: "BSD" 3135084Sjohnlev * c-basic-offset: 4 3145084Sjohnlev * tab-width: 4 3155084Sjohnlev * indent-tabs-mode: nil 3165084Sjohnlev * End: 3175084Sjohnlev */ 318