cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

platform.h (15390B)


      1/* SPDX-License-Identifier: MIT */
      2/******************************************************************************
      3 * platform.h
      4 *
      5 * Hardware platform operations. Intended for use by domain-0 kernel.
      6 *
      7 * Copyright (c) 2002-2006, K Fraser
      8 */
      9
     10#ifndef __XEN_PUBLIC_PLATFORM_H__
     11#define __XEN_PUBLIC_PLATFORM_H__
     12
     13#include <xen/interface/xen.h>
     14
     15#define XENPF_INTERFACE_VERSION 0x03000001
     16
     17/*
     18 * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC,
     19 * 1 January, 1970 if the current system time was <system_time>.
     20 */
     21#define XENPF_settime32             17
     22struct xenpf_settime32 {
     23	/* IN variables. */
     24	uint32_t secs;
     25	uint32_t nsecs;
     26	uint64_t system_time;
     27};
     28DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime32_t);
     29#define XENPF_settime64           62
     30struct xenpf_settime64 {
     31    /* IN variables. */
     32    uint64_t secs;
     33    uint32_t nsecs;
     34    uint32_t mbz;
     35    uint64_t system_time;
     36};
     37DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime64_t);
     38
     39/*
     40 * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type.
     41 * On x86, @type is an architecture-defined MTRR memory type.
     42 * On success, returns the MTRR that was used (@reg) and a handle that can
     43 * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting.
     44 * (x86-specific).
     45 */
     46#define XENPF_add_memtype         31
     47struct xenpf_add_memtype {
     48	/* IN variables. */
     49	xen_pfn_t mfn;
     50	uint64_t nr_mfns;
     51	uint32_t type;
     52	/* OUT variables. */
     53	uint32_t handle;
     54	uint32_t reg;
     55};
     56DEFINE_GUEST_HANDLE_STRUCT(xenpf_add_memtype_t);
     57
     58/*
     59 * Tear down an existing memory-range type. If @handle is remembered then it
     60 * should be passed in to accurately tear down the correct setting (in case
     61 * of overlapping memory regions with differing types). If it is not known
     62 * then @handle should be set to zero. In all cases @reg must be set.
     63 * (x86-specific).
     64 */
     65#define XENPF_del_memtype         32
     66struct xenpf_del_memtype {
     67	/* IN variables. */
     68	uint32_t handle;
     69	uint32_t reg;
     70};
     71DEFINE_GUEST_HANDLE_STRUCT(xenpf_del_memtype_t);
     72
     73/* Read current type of an MTRR (x86-specific). */
     74#define XENPF_read_memtype        33
     75struct xenpf_read_memtype {
     76	/* IN variables. */
     77	uint32_t reg;
     78	/* OUT variables. */
     79	xen_pfn_t mfn;
     80	uint64_t nr_mfns;
     81	uint32_t type;
     82};
     83DEFINE_GUEST_HANDLE_STRUCT(xenpf_read_memtype_t);
     84
     85#define XENPF_microcode_update    35
     86struct xenpf_microcode_update {
     87	/* IN variables. */
     88	GUEST_HANDLE(void) data;          /* Pointer to microcode data */
     89	uint32_t length;                  /* Length of microcode data. */
     90};
     91DEFINE_GUEST_HANDLE_STRUCT(xenpf_microcode_update_t);
     92
     93#define XENPF_platform_quirk      39
     94#define QUIRK_NOIRQBALANCING      1 /* Do not restrict IO-APIC RTE targets */
     95#define QUIRK_IOAPIC_BAD_REGSEL   2 /* IO-APIC REGSEL forgets its value    */
     96#define QUIRK_IOAPIC_GOOD_REGSEL  3 /* IO-APIC REGSEL behaves properly     */
     97struct xenpf_platform_quirk {
     98	/* IN variables. */
     99	uint32_t quirk_id;
    100};
    101DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t);
    102
    103#define XENPF_efi_runtime_call    49
    104#define XEN_EFI_get_time                      1
    105#define XEN_EFI_set_time                      2
    106#define XEN_EFI_get_wakeup_time               3
    107#define XEN_EFI_set_wakeup_time               4
    108#define XEN_EFI_get_next_high_monotonic_count 5
    109#define XEN_EFI_get_variable                  6
    110#define XEN_EFI_set_variable                  7
    111#define XEN_EFI_get_next_variable_name        8
    112#define XEN_EFI_query_variable_info           9
    113#define XEN_EFI_query_capsule_capabilities   10
    114#define XEN_EFI_update_capsule               11
    115
    116struct xenpf_efi_runtime_call {
    117	uint32_t function;
    118	/*
    119	 * This field is generally used for per sub-function flags (defined
    120	 * below), except for the XEN_EFI_get_next_high_monotonic_count case,
    121	 * where it holds the single returned value.
    122	 */
    123	uint32_t misc;
    124	xen_ulong_t status;
    125	union {
    126#define XEN_EFI_GET_TIME_SET_CLEARS_NS 0x00000001
    127		struct {
    128			struct xenpf_efi_time {
    129				uint16_t year;
    130				uint8_t month;
    131				uint8_t day;
    132				uint8_t hour;
    133				uint8_t min;
    134				uint8_t sec;
    135				uint32_t ns;
    136				int16_t tz;
    137				uint8_t daylight;
    138			} time;
    139			uint32_t resolution;
    140			uint32_t accuracy;
    141		} get_time;
    142
    143		struct xenpf_efi_time set_time;
    144
    145#define XEN_EFI_GET_WAKEUP_TIME_ENABLED 0x00000001
    146#define XEN_EFI_GET_WAKEUP_TIME_PENDING 0x00000002
    147		struct xenpf_efi_time get_wakeup_time;
    148
    149#define XEN_EFI_SET_WAKEUP_TIME_ENABLE      0x00000001
    150#define XEN_EFI_SET_WAKEUP_TIME_ENABLE_ONLY 0x00000002
    151		struct xenpf_efi_time set_wakeup_time;
    152
    153#define XEN_EFI_VARIABLE_NON_VOLATILE       0x00000001
    154#define XEN_EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
    155#define XEN_EFI_VARIABLE_RUNTIME_ACCESS     0x00000004
    156		struct {
    157			GUEST_HANDLE(void) name;  /* UCS-2/UTF-16 string */
    158			xen_ulong_t size;
    159			GUEST_HANDLE(void) data;
    160			struct xenpf_efi_guid {
    161				uint32_t data1;
    162				uint16_t data2;
    163				uint16_t data3;
    164				uint8_t data4[8];
    165			} vendor_guid;
    166		} get_variable, set_variable;
    167
    168		struct {
    169			xen_ulong_t size;
    170			GUEST_HANDLE(void) name;  /* UCS-2/UTF-16 string */
    171			struct xenpf_efi_guid vendor_guid;
    172		} get_next_variable_name;
    173
    174		struct {
    175			uint32_t attr;
    176			uint64_t max_store_size;
    177			uint64_t remain_store_size;
    178			uint64_t max_size;
    179		} query_variable_info;
    180
    181		struct {
    182			GUEST_HANDLE(void) capsule_header_array;
    183			xen_ulong_t capsule_count;
    184			uint64_t max_capsule_size;
    185			uint32_t reset_type;
    186		} query_capsule_capabilities;
    187
    188		struct {
    189			GUEST_HANDLE(void) capsule_header_array;
    190			xen_ulong_t capsule_count;
    191			uint64_t sg_list; /* machine address */
    192		} update_capsule;
    193	} u;
    194};
    195DEFINE_GUEST_HANDLE_STRUCT(xenpf_efi_runtime_call);
    196
    197#define  XEN_FW_EFI_VERSION        0
    198#define  XEN_FW_EFI_CONFIG_TABLE   1
    199#define  XEN_FW_EFI_VENDOR         2
    200#define  XEN_FW_EFI_MEM_INFO       3
    201#define  XEN_FW_EFI_RT_VERSION     4
    202
    203#define XENPF_firmware_info       50
    204#define XEN_FW_DISK_INFO          1 /* from int 13 AH=08/41/48 */
    205#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */
    206#define XEN_FW_VBEDDC_INFO        3 /* from int 10 AX=4f15 */
    207#define XEN_FW_EFI_INFO           4 /* from EFI */
    208#define XEN_FW_KBD_SHIFT_FLAGS    5 /* Int16, Fn02: Get keyboard shift flags. */
    209
    210struct xenpf_firmware_info {
    211	/* IN variables. */
    212	uint32_t type;
    213	uint32_t index;
    214	/* OUT variables. */
    215	union {
    216		struct {
    217			/* Int13, Fn48: Check Extensions Present. */
    218			uint8_t device;                   /* %dl: bios device number */
    219			uint8_t version;                  /* %ah: major version      */
    220			uint16_t interface_support;       /* %cx: support bitmap     */
    221			/* Int13, Fn08: Legacy Get Device Parameters. */
    222			uint16_t legacy_max_cylinder;     /* %cl[7:6]:%ch: max cyl # */
    223			uint8_t legacy_max_head;          /* %dh: max head #         */
    224			uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector #  */
    225			/* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */
    226			/* NB. First uint16_t of buffer must be set to buffer size.      */
    227			GUEST_HANDLE(void) edd_params;
    228		} disk_info; /* XEN_FW_DISK_INFO */
    229		struct {
    230			uint8_t device;                   /* bios device number  */
    231			uint32_t mbr_signature;           /* offset 0x1b8 in mbr */
    232		} disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */
    233		struct {
    234			/* Int10, AX=4F15: Get EDID info. */
    235			uint8_t capabilities;
    236			uint8_t edid_transfer_time;
    237			/* must refer to 128-byte buffer */
    238			GUEST_HANDLE(uchar) edid;
    239		} vbeddc_info; /* XEN_FW_VBEDDC_INFO */
    240
    241		union xenpf_efi_info {
    242			uint32_t version;
    243			struct {
    244				uint64_t addr;   /* EFI_CONFIGURATION_TABLE */
    245				uint32_t nent;
    246			} cfg;
    247			struct {
    248				uint32_t revision;
    249				uint32_t bufsz;  /* input, in bytes */
    250				GUEST_HANDLE(void) name;
    251				/* UCS-2/UTF-16 string */
    252			} vendor;
    253			struct {
    254				uint64_t addr;
    255				uint64_t size;
    256				uint64_t attr;
    257				uint32_t type;
    258			} mem;
    259		} efi_info; /* XEN_FW_EFI_INFO */
    260
    261		uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */
    262	} u;
    263};
    264DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t);
    265
    266#define XENPF_enter_acpi_sleep    51
    267struct xenpf_enter_acpi_sleep {
    268	/* IN variables */
    269	uint16_t val_a;             /* PM1a control / sleep type A. */
    270	uint16_t val_b;             /* PM1b control / sleep type B. */
    271	uint32_t sleep_state;       /* Which state to enter (Sn). */
    272#define XENPF_ACPI_SLEEP_EXTENDED 0x00000001
    273	uint32_t flags;             /* XENPF_ACPI_SLEEP_*. */
    274};
    275DEFINE_GUEST_HANDLE_STRUCT(xenpf_enter_acpi_sleep_t);
    276
    277#define XENPF_change_freq         52
    278struct xenpf_change_freq {
    279	/* IN variables */
    280	uint32_t flags; /* Must be zero. */
    281	uint32_t cpu;   /* Physical cpu. */
    282	uint64_t freq;  /* New frequency (Hz). */
    283};
    284DEFINE_GUEST_HANDLE_STRUCT(xenpf_change_freq_t);
    285
    286/*
    287 * Get idle times (nanoseconds since boot) for physical CPUs specified in the
    288 * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is
    289 * indexed by CPU number; only entries with the corresponding @cpumap_bitmap
    290 * bit set are written to. On return, @cpumap_bitmap is modified so that any
    291 * non-existent CPUs are cleared. Such CPUs have their @idletime array entry
    292 * cleared.
    293 */
    294#define XENPF_getidletime         53
    295struct xenpf_getidletime {
    296	/* IN/OUT variables */
    297	/* IN: CPUs to interrogate; OUT: subset of IN which are present */
    298	GUEST_HANDLE(uchar) cpumap_bitmap;
    299	/* IN variables */
    300	/* Size of cpumap bitmap. */
    301	uint32_t cpumap_nr_cpus;
    302	/* Must be indexable for every cpu in cpumap_bitmap. */
    303	GUEST_HANDLE(uint64_t) idletime;
    304	/* OUT variables */
    305	/* System time when the idletime snapshots were taken. */
    306	uint64_t now;
    307};
    308DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t);
    309
    310#define XENPF_set_processor_pminfo      54
    311
    312/* ability bits */
    313#define XEN_PROCESSOR_PM_CX	1
    314#define XEN_PROCESSOR_PM_PX	2
    315#define XEN_PROCESSOR_PM_TX	4
    316
    317/* cmd type */
    318#define XEN_PM_CX   0
    319#define XEN_PM_PX   1
    320#define XEN_PM_TX   2
    321#define XEN_PM_PDC  3
    322/* Px sub info type */
    323#define XEN_PX_PCT   1
    324#define XEN_PX_PSS   2
    325#define XEN_PX_PPC   4
    326#define XEN_PX_PSD   8
    327
    328struct xen_power_register {
    329	uint32_t     space_id;
    330	uint32_t     bit_width;
    331	uint32_t     bit_offset;
    332	uint32_t     access_size;
    333	uint64_t     address;
    334};
    335
    336struct xen_processor_csd {
    337	uint32_t    domain;      /* domain number of one dependent group */
    338	uint32_t    coord_type;  /* coordination type */
    339	uint32_t    num;         /* number of processors in same domain */
    340};
    341DEFINE_GUEST_HANDLE_STRUCT(xen_processor_csd);
    342
    343struct xen_processor_cx {
    344	struct xen_power_register  reg; /* GAS for Cx trigger register */
    345	uint8_t     type;     /* cstate value, c0: 0, c1: 1, ... */
    346	uint32_t    latency;  /* worst latency (ms) to enter/exit this cstate */
    347	uint32_t    power;    /* average power consumption(mW) */
    348	uint32_t    dpcnt;    /* number of dependency entries */
    349	GUEST_HANDLE(xen_processor_csd) dp; /* NULL if no dependency */
    350};
    351DEFINE_GUEST_HANDLE_STRUCT(xen_processor_cx);
    352
    353struct xen_processor_flags {
    354	uint32_t bm_control:1;
    355	uint32_t bm_check:1;
    356	uint32_t has_cst:1;
    357	uint32_t power_setup_done:1;
    358	uint32_t bm_rld_set:1;
    359};
    360
    361struct xen_processor_power {
    362	uint32_t count;  /* number of C state entries in array below */
    363	struct xen_processor_flags flags;  /* global flags of this processor */
    364	GUEST_HANDLE(xen_processor_cx) states; /* supported c states */
    365};
    366
    367struct xen_pct_register {
    368	uint8_t  descriptor;
    369	uint16_t length;
    370	uint8_t  space_id;
    371	uint8_t  bit_width;
    372	uint8_t  bit_offset;
    373	uint8_t  reserved;
    374	uint64_t address;
    375};
    376
    377struct xen_processor_px {
    378	uint64_t core_frequency; /* megahertz */
    379	uint64_t power;      /* milliWatts */
    380	uint64_t transition_latency; /* microseconds */
    381	uint64_t bus_master_latency; /* microseconds */
    382	uint64_t control;        /* control value */
    383	uint64_t status;     /* success indicator */
    384};
    385DEFINE_GUEST_HANDLE_STRUCT(xen_processor_px);
    386
    387struct xen_psd_package {
    388	uint64_t num_entries;
    389	uint64_t revision;
    390	uint64_t domain;
    391	uint64_t coord_type;
    392	uint64_t num_processors;
    393};
    394
    395struct xen_processor_performance {
    396	uint32_t flags;     /* flag for Px sub info type */
    397	uint32_t platform_limit;  /* Platform limitation on freq usage */
    398	struct xen_pct_register control_register;
    399	struct xen_pct_register status_register;
    400	uint32_t state_count;     /* total available performance states */
    401	GUEST_HANDLE(xen_processor_px) states;
    402	struct xen_psd_package domain_info;
    403	uint32_t shared_type;     /* coordination type of this processor */
    404};
    405DEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance);
    406
    407struct xenpf_set_processor_pminfo {
    408	/* IN variables */
    409	uint32_t id;    /* ACPI CPU ID */
    410	uint32_t type;  /* {XEN_PM_CX, XEN_PM_PX} */
    411	union {
    412		struct xen_processor_power          power;/* Cx: _CST/_CSD */
    413		struct xen_processor_performance    perf; /* Px: _PPC/_PCT/_PSS/_PSD */
    414		GUEST_HANDLE(uint32_t)              pdc;
    415	};
    416};
    417DEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo);
    418
    419#define XENPF_get_cpuinfo 55
    420struct xenpf_pcpuinfo {
    421	/* IN */
    422	uint32_t xen_cpuid;
    423	/* OUT */
    424	/* The maxium cpu_id that is present */
    425	uint32_t max_present;
    426#define XEN_PCPU_FLAGS_ONLINE   1
    427	/* Correponding xen_cpuid is not present*/
    428#define XEN_PCPU_FLAGS_INVALID  2
    429	uint32_t flags;
    430	uint32_t apic_id;
    431	uint32_t acpi_id;
    432};
    433DEFINE_GUEST_HANDLE_STRUCT(xenpf_pcpuinfo);
    434
    435#define XENPF_cpu_online	56
    436#define XENPF_cpu_offline	57
    437struct xenpf_cpu_ol {
    438	uint32_t cpuid;
    439};
    440DEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol);
    441
    442#define XENPF_cpu_hotadd	58
    443struct xenpf_cpu_hotadd {
    444	uint32_t apic_id;
    445	uint32_t acpi_id;
    446	uint32_t pxm;
    447};
    448
    449#define XENPF_mem_hotadd	59
    450struct xenpf_mem_hotadd {
    451	uint64_t spfn;
    452	uint64_t epfn;
    453	uint32_t pxm;
    454	uint32_t flags;
    455};
    456
    457#define XENPF_core_parking     60
    458struct xenpf_core_parking {
    459	/* IN variables */
    460#define XEN_CORE_PARKING_SET   1
    461#define XEN_CORE_PARKING_GET   2
    462	uint32_t type;
    463	/* IN variables:  set cpu nums expected to be idled */
    464	/* OUT variables: get cpu nums actually be idled */
    465	uint32_t idle_nums;
    466};
    467DEFINE_GUEST_HANDLE_STRUCT(xenpf_core_parking);
    468
    469#define XENPF_get_symbol      63
    470struct xenpf_symdata {
    471	/* IN/OUT variables */
    472	uint32_t	namelen; /* size of 'name' buffer */
    473
    474	/* IN/OUT variables */
    475	uint32_t	symnum; /* IN:  Symbol to read                       */
    476				/* OUT: Next available symbol. If same as IN */
    477				/* then  we reached the end                  */
    478
    479	/* OUT variables */
    480	GUEST_HANDLE(char) name;
    481	uint64_t	address;
    482	char            type;
    483};
    484DEFINE_GUEST_HANDLE_STRUCT(xenpf_symdata);
    485
    486struct xen_platform_op {
    487	uint32_t cmd;
    488	uint32_t interface_version; /* XENPF_INTERFACE_VERSION */
    489	union {
    490		struct xenpf_settime32         settime32;
    491		struct xenpf_settime64         settime64;
    492		struct xenpf_add_memtype       add_memtype;
    493		struct xenpf_del_memtype       del_memtype;
    494		struct xenpf_read_memtype      read_memtype;
    495		struct xenpf_microcode_update  microcode;
    496		struct xenpf_platform_quirk    platform_quirk;
    497		struct xenpf_efi_runtime_call  efi_runtime_call;
    498		struct xenpf_firmware_info     firmware_info;
    499		struct xenpf_enter_acpi_sleep  enter_acpi_sleep;
    500		struct xenpf_change_freq       change_freq;
    501		struct xenpf_getidletime       getidletime;
    502		struct xenpf_set_processor_pminfo set_pminfo;
    503		struct xenpf_pcpuinfo          pcpu_info;
    504		struct xenpf_cpu_ol            cpu_ol;
    505		struct xenpf_cpu_hotadd        cpu_add;
    506		struct xenpf_mem_hotadd        mem_add;
    507		struct xenpf_core_parking      core_parking;
    508		struct xenpf_symdata           symdata;
    509		uint8_t                        pad[128];
    510	} u;
    511};
    512DEFINE_GUEST_HANDLE_STRUCT(xen_platform_op_t);
    513
    514#endif /* __XEN_PUBLIC_PLATFORM_H__ */