include/standard-headers/drm/drm_fourcc.h | 28 +- include/standard-headers/linux/const.h | 18 + include/standard-headers/linux/ethtool.h | 28 +- .../linux/input-event-codes.h | 13 + include/standard-headers/linux/pci_regs.h | 71 ++- include/standard-headers/linux/typelimits.h | 8 + include/standard-headers/linux/virtio_ring.h | 5 +- include/standard-headers/linux/virtio_rtc.h | 237 ++++++++++ include/standard-headers/linux/vmclock-abi.h | 20 + linux-headers/asm-arm64/kvm.h | 1 + linux-headers/asm-arm64/unistd_64.h | 1 + linux-headers/asm-generic/unistd.h | 5 +- linux-headers/asm-loongarch/kvm.h | 5 + linux-headers/asm-loongarch/kvm_para.h | 1 + linux-headers/asm-loongarch/unistd_64.h | 2 + linux-headers/asm-mips/unistd_n32.h | 1 + linux-headers/asm-mips/unistd_n64.h | 1 + linux-headers/asm-mips/unistd_o32.h | 1 + linux-headers/asm-powerpc/unistd_32.h | 1 + linux-headers/asm-powerpc/unistd_64.h | 1 + linux-headers/asm-riscv/kvm.h | 11 +- linux-headers/asm-riscv/ptrace.h | 37 ++ linux-headers/asm-riscv/unistd_32.h | 1 + linux-headers/asm-riscv/unistd_64.h | 1 + linux-headers/asm-s390/unistd_32.h | 446 ------------------ linux-headers/asm-s390/unistd_64.h | 1 + linux-headers/asm-x86/kvm.h | 21 +- linux-headers/asm-x86/unistd_32.h | 1 + linux-headers/asm-x86/unistd_64.h | 1 + linux-headers/asm-x86/unistd_x32.h | 1 + linux-headers/linux/const.h | 18 + linux-headers/linux/iommufd.h | 48 ++ linux-headers/linux/kvm.h | 46 +- linux-headers/linux/mshv.h | 4 +- linux-headers/linux/psp-sev.h | 2 +- linux-headers/linux/stddef.h | 4 + linux-headers/linux/vduse.h | 85 +++- linux-headers/linux/vfio.h | 30 +- 38 files changed, 713 insertions(+), 493 deletions(-) create mode 100644 include/standard-headers/linux/typelimits.h create mode 100644 include/standard-headers/linux/virtio_rtc.h delete mode 100644 linux-headers/asm-s390/unistd_32.h
Update headers to retrieve new IOMMUFD capabilities (ATS not-supported),
VFIO migration flags (VFIO_PRECOPY_INFO_REINIT flag and
VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2), KVM caps for LoongArch and
more.
Cc: Avihai Horon <avihaih@nvidia.com>
Cc: Song Gao <gaosong@loongson.cn>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Cornelia Huck <cohuck@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
---
include/standard-headers/drm/drm_fourcc.h | 28 +-
include/standard-headers/linux/const.h | 18 +
include/standard-headers/linux/ethtool.h | 28 +-
.../linux/input-event-codes.h | 13 +
include/standard-headers/linux/pci_regs.h | 71 ++-
include/standard-headers/linux/typelimits.h | 8 +
include/standard-headers/linux/virtio_ring.h | 5 +-
include/standard-headers/linux/virtio_rtc.h | 237 ++++++++++
include/standard-headers/linux/vmclock-abi.h | 20 +
linux-headers/asm-arm64/kvm.h | 1 +
linux-headers/asm-arm64/unistd_64.h | 1 +
linux-headers/asm-generic/unistd.h | 5 +-
linux-headers/asm-loongarch/kvm.h | 5 +
linux-headers/asm-loongarch/kvm_para.h | 1 +
linux-headers/asm-loongarch/unistd_64.h | 2 +
linux-headers/asm-mips/unistd_n32.h | 1 +
linux-headers/asm-mips/unistd_n64.h | 1 +
linux-headers/asm-mips/unistd_o32.h | 1 +
linux-headers/asm-powerpc/unistd_32.h | 1 +
linux-headers/asm-powerpc/unistd_64.h | 1 +
linux-headers/asm-riscv/kvm.h | 11 +-
linux-headers/asm-riscv/ptrace.h | 37 ++
linux-headers/asm-riscv/unistd_32.h | 1 +
linux-headers/asm-riscv/unistd_64.h | 1 +
linux-headers/asm-s390/unistd_32.h | 446 ------------------
linux-headers/asm-s390/unistd_64.h | 1 +
linux-headers/asm-x86/kvm.h | 21 +-
linux-headers/asm-x86/unistd_32.h | 1 +
linux-headers/asm-x86/unistd_64.h | 1 +
linux-headers/asm-x86/unistd_x32.h | 1 +
linux-headers/linux/const.h | 18 +
linux-headers/linux/iommufd.h | 48 ++
linux-headers/linux/kvm.h | 46 +-
linux-headers/linux/mshv.h | 4 +-
linux-headers/linux/psp-sev.h | 2 +-
linux-headers/linux/stddef.h | 4 +
linux-headers/linux/vduse.h | 85 +++-
linux-headers/linux/vfio.h | 30 +-
38 files changed, 713 insertions(+), 493 deletions(-)
create mode 100644 include/standard-headers/linux/typelimits.h
create mode 100644 include/standard-headers/linux/virtio_rtc.h
delete mode 100644 linux-headers/asm-s390/unistd_32.h
diff --git a/include/standard-headers/drm/drm_fourcc.h b/include/standard-headers/drm/drm_fourcc.h
index b39e197cc79f687966e40b78a955d3d0834efcc4..4bad457cc2d151e7cba8233d0a52ae43ef8333da 100644
--- a/include/standard-headers/drm/drm_fourcc.h
+++ b/include/standard-headers/drm/drm_fourcc.h
@@ -400,8 +400,8 @@ extern "C" {
* implementation can multiply the values by 2^6=64. For that reason the padding
* must only contain zeros.
* index 0 = Y plane, [15:0] z:Y [6:10] little endian
- * index 1 = Cr plane, [15:0] z:Cr [6:10] little endian
- * index 2 = Cb plane, [15:0] z:Cb [6:10] little endian
+ * index 1 = Cb plane, [15:0] z:Cb [6:10] little endian
+ * index 2 = Cr plane, [15:0] z:Cr [6:10] little endian
*/
#define DRM_FORMAT_S010 fourcc_code('S', '0', '1', '0') /* 2x2 subsampled Cb (1) and Cr (2) planes 10 bits per channel */
#define DRM_FORMAT_S210 fourcc_code('S', '2', '1', '0') /* 2x1 subsampled Cb (1) and Cr (2) planes 10 bits per channel */
@@ -413,8 +413,8 @@ extern "C" {
* implementation can multiply the values by 2^4=16. For that reason the padding
* must only contain zeros.
* index 0 = Y plane, [15:0] z:Y [4:12] little endian
- * index 1 = Cr plane, [15:0] z:Cr [4:12] little endian
- * index 2 = Cb plane, [15:0] z:Cb [4:12] little endian
+ * index 1 = Cb plane, [15:0] z:Cb [4:12] little endian
+ * index 2 = Cr plane, [15:0] z:Cr [4:12] little endian
*/
#define DRM_FORMAT_S012 fourcc_code('S', '0', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes 12 bits per channel */
#define DRM_FORMAT_S212 fourcc_code('S', '2', '1', '2') /* 2x1 subsampled Cb (1) and Cr (2) planes 12 bits per channel */
@@ -423,8 +423,8 @@ extern "C" {
/*
* 3 plane YCbCr
* index 0 = Y plane, [15:0] Y little endian
- * index 1 = Cr plane, [15:0] Cr little endian
- * index 2 = Cb plane, [15:0] Cb little endian
+ * index 1 = Cb plane, [15:0] Cb little endian
+ * index 2 = Cr plane, [15:0] Cr little endian
*/
#define DRM_FORMAT_S016 fourcc_code('S', '0', '1', '6') /* 2x2 subsampled Cb (1) and Cr (2) planes 16 bits per channel */
#define DRM_FORMAT_S216 fourcc_code('S', '2', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes 16 bits per channel */
@@ -1421,6 +1421,22 @@ drm_fourcc_canonicalize_nvidia_format_mod(uint64_t modifier)
#define DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED \
DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 1ULL)
+/*
+ * ARM 64k interleaved modifier
+ *
+ * This is used by ARM Mali v10+ GPUs. With this modifier, the plane is divided
+ * into 64k byte 1:1 or 2:1 -sided tiles. The 64k tiles are laid out linearly.
+ * Each 64k tile is divided into blocks of 16x16 texel blocks, which are
+ * themselves laid out linearly within a 64k tile. Then within each 16x16
+ * block, texel blocks are laid out according to U order, similar to
+ * 16X16_BLOCK_U_INTERLEAVED.
+ *
+ * Note that unlike 16X16_BLOCK_U_INTERLEAVED, the layout does not change
+ * depending on whether a format is compressed or not.
+ */
+#define DRM_FORMAT_MOD_ARM_INTERLEAVED_64K \
+ DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 2ULL)
+
/*
* Allwinner tiled modifier
*
diff --git a/include/standard-headers/linux/const.h b/include/standard-headers/linux/const.h
index 95ede2334204048d49b228284e9fbc1561337a16..c6a9d0c9835cae62a97209ca393ee2b8e930469f 100644
--- a/include/standard-headers/linux/const.h
+++ b/include/standard-headers/linux/const.h
@@ -50,4 +50,22 @@
#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
+/*
+ * Divide positive or negative dividend by positive or negative divisor
+ * and round to closest integer. Result is undefined for negative
+ * divisors if the dividend variable type is unsigned and for negative
+ * dividends if the divisor variable type is unsigned.
+ */
+#define __KERNEL_DIV_ROUND_CLOSEST(x, divisor) \
+({ \
+ __typeof__(x) __x = x; \
+ __typeof__(divisor) __d = divisor; \
+ \
+ (((__typeof__(x))-1) > 0 || \
+ ((__typeof__(divisor))-1) > 0 || \
+ (((__x) > 0) == ((__d) > 0))) ? \
+ (((__x) + ((__d) / 2)) / (__d)) : \
+ (((__x) - ((__d) / 2)) / (__d)); \
+})
+
#endif /* _LINUX_CONST_H */
diff --git a/include/standard-headers/linux/ethtool.h b/include/standard-headers/linux/ethtool.h
index d0f7a63f1099c2e53d92a3ed608f495f3b64b5ff..5d82126cd7e8fb5ebd03a56224e80d8ed7c0bc83 100644
--- a/include/standard-headers/linux/ethtool.h
+++ b/include/standard-headers/linux/ethtool.h
@@ -17,11 +17,10 @@
#include "net/eth.h"
#include "standard-headers/linux/const.h"
+#include "standard-headers/linux/typelimits.h"
#include "standard-headers/linux/types.h"
#include "standard-headers/linux/if_ether.h"
-#include <limits.h> /* for INT_MAX */
-
/* All structures exposed to userland should be defined such that they
* have the same layout for 32-bit and 64-bit userland.
*/
@@ -228,7 +227,7 @@ enum tunable_id {
ETHTOOL_ID_UNSPEC,
ETHTOOL_RX_COPYBREAK,
ETHTOOL_TX_COPYBREAK,
- ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */
+ ETHTOOL_PFC_PREVENTION_TOUT, /* both pause and pfc, see man ethtool */
ETHTOOL_TX_COPYBREAK_BUF_SIZE,
/*
* Add your fresh new tunable attribute above and remember to update
@@ -603,6 +602,8 @@ enum ethtool_link_ext_state {
ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED,
ETHTOOL_LINK_EXT_STATE_OVERHEAT,
ETHTOOL_LINK_EXT_STATE_MODULE,
+ ETHTOOL_LINK_EXT_STATE_OTP_SPEED_VIOLATION,
+ ETHTOOL_LINK_EXT_STATE_BMC_REQUEST_DOWN,
};
/* More information in addition to ETHTOOL_LINK_EXT_STATE_AUTONEG. */
@@ -1094,13 +1095,20 @@ enum ethtool_module_fw_flash_status {
* struct ethtool_gstrings - string set for data tagging
* @cmd: Command number = %ETHTOOL_GSTRINGS
* @string_set: String set ID; one of &enum ethtool_stringset
- * @len: On return, the number of strings in the string set
+ * @len: Number of strings in the string set
* @data: Buffer for strings. Each string is null-padded to a size of
* %ETH_GSTRING_LEN.
*
* Users must use %ETHTOOL_GSSET_INFO to find the number of strings in
* the string set. They must allocate a buffer of the appropriate
* size immediately following this structure.
+ *
+ * Setting @len on input is optional (though preferred), but must be zeroed
+ * otherwise.
+ * When set, @len will return the requested count if it matches the actual
+ * count; otherwise, it will be zero.
+ * This prevents issues when the number of strings is different than the
+ * userspace allocation.
*/
struct ethtool_gstrings {
uint32_t cmd;
@@ -1177,13 +1185,20 @@ struct ethtool_test {
/**
* struct ethtool_stats - device-specific statistics
* @cmd: Command number = %ETHTOOL_GSTATS
- * @n_stats: On return, the number of statistics
+ * @n_stats: Number of statistics
* @data: Array of statistics
*
* Users must use %ETHTOOL_GSSET_INFO or %ETHTOOL_GDRVINFO to find the
* number of statistics that will be returned. They must allocate a
* buffer of the appropriate size (8 * number of statistics)
* immediately following this structure.
+ *
+ * Setting @n_stats on input is optional (though preferred), but must be zeroed
+ * otherwise.
+ * When set, @n_stats will return the requested count if it matches the actual
+ * count; otherwise, it will be zero.
+ * This prevents issues when the number of stats is different than the
+ * userspace allocation.
*/
struct ethtool_stats {
uint32_t cmd;
@@ -2190,6 +2205,7 @@ enum ethtool_link_mode_bit_indices {
#define SPEED_40000 40000
#define SPEED_50000 50000
#define SPEED_56000 56000
+#define SPEED_80000 80000
#define SPEED_100000 100000
#define SPEED_200000 200000
#define SPEED_400000 400000
@@ -2200,7 +2216,7 @@ enum ethtool_link_mode_bit_indices {
static inline int ethtool_validate_speed(uint32_t speed)
{
- return speed <= INT_MAX || speed == (uint32_t)SPEED_UNKNOWN;
+ return speed <= __KERNEL_INT_MAX || speed == (uint32_t)SPEED_UNKNOWN;
}
/* Duplex, half or full. */
diff --git a/include/standard-headers/linux/input-event-codes.h b/include/standard-headers/linux/input-event-codes.h
index ede79c6ae4f538bf18e80eedd7bab56dc1959115..dd7c986106e3749881ae43cb43143a590b6039fc 100644
--- a/include/standard-headers/linux/input-event-codes.h
+++ b/include/standard-headers/linux/input-event-codes.h
@@ -643,6 +643,10 @@
#define KEY_EPRIVACY_SCREEN_ON 0x252
#define KEY_EPRIVACY_SCREEN_OFF 0x253
+#define KEY_ACTION_ON_SELECTION 0x254 /* AL Action on Selection (HUTRR119) */
+#define KEY_CONTEXTUAL_INSERT 0x255 /* AL Contextual Insertion (HUTRR119) */
+#define KEY_CONTEXTUAL_QUERY 0x256 /* AL Contextual Query (HUTRR119) */
+
#define KEY_KBDINPUTASSIST_PREV 0x260
#define KEY_KBDINPUTASSIST_NEXT 0x261
#define KEY_KBDINPUTASSIST_PREVGROUP 0x262
@@ -891,6 +895,7 @@
#define ABS_VOLUME 0x20
#define ABS_PROFILE 0x21
+#define ABS_SND_PROFILE 0x22
#define ABS_MISC 0x28
@@ -1000,4 +1005,12 @@
#define SND_MAX 0x07
#define SND_CNT (SND_MAX+1)
+/*
+ * ABS_SND_PROFILE values
+ */
+
+#define SND_PROFILE_SILENT 0x00
+#define SND_PROFILE_VIBRATE 0x01
+#define SND_PROFILE_RING 0x02
+
#endif
diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h
index 3add74ae259483bab76e7552cb28bd9c9ef0b30c..14f634ab9350d5442192162225b5e5202dbe2308 100644
--- a/include/standard-headers/linux/pci_regs.h
+++ b/include/standard-headers/linux/pci_regs.h
@@ -132,6 +132,11 @@
#define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */
#define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */
#define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */
+/* Masks for dword-sized processing of Bus Number and Sec Latency Timer fields */
+#define PCI_PRIMARY_BUS_MASK 0x000000ff
+#define PCI_SECONDARY_BUS_MASK 0x0000ff00
+#define PCI_SUBORDINATE_BUS_MASK 0x00ff0000
+#define PCI_SEC_LATENCY_TIMER_MASK 0xff000000
#define PCI_IO_BASE 0x1c /* I/O range behind the bridge */
#define PCI_IO_LIMIT 0x1d
#define PCI_IO_RANGE_TYPE_MASK 0x0fUL /* I/O bridging type */
@@ -707,7 +712,7 @@
#define PCI_EXP_LNKCTL2_HASD 0x0020 /* HW Autonomous Speed Disable */
#define PCI_EXP_LNKSTA2 0x32 /* Link Status 2 */
#define PCI_EXP_LNKSTA2_FLIT 0x0400 /* Flit Mode Status */
-#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 0x32 /* end of v2 EPs w/ link */
+#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 0x34 /* end of v2 EPs w/ link */
#define PCI_EXP_SLTCAP2 0x34 /* Slot Capabilities 2 */
#define PCI_EXP_SLTCAP2_IBPD 0x00000001 /* In-band PD Disable Supported */
#define PCI_EXP_SLTCTL2 0x38 /* Slot Control 2 */
@@ -1253,11 +1258,6 @@
#define PCI_DEV3_STA 0x0c /* Device 3 Status Register */
#define PCI_DEV3_STA_SEGMENT 0x8 /* Segment Captured (end-to-end flit-mode detected) */
-/* Compute Express Link (CXL r3.1, sec 8.1.5) */
-#define PCI_DVSEC_CXL_PORT 3
-#define PCI_DVSEC_CXL_PORT_CTL 0x0c
-#define PCI_DVSEC_CXL_PORT_CTL_UNMASK_SBR 0x00000001
-
/* Integrity and Data Encryption Extended Capability */
#define PCI_IDE_CAP 0x04
#define PCI_IDE_CAP_LINK 0x1 /* Link IDE Stream Supported */
@@ -1338,4 +1338,63 @@
#define PCI_IDE_SEL_ADDR_3(x) (28 + (x) * PCI_IDE_SEL_ADDR_BLOCK_SIZE)
#define PCI_IDE_SEL_BLOCK_SIZE(nr_assoc) (20 + PCI_IDE_SEL_ADDR_BLOCK_SIZE * (nr_assoc))
+/*
+ * Compute Express Link (CXL r4.0, sec 8.1)
+ *
+ * Note that CXL DVSEC id 3 and 7 to be ignored when the CXL link state
+ * is "disconnected" (CXL r4.0, sec 9.12.3). Re-enumerate these
+ * registers on downstream link-up events.
+ */
+
+/* CXL r4.0, 8.1.3: PCIe DVSEC for CXL Device */
+#define PCI_DVSEC_CXL_DEVICE 0
+#define PCI_DVSEC_CXL_CAP 0xA
+#define PCI_DVSEC_CXL_MEM_CAPABLE _BITUL(2)
+#define PCI_DVSEC_CXL_HDM_COUNT __GENMASK(5, 4)
+#define PCI_DVSEC_CXL_CTRL 0xC
+#define PCI_DVSEC_CXL_MEM_ENABLE _BITUL(2)
+#define PCI_DVSEC_CXL_RANGE_SIZE_HIGH(i) (0x18 + (i * 0x10))
+#define PCI_DVSEC_CXL_RANGE_SIZE_LOW(i) (0x1C + (i * 0x10))
+#define PCI_DVSEC_CXL_MEM_INFO_VALID _BITUL(0)
+#define PCI_DVSEC_CXL_MEM_ACTIVE _BITUL(1)
+#define PCI_DVSEC_CXL_MEM_SIZE_LOW __GENMASK(31, 28)
+#define PCI_DVSEC_CXL_RANGE_BASE_HIGH(i) (0x20 + (i * 0x10))
+#define PCI_DVSEC_CXL_RANGE_BASE_LOW(i) (0x24 + (i * 0x10))
+#define PCI_DVSEC_CXL_MEM_BASE_LOW __GENMASK(31, 28)
+
+#define CXL_DVSEC_RANGE_MAX 2
+
+/* CXL r4.0, 8.1.4: Non-CXL Function Map DVSEC */
+#define PCI_DVSEC_CXL_FUNCTION_MAP 2
+
+/* CXL r4.0, 8.1.5: Extensions DVSEC for Ports */
+#define PCI_DVSEC_CXL_PORT 3
+#define PCI_DVSEC_CXL_PORT_CTL 0x0c
+#define PCI_DVSEC_CXL_PORT_CTL_UNMASK_SBR 0x00000001
+
+/* CXL r4.0, 8.1.6: GPF DVSEC for CXL Port */
+#define PCI_DVSEC_CXL_PORT_GPF 4
+#define PCI_DVSEC_CXL_PORT_GPF_PHASE_1_CONTROL 0x0C
+#define PCI_DVSEC_CXL_PORT_GPF_PHASE_1_TMO_BASE __GENMASK(3, 0)
+#define PCI_DVSEC_CXL_PORT_GPF_PHASE_1_TMO_SCALE __GENMASK(11, 8)
+#define PCI_DVSEC_CXL_PORT_GPF_PHASE_2_CONTROL 0xE
+#define PCI_DVSEC_CXL_PORT_GPF_PHASE_2_TMO_BASE __GENMASK(3, 0)
+#define PCI_DVSEC_CXL_PORT_GPF_PHASE_2_TMO_SCALE __GENMASK(11, 8)
+
+/* CXL r4.0, 8.1.7: GPF DVSEC for CXL Device */
+#define PCI_DVSEC_CXL_DEVICE_GPF 5
+
+/* CXL r4.0, 8.1.8: Flex Bus DVSEC */
+#define PCI_DVSEC_CXL_FLEXBUS_PORT 7
+#define PCI_DVSEC_CXL_FLEXBUS_PORT_STATUS 0xE
+#define PCI_DVSEC_CXL_FLEXBUS_PORT_STATUS_CACHE _BITUL(0)
+#define PCI_DVSEC_CXL_FLEXBUS_PORT_STATUS_MEM _BITUL(2)
+
+/* CXL r4.0, 8.1.9: Register Locator DVSEC */
+#define PCI_DVSEC_CXL_REG_LOCATOR 8
+#define PCI_DVSEC_CXL_REG_LOCATOR_BLOCK1 0xC
+#define PCI_DVSEC_CXL_REG_LOCATOR_BIR __GENMASK(2, 0)
+#define PCI_DVSEC_CXL_REG_LOCATOR_BLOCK_ID __GENMASK(15, 8)
+#define PCI_DVSEC_CXL_REG_LOCATOR_BLOCK_OFF_LOW __GENMASK(31, 16)
+
#endif /* LINUX_PCI_REGS_H */
diff --git a/include/standard-headers/linux/typelimits.h b/include/standard-headers/linux/typelimits.h
new file mode 100644
index 0000000000000000000000000000000000000000..130452008212423c5bb011300799ff5bd9ca8237
--- /dev/null
+++ b/include/standard-headers/linux/typelimits.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+#ifndef _LINUX_TYPELIMITS_H
+#define _LINUX_TYPELIMITS_H
+
+#define __KERNEL_INT_MAX ((int)(~0U >> 1))
+#define __KERNEL_INT_MIN (-__KERNEL_INT_MAX - 1)
+
+#endif /* _LINUX_TYPELIMITS_H */
diff --git a/include/standard-headers/linux/virtio_ring.h b/include/standard-headers/linux/virtio_ring.h
index 22f6eb8ca710d3f35060e26df99dd4beb6fb95f1..a0f73a1c7ba00b187a43dd9f38b493531e9ac5cd 100644
--- a/include/standard-headers/linux/virtio_ring.h
+++ b/include/standard-headers/linux/virtio_ring.h
@@ -1,5 +1,7 @@
#ifndef _LINUX_VIRTIO_RING_H
#define _LINUX_VIRTIO_RING_H
+
+#define VIRTIO_RING_NO_LEGACY
/* An interface for efficient virtio implementation, currently for use by KVM,
* but hopefully others soon. Do NOT change this since it will
* break existing servers and clients.
@@ -31,7 +33,6 @@
* SUCH DAMAGE.
*
* Copyright Rusty Russell IBM Corporation 2007. */
-#include <stdint.h>
#include "standard-headers/linux/types.h"
#include "standard-headers/linux/virtio_types.h"
@@ -200,7 +201,7 @@ static inline void vring_init(struct vring *vr, unsigned int num, void *p,
vr->num = num;
vr->desc = p;
vr->avail = (struct vring_avail *)((char *)p + num * sizeof(struct vring_desc));
- vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] + sizeof(__virtio16)
+ vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(__virtio16)
+ align-1) & ~(align - 1));
}
diff --git a/include/standard-headers/linux/virtio_rtc.h b/include/standard-headers/linux/virtio_rtc.h
new file mode 100644
index 0000000000000000000000000000000000000000..7e2c21ebff58e6c821320f0999a9f351d0d2ae36
--- /dev/null
+++ b/include/standard-headers/linux/virtio_rtc.h
@@ -0,0 +1,237 @@
+/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */
+/*
+ * Copyright (C) 2022-2024 OpenSynergy GmbH
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#ifndef _LINUX_VIRTIO_RTC_H
+#define _LINUX_VIRTIO_RTC_H
+
+#include "standard-headers/linux/types.h"
+
+/* alarm feature */
+#define VIRTIO_RTC_F_ALARM 0
+
+/* read request message types */
+
+#define VIRTIO_RTC_REQ_READ 0x0001
+#define VIRTIO_RTC_REQ_READ_CROSS 0x0002
+
+/* control request message types */
+
+#define VIRTIO_RTC_REQ_CFG 0x1000
+#define VIRTIO_RTC_REQ_CLOCK_CAP 0x1001
+#define VIRTIO_RTC_REQ_CROSS_CAP 0x1002
+#define VIRTIO_RTC_REQ_READ_ALARM 0x1003
+#define VIRTIO_RTC_REQ_SET_ALARM 0x1004
+#define VIRTIO_RTC_REQ_SET_ALARM_ENABLED 0x1005
+
+/* alarmq message types */
+
+#define VIRTIO_RTC_NOTIF_ALARM 0x2000
+
+/* Message headers */
+
+/** common request header */
+struct virtio_rtc_req_head {
+ uint16_t msg_type;
+ uint8_t reserved[6];
+};
+
+/** common response header */
+struct virtio_rtc_resp_head {
+#define VIRTIO_RTC_S_OK 0
+#define VIRTIO_RTC_S_EOPNOTSUPP 2
+#define VIRTIO_RTC_S_ENODEV 3
+#define VIRTIO_RTC_S_EINVAL 4
+#define VIRTIO_RTC_S_EIO 5
+ uint8_t status;
+ uint8_t reserved[7];
+};
+
+/** common notification header */
+struct virtio_rtc_notif_head {
+ uint16_t msg_type;
+ uint8_t reserved[6];
+};
+
+/* read requests */
+
+/* VIRTIO_RTC_REQ_READ message */
+
+struct virtio_rtc_req_read {
+ struct virtio_rtc_req_head head;
+ uint16_t clock_id;
+ uint8_t reserved[6];
+};
+
+struct virtio_rtc_resp_read {
+ struct virtio_rtc_resp_head head;
+ uint64_t clock_reading;
+};
+
+/* VIRTIO_RTC_REQ_READ_CROSS message */
+
+struct virtio_rtc_req_read_cross {
+ struct virtio_rtc_req_head head;
+ uint16_t clock_id;
+/* Arm Generic Timer Counter-timer Virtual Count Register (CNTVCT_EL0) */
+#define VIRTIO_RTC_COUNTER_ARM_VCT 0
+/* x86 Time-Stamp Counter */
+#define VIRTIO_RTC_COUNTER_X86_TSC 1
+/* Invalid */
+#define VIRTIO_RTC_COUNTER_INVALID 0xFF
+ uint8_t hw_counter;
+ uint8_t reserved[5];
+};
+
+struct virtio_rtc_resp_read_cross {
+ struct virtio_rtc_resp_head head;
+ uint64_t clock_reading;
+ uint64_t counter_cycles;
+};
+
+/* control requests */
+
+/* VIRTIO_RTC_REQ_CFG message */
+
+struct virtio_rtc_req_cfg {
+ struct virtio_rtc_req_head head;
+ /* no request params */
+};
+
+struct virtio_rtc_resp_cfg {
+ struct virtio_rtc_resp_head head;
+ /** # of clocks -> clock ids < num_clocks are valid */
+ uint16_t num_clocks;
+ uint8_t reserved[6];
+};
+
+/* VIRTIO_RTC_REQ_CLOCK_CAP message */
+
+struct virtio_rtc_req_clock_cap {
+ struct virtio_rtc_req_head head;
+ uint16_t clock_id;
+ uint8_t reserved[6];
+};
+
+struct virtio_rtc_resp_clock_cap {
+ struct virtio_rtc_resp_head head;
+#define VIRTIO_RTC_CLOCK_UTC 0
+#define VIRTIO_RTC_CLOCK_TAI 1
+#define VIRTIO_RTC_CLOCK_MONOTONIC 2
+#define VIRTIO_RTC_CLOCK_UTC_SMEARED 3
+#define VIRTIO_RTC_CLOCK_UTC_MAYBE_SMEARED 4
+ uint8_t type;
+#define VIRTIO_RTC_SMEAR_UNSPECIFIED 0
+#define VIRTIO_RTC_SMEAR_NOON_LINEAR 1
+#define VIRTIO_RTC_SMEAR_UTC_SLS 2
+ uint8_t leap_second_smearing;
+#define VIRTIO_RTC_FLAG_ALARM_CAP (1 << 0)
+ uint8_t flags;
+ uint8_t reserved[5];
+};
+
+/* VIRTIO_RTC_REQ_CROSS_CAP message */
+
+struct virtio_rtc_req_cross_cap {
+ struct virtio_rtc_req_head head;
+ uint16_t clock_id;
+ uint8_t hw_counter;
+ uint8_t reserved[5];
+};
+
+struct virtio_rtc_resp_cross_cap {
+ struct virtio_rtc_resp_head head;
+#define VIRTIO_RTC_FLAG_CROSS_CAP (1 << 0)
+ uint8_t flags;
+ uint8_t reserved[7];
+};
+
+/* VIRTIO_RTC_REQ_READ_ALARM message */
+
+struct virtio_rtc_req_read_alarm {
+ struct virtio_rtc_req_head head;
+ uint16_t clock_id;
+ uint8_t reserved[6];
+};
+
+struct virtio_rtc_resp_read_alarm {
+ struct virtio_rtc_resp_head head;
+ uint64_t alarm_time;
+#define VIRTIO_RTC_FLAG_ALARM_ENABLED (1 << 0)
+ uint8_t flags;
+ uint8_t reserved[7];
+};
+
+/* VIRTIO_RTC_REQ_SET_ALARM message */
+
+struct virtio_rtc_req_set_alarm {
+ struct virtio_rtc_req_head head;
+ uint64_t alarm_time;
+ uint16_t clock_id;
+ /* flag VIRTIO_RTC_FLAG_ALARM_ENABLED */
+ uint8_t flags;
+ uint8_t reserved[5];
+};
+
+struct virtio_rtc_resp_set_alarm {
+ struct virtio_rtc_resp_head head;
+ /* no response params */
+};
+
+/* VIRTIO_RTC_REQ_SET_ALARM_ENABLED message */
+
+struct virtio_rtc_req_set_alarm_enabled {
+ struct virtio_rtc_req_head head;
+ uint16_t clock_id;
+ /* flag VIRTIO_RTC_ALARM_ENABLED */
+ uint8_t flags;
+ uint8_t reserved[5];
+};
+
+struct virtio_rtc_resp_set_alarm_enabled {
+ struct virtio_rtc_resp_head head;
+ /* no response params */
+};
+
+/** Union of request types for requestq */
+union virtio_rtc_req_requestq {
+ struct virtio_rtc_req_read read;
+ struct virtio_rtc_req_read_cross read_cross;
+ struct virtio_rtc_req_cfg cfg;
+ struct virtio_rtc_req_clock_cap clock_cap;
+ struct virtio_rtc_req_cross_cap cross_cap;
+ struct virtio_rtc_req_read_alarm read_alarm;
+ struct virtio_rtc_req_set_alarm set_alarm;
+ struct virtio_rtc_req_set_alarm_enabled set_alarm_enabled;
+};
+
+/** Union of response types for requestq */
+union virtio_rtc_resp_requestq {
+ struct virtio_rtc_resp_read read;
+ struct virtio_rtc_resp_read_cross read_cross;
+ struct virtio_rtc_resp_cfg cfg;
+ struct virtio_rtc_resp_clock_cap clock_cap;
+ struct virtio_rtc_resp_cross_cap cross_cap;
+ struct virtio_rtc_resp_read_alarm read_alarm;
+ struct virtio_rtc_resp_set_alarm set_alarm;
+ struct virtio_rtc_resp_set_alarm_enabled set_alarm_enabled;
+};
+
+/* alarmq notifications */
+
+/* VIRTIO_RTC_NOTIF_ALARM notification */
+
+struct virtio_rtc_notif_alarm {
+ struct virtio_rtc_notif_head head;
+ uint16_t clock_id;
+ uint8_t reserved[6];
+};
+
+/** Union of notification types for alarmq */
+union virtio_rtc_notif_alarmq {
+ struct virtio_rtc_notif_alarm alarm;
+};
+
+#endif /* _LINUX_VIRTIO_RTC_H */
diff --git a/include/standard-headers/linux/vmclock-abi.h b/include/standard-headers/linux/vmclock-abi.h
index 15b0316cb4cdffb6e56abc7f55a584dc8b68fb10..fe824badc0445f5e913955eab4ef09f360c82e70 100644
--- a/include/standard-headers/linux/vmclock-abi.h
+++ b/include/standard-headers/linux/vmclock-abi.h
@@ -115,6 +115,17 @@ struct vmclock_abi {
* bit again after the update, using the about-to-be-valid fields.
*/
#define VMCLOCK_FLAG_TIME_MONOTONIC (1 << 7)
+ /*
+ * If the VM_GEN_COUNTER_PRESENT flag is set, the hypervisor will
+ * bump the vm_generation_counter field every time the guest is
+ * loaded from some save state (restored from a snapshot).
+ */
+#define VMCLOCK_FLAG_VM_GEN_COUNTER_PRESENT (1 << 8)
+ /*
+ * If the NOTIFICATION_PRESENT flag is set, the hypervisor will send
+ * a notification every time it updates seq_count to a new even number.
+ */
+#define VMCLOCK_FLAG_NOTIFICATION_PRESENT (1 << 9)
uint8_t pad[2];
uint8_t clock_status;
@@ -177,6 +188,15 @@ struct vmclock_abi {
uint64_t time_frac_sec; /* Units of 1/2^64 of a second */
uint64_t time_esterror_nanosec;
uint64_t time_maxerror_nanosec;
+
+ /*
+ * This field changes to another non-repeating value when the guest
+ * has been loaded from a snapshot. In addition to handling a
+ * disruption in time (which will also be signalled through the
+ * disruption_marker field), a guest may wish to discard UUIDs,
+ * reset network connections, reseed entropy, etc.
+ */
+ uint64_t vm_generation_counter;
};
#endif /* __VMCLOCK_ABI_H__ */
diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h
index 46ffbddab54bc4248c9a22db3a06395ff93338db..6aefe79738145a0bc5f3ade3c4d2e2686c3910c3 100644
--- a/linux-headers/asm-arm64/kvm.h
+++ b/linux-headers/asm-arm64/kvm.h
@@ -416,6 +416,7 @@ enum {
#define KVM_DEV_ARM_ITS_RESTORE_TABLES 2
#define KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES 3
#define KVM_DEV_ARM_ITS_CTRL_RESET 4
+#define KVM_DEV_ARM_VGIC_USERSPACE_PPIS 5
/* Device Control API on vcpu fd */
#define KVM_ARM_VCPU_PMU_V3_CTRL 0
diff --git a/linux-headers/asm-arm64/unistd_64.h b/linux-headers/asm-arm64/unistd_64.h
index 1ef9c408135b2be7e6943e1a8927e9a11c2b38a1..70b3754a4247108544c6e377e21825166ca27757 100644
--- a/linux-headers/asm-arm64/unistd_64.h
+++ b/linux-headers/asm-arm64/unistd_64.h
@@ -327,6 +327,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_64_H */
diff --git a/linux-headers/asm-generic/unistd.h b/linux-headers/asm-generic/unistd.h
index 942370b3f5d252305832d105615f1628fa0ad304..a627acc8fb5fead80aeb95f4dfebff16a79cedf5 100644
--- a/linux-headers/asm-generic/unistd.h
+++ b/linux-headers/asm-generic/unistd.h
@@ -860,8 +860,11 @@ __SYSCALL(__NR_file_setattr, sys_file_setattr)
#define __NR_listns 470
__SYSCALL(__NR_listns, sys_listns)
+#define __NR_rseq_slice_yield 471
+__SYSCALL(__NR_rseq_slice_yield, sys_rseq_slice_yield)
+
#undef __NR_syscalls
-#define __NR_syscalls 471
+#define __NR_syscalls 472
/*
* 32 bit systems traditionally used different
diff --git a/linux-headers/asm-loongarch/kvm.h b/linux-headers/asm-loongarch/kvm.h
index de6c3f18e40ab13f9f56daeeed9b6d3c7a9fe17b..cd0b5c11ca9c2b681f8119a82f15912925a28089 100644
--- a/linux-headers/asm-loongarch/kvm.h
+++ b/linux-headers/asm-loongarch/kvm.h
@@ -105,6 +105,7 @@ struct kvm_fpu {
#define KVM_LOONGARCH_VM_FEAT_PV_STEALTIME 7
#define KVM_LOONGARCH_VM_FEAT_PTW 8
#define KVM_LOONGARCH_VM_FEAT_MSGINT 9
+#define KVM_LOONGARCH_VM_FEAT_PV_PREEMPT 10
/* Device Control API on vcpu fd */
#define KVM_LOONGARCH_VCPU_CPUCFG 0
@@ -154,4 +155,8 @@ struct kvm_iocsr_entry {
#define KVM_DEV_LOONGARCH_PCH_PIC_GRP_CTRL 0x40000006
#define KVM_DEV_LOONGARCH_PCH_PIC_CTRL_INIT 0
+#define KVM_DEV_LOONGARCH_DMSINTC_GRP_CTRL 0x40000007
+#define KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_BASE 0x0
+#define KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_SIZE 0x1
+
#endif /* __UAPI_ASM_LOONGARCH_KVM_H */
diff --git a/linux-headers/asm-loongarch/kvm_para.h b/linux-headers/asm-loongarch/kvm_para.h
index fd7f40713d49240a982d542667fe10383abbbc09..3fd87a096b66e3e6f3284e38dbd0de8f85b74722 100644
--- a/linux-headers/asm-loongarch/kvm_para.h
+++ b/linux-headers/asm-loongarch/kvm_para.h
@@ -15,6 +15,7 @@
#define CPUCFG_KVM_FEATURE (CPUCFG_KVM_BASE + 4)
#define KVM_FEATURE_IPI 1
#define KVM_FEATURE_STEAL_TIME 2
+#define KVM_FEATURE_PREEMPT 3
/* BIT 24 - 31 are features configurable by user space vmm */
#define KVM_FEATURE_VIRT_EXTIOI 24
#define KVM_FEATURE_USER_HCALL 25
diff --git a/linux-headers/asm-loongarch/unistd_64.h b/linux-headers/asm-loongarch/unistd_64.h
index aa5daac4ef9020807a1bc7bb60e3005857ac8206..3a29d86e1dee499105408c409562d8dcb8d3f9a9 100644
--- a/linux-headers/asm-loongarch/unistd_64.h
+++ b/linux-headers/asm-loongarch/unistd_64.h
@@ -300,6 +300,7 @@
#define __NR_landlock_create_ruleset 444
#define __NR_landlock_add_rule 445
#define __NR_landlock_restrict_self 446
+#define __NR_memfd_secret 447
#define __NR_process_mrelease 448
#define __NR_futex_waitv 449
#define __NR_set_mempolicy_home_node 450
@@ -323,6 +324,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_64_H */
diff --git a/linux-headers/asm-mips/unistd_n32.h b/linux-headers/asm-mips/unistd_n32.h
index a33d106dca769262119aba6924394cbc90430042..5fa1ee0cb4651af7d34d6177a12b9538702e5027 100644
--- a/linux-headers/asm-mips/unistd_n32.h
+++ b/linux-headers/asm-mips/unistd_n32.h
@@ -399,5 +399,6 @@
#define __NR_file_getattr (__NR_Linux + 468)
#define __NR_file_setattr (__NR_Linux + 469)
#define __NR_listns (__NR_Linux + 470)
+#define __NR_rseq_slice_yield (__NR_Linux + 471)
#endif /* _ASM_UNISTD_N32_H */
diff --git a/linux-headers/asm-mips/unistd_n64.h b/linux-headers/asm-mips/unistd_n64.h
index 1bc251e4507c3a86b31fe80a7d2788853a1abc73..e1f873d83a5d521342801fb05e1debb2564ffa21 100644
--- a/linux-headers/asm-mips/unistd_n64.h
+++ b/linux-headers/asm-mips/unistd_n64.h
@@ -375,5 +375,6 @@
#define __NR_file_getattr (__NR_Linux + 468)
#define __NR_file_setattr (__NR_Linux + 469)
#define __NR_listns (__NR_Linux + 470)
+#define __NR_rseq_slice_yield (__NR_Linux + 471)
#endif /* _ASM_UNISTD_N64_H */
diff --git a/linux-headers/asm-mips/unistd_o32.h b/linux-headers/asm-mips/unistd_o32.h
index c57175d496c080cebb8414c91b5a93c96e7725c3..8207e9ca4f674867b65d4d7297b5c2b019f564a1 100644
--- a/linux-headers/asm-mips/unistd_o32.h
+++ b/linux-headers/asm-mips/unistd_o32.h
@@ -445,5 +445,6 @@
#define __NR_file_getattr (__NR_Linux + 468)
#define __NR_file_setattr (__NR_Linux + 469)
#define __NR_listns (__NR_Linux + 470)
+#define __NR_rseq_slice_yield (__NR_Linux + 471)
#endif /* _ASM_UNISTD_O32_H */
diff --git a/linux-headers/asm-powerpc/unistd_32.h b/linux-headers/asm-powerpc/unistd_32.h
index a3f4aa2fe20f2ff30cc825174c0d0c3df50c1425..1f633601201b544f5210c601a4d573792807ac5e 100644
--- a/linux-headers/asm-powerpc/unistd_32.h
+++ b/linux-headers/asm-powerpc/unistd_32.h
@@ -452,6 +452,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_32_H */
diff --git a/linux-headers/asm-powerpc/unistd_64.h b/linux-headers/asm-powerpc/unistd_64.h
index d4444557f1ce4bf0d0ed2fdfdd60432cff9c677e..87439c53c121ec4189d0dad404c438265e0c92eb 100644
--- a/linux-headers/asm-powerpc/unistd_64.h
+++ b/linux-headers/asm-powerpc/unistd_64.h
@@ -424,6 +424,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_64_H */
diff --git a/linux-headers/asm-riscv/kvm.h b/linux-headers/asm-riscv/kvm.h
index 54f3ad7ed2e4bf2580c1659758bd9f89f7a451c8..504e73305343a8d3ffac39ed8fb675f90e1d6ed3 100644
--- a/linux-headers/asm-riscv/kvm.h
+++ b/linux-headers/asm-riscv/kvm.h
@@ -110,6 +110,10 @@ struct kvm_riscv_timer {
__u64 state;
};
+/* Possible states for kvm_riscv_timer */
+#define KVM_RISCV_TIMER_STATE_OFF 0
+#define KVM_RISCV_TIMER_STATE_ON 1
+
/*
* ISA extension IDs specific to KVM. This is not the same as the host ISA
* extension IDs as that is internal to the host and should not be exposed
@@ -192,6 +196,9 @@ enum KVM_RISCV_ISA_EXT_ID {
KVM_RISCV_ISA_EXT_ZFBFMIN,
KVM_RISCV_ISA_EXT_ZVFBFMIN,
KVM_RISCV_ISA_EXT_ZVFBFWMA,
+ KVM_RISCV_ISA_EXT_ZCLSD,
+ KVM_RISCV_ISA_EXT_ZILSD,
+ KVM_RISCV_ISA_EXT_ZALASR,
KVM_RISCV_ISA_EXT_MAX,
};
@@ -235,10 +242,6 @@ struct kvm_riscv_sbi_fwft {
struct kvm_riscv_sbi_fwft_feature pointer_masking;
};
-/* Possible states for kvm_riscv_timer */
-#define KVM_RISCV_TIMER_STATE_OFF 0
-#define KVM_RISCV_TIMER_STATE_ON 1
-
/* If you need to interpret the index values, here is the key: */
#define KVM_REG_RISCV_TYPE_MASK 0x00000000FF000000
#define KVM_REG_RISCV_TYPE_SHIFT 24
diff --git a/linux-headers/asm-riscv/ptrace.h b/linux-headers/asm-riscv/ptrace.h
index a3f8211ede44bb131adaa6e6058e06388fcaccbe..cf8764299496b3024a3eaf202d70453944f9ce59 100644
--- a/linux-headers/asm-riscv/ptrace.h
+++ b/linux-headers/asm-riscv/ptrace.h
@@ -9,6 +9,7 @@
#ifndef __ASSEMBLER__
#include <linux/types.h>
+#include <linux/const.h>
#define PTRACE_GETFDPIC 33
@@ -127,6 +128,42 @@ struct __riscv_v_regset_state {
*/
#define RISCV_MAX_VLENB (8192)
+struct __sc_riscv_cfi_state {
+ unsigned long ss_ptr; /* shadow stack pointer */
+};
+
+#define PTRACE_CFI_BRANCH_LANDING_PAD_EN_BIT 0
+#define PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_BIT 1
+#define PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_BIT 2
+#define PTRACE_CFI_SHADOW_STACK_EN_BIT 3
+#define PTRACE_CFI_SHADOW_STACK_LOCK_BIT 4
+#define PTRACE_CFI_SHADOW_STACK_PTR_BIT 5
+
+#define PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE _BITUL(PTRACE_CFI_BRANCH_LANDING_PAD_EN_BIT)
+#define PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE \
+ _BITUL(PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_BIT)
+#define PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE \
+ _BITUL(PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_BIT)
+#define PTRACE_CFI_SHADOW_STACK_EN_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_EN_BIT)
+#define PTRACE_CFI_SHADOW_STACK_LOCK_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_LOCK_BIT)
+#define PTRACE_CFI_SHADOW_STACK_PTR_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_PTR_BIT)
+
+#define PTRACE_CFI_STATE_INVALID_MASK ~(PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE | \
+ PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE | \
+ PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE | \
+ PTRACE_CFI_SHADOW_STACK_EN_STATE | \
+ PTRACE_CFI_SHADOW_STACK_LOCK_STATE | \
+ PTRACE_CFI_SHADOW_STACK_PTR_STATE)
+
+struct __cfi_status {
+ __u64 cfi_state;
+};
+
+struct user_cfi_state {
+ struct __cfi_status cfi_status;
+ __u64 shstk_ptr;
+};
+
#endif /* __ASSEMBLER__ */
#endif /* _ASM_RISCV_PTRACE_H */
diff --git a/linux-headers/asm-riscv/unistd_32.h b/linux-headers/asm-riscv/unistd_32.h
index 9f33956246392da58bdfc1e4ceafd97cdfee221b..828f3c2b9de1d3a8f55de8771fb0fea67379e4f1 100644
--- a/linux-headers/asm-riscv/unistd_32.h
+++ b/linux-headers/asm-riscv/unistd_32.h
@@ -318,6 +318,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_32_H */
diff --git a/linux-headers/asm-riscv/unistd_64.h b/linux-headers/asm-riscv/unistd_64.h
index c2e7258916470221e354f83d6e3c8237b7bfb36c..8fa59835a333721f6fae361115fa52ff94f8cf7c 100644
--- a/linux-headers/asm-riscv/unistd_64.h
+++ b/linux-headers/asm-riscv/unistd_64.h
@@ -328,6 +328,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_64_H */
diff --git a/linux-headers/asm-s390/unistd_32.h b/linux-headers/asm-s390/unistd_32.h
deleted file mode 100644
index 37b8f6f3585dfcb86ce39a86c4210f7b200e218b..0000000000000000000000000000000000000000
--- a/linux-headers/asm-s390/unistd_32.h
+++ /dev/null
@@ -1,446 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#ifndef _ASM_S390_UNISTD_32_H
-#define _ASM_S390_UNISTD_32_H
-
-#define __NR_exit 1
-#define __NR_fork 2
-#define __NR_read 3
-#define __NR_write 4
-#define __NR_open 5
-#define __NR_close 6
-#define __NR_restart_syscall 7
-#define __NR_creat 8
-#define __NR_link 9
-#define __NR_unlink 10
-#define __NR_execve 11
-#define __NR_chdir 12
-#define __NR_time 13
-#define __NR_mknod 14
-#define __NR_chmod 15
-#define __NR_lchown 16
-#define __NR_lseek 19
-#define __NR_getpid 20
-#define __NR_mount 21
-#define __NR_umount 22
-#define __NR_setuid 23
-#define __NR_getuid 24
-#define __NR_stime 25
-#define __NR_ptrace 26
-#define __NR_alarm 27
-#define __NR_pause 29
-#define __NR_utime 30
-#define __NR_access 33
-#define __NR_nice 34
-#define __NR_sync 36
-#define __NR_kill 37
-#define __NR_rename 38
-#define __NR_mkdir 39
-#define __NR_rmdir 40
-#define __NR_dup 41
-#define __NR_pipe 42
-#define __NR_times 43
-#define __NR_brk 45
-#define __NR_setgid 46
-#define __NR_getgid 47
-#define __NR_signal 48
-#define __NR_geteuid 49
-#define __NR_getegid 50
-#define __NR_acct 51
-#define __NR_umount2 52
-#define __NR_ioctl 54
-#define __NR_fcntl 55
-#define __NR_setpgid 57
-#define __NR_umask 60
-#define __NR_chroot 61
-#define __NR_ustat 62
-#define __NR_dup2 63
-#define __NR_getppid 64
-#define __NR_getpgrp 65
-#define __NR_setsid 66
-#define __NR_sigaction 67
-#define __NR_setreuid 70
-#define __NR_setregid 71
-#define __NR_sigsuspend 72
-#define __NR_sigpending 73
-#define __NR_sethostname 74
-#define __NR_setrlimit 75
-#define __NR_getrlimit 76
-#define __NR_getrusage 77
-#define __NR_gettimeofday 78
-#define __NR_settimeofday 79
-#define __NR_getgroups 80
-#define __NR_setgroups 81
-#define __NR_symlink 83
-#define __NR_readlink 85
-#define __NR_uselib 86
-#define __NR_swapon 87
-#define __NR_reboot 88
-#define __NR_readdir 89
-#define __NR_mmap 90
-#define __NR_munmap 91
-#define __NR_truncate 92
-#define __NR_ftruncate 93
-#define __NR_fchmod 94
-#define __NR_fchown 95
-#define __NR_getpriority 96
-#define __NR_setpriority 97
-#define __NR_statfs 99
-#define __NR_fstatfs 100
-#define __NR_ioperm 101
-#define __NR_socketcall 102
-#define __NR_syslog 103
-#define __NR_setitimer 104
-#define __NR_getitimer 105
-#define __NR_stat 106
-#define __NR_lstat 107
-#define __NR_fstat 108
-#define __NR_lookup_dcookie 110
-#define __NR_vhangup 111
-#define __NR_idle 112
-#define __NR_wait4 114
-#define __NR_swapoff 115
-#define __NR_sysinfo 116
-#define __NR_ipc 117
-#define __NR_fsync 118
-#define __NR_sigreturn 119
-#define __NR_clone 120
-#define __NR_setdomainname 121
-#define __NR_uname 122
-#define __NR_adjtimex 124
-#define __NR_mprotect 125
-#define __NR_sigprocmask 126
-#define __NR_create_module 127
-#define __NR_init_module 128
-#define __NR_delete_module 129
-#define __NR_get_kernel_syms 130
-#define __NR_quotactl 131
-#define __NR_getpgid 132
-#define __NR_fchdir 133
-#define __NR_bdflush 134
-#define __NR_sysfs 135
-#define __NR_personality 136
-#define __NR_afs_syscall 137
-#define __NR_setfsuid 138
-#define __NR_setfsgid 139
-#define __NR__llseek 140
-#define __NR_getdents 141
-#define __NR__newselect 142
-#define __NR_flock 143
-#define __NR_msync 144
-#define __NR_readv 145
-#define __NR_writev 146
-#define __NR_getsid 147
-#define __NR_fdatasync 148
-#define __NR__sysctl 149
-#define __NR_mlock 150
-#define __NR_munlock 151
-#define __NR_mlockall 152
-#define __NR_munlockall 153
-#define __NR_sched_setparam 154
-#define __NR_sched_getparam 155
-#define __NR_sched_setscheduler 156
-#define __NR_sched_getscheduler 157
-#define __NR_sched_yield 158
-#define __NR_sched_get_priority_max 159
-#define __NR_sched_get_priority_min 160
-#define __NR_sched_rr_get_interval 161
-#define __NR_nanosleep 162
-#define __NR_mremap 163
-#define __NR_setresuid 164
-#define __NR_getresuid 165
-#define __NR_query_module 167
-#define __NR_poll 168
-#define __NR_nfsservctl 169
-#define __NR_setresgid 170
-#define __NR_getresgid 171
-#define __NR_prctl 172
-#define __NR_rt_sigreturn 173
-#define __NR_rt_sigaction 174
-#define __NR_rt_sigprocmask 175
-#define __NR_rt_sigpending 176
-#define __NR_rt_sigtimedwait 177
-#define __NR_rt_sigqueueinfo 178
-#define __NR_rt_sigsuspend 179
-#define __NR_pread64 180
-#define __NR_pwrite64 181
-#define __NR_chown 182
-#define __NR_getcwd 183
-#define __NR_capget 184
-#define __NR_capset 185
-#define __NR_sigaltstack 186
-#define __NR_sendfile 187
-#define __NR_getpmsg 188
-#define __NR_putpmsg 189
-#define __NR_vfork 190
-#define __NR_ugetrlimit 191
-#define __NR_mmap2 192
-#define __NR_truncate64 193
-#define __NR_ftruncate64 194
-#define __NR_stat64 195
-#define __NR_lstat64 196
-#define __NR_fstat64 197
-#define __NR_lchown32 198
-#define __NR_getuid32 199
-#define __NR_getgid32 200
-#define __NR_geteuid32 201
-#define __NR_getegid32 202
-#define __NR_setreuid32 203
-#define __NR_setregid32 204
-#define __NR_getgroups32 205
-#define __NR_setgroups32 206
-#define __NR_fchown32 207
-#define __NR_setresuid32 208
-#define __NR_getresuid32 209
-#define __NR_setresgid32 210
-#define __NR_getresgid32 211
-#define __NR_chown32 212
-#define __NR_setuid32 213
-#define __NR_setgid32 214
-#define __NR_setfsuid32 215
-#define __NR_setfsgid32 216
-#define __NR_pivot_root 217
-#define __NR_mincore 218
-#define __NR_madvise 219
-#define __NR_getdents64 220
-#define __NR_fcntl64 221
-#define __NR_readahead 222
-#define __NR_sendfile64 223
-#define __NR_setxattr 224
-#define __NR_lsetxattr 225
-#define __NR_fsetxattr 226
-#define __NR_getxattr 227
-#define __NR_lgetxattr 228
-#define __NR_fgetxattr 229
-#define __NR_listxattr 230
-#define __NR_llistxattr 231
-#define __NR_flistxattr 232
-#define __NR_removexattr 233
-#define __NR_lremovexattr 234
-#define __NR_fremovexattr 235
-#define __NR_gettid 236
-#define __NR_tkill 237
-#define __NR_futex 238
-#define __NR_sched_setaffinity 239
-#define __NR_sched_getaffinity 240
-#define __NR_tgkill 241
-#define __NR_io_setup 243
-#define __NR_io_destroy 244
-#define __NR_io_getevents 245
-#define __NR_io_submit 246
-#define __NR_io_cancel 247
-#define __NR_exit_group 248
-#define __NR_epoll_create 249
-#define __NR_epoll_ctl 250
-#define __NR_epoll_wait 251
-#define __NR_set_tid_address 252
-#define __NR_fadvise64 253
-#define __NR_timer_create 254
-#define __NR_timer_settime 255
-#define __NR_timer_gettime 256
-#define __NR_timer_getoverrun 257
-#define __NR_timer_delete 258
-#define __NR_clock_settime 259
-#define __NR_clock_gettime 260
-#define __NR_clock_getres 261
-#define __NR_clock_nanosleep 262
-#define __NR_fadvise64_64 264
-#define __NR_statfs64 265
-#define __NR_fstatfs64 266
-#define __NR_remap_file_pages 267
-#define __NR_mbind 268
-#define __NR_get_mempolicy 269
-#define __NR_set_mempolicy 270
-#define __NR_mq_open 271
-#define __NR_mq_unlink 272
-#define __NR_mq_timedsend 273
-#define __NR_mq_timedreceive 274
-#define __NR_mq_notify 275
-#define __NR_mq_getsetattr 276
-#define __NR_kexec_load 277
-#define __NR_add_key 278
-#define __NR_request_key 279
-#define __NR_keyctl 280
-#define __NR_waitid 281
-#define __NR_ioprio_set 282
-#define __NR_ioprio_get 283
-#define __NR_inotify_init 284
-#define __NR_inotify_add_watch 285
-#define __NR_inotify_rm_watch 286
-#define __NR_migrate_pages 287
-#define __NR_openat 288
-#define __NR_mkdirat 289
-#define __NR_mknodat 290
-#define __NR_fchownat 291
-#define __NR_futimesat 292
-#define __NR_fstatat64 293
-#define __NR_unlinkat 294
-#define __NR_renameat 295
-#define __NR_linkat 296
-#define __NR_symlinkat 297
-#define __NR_readlinkat 298
-#define __NR_fchmodat 299
-#define __NR_faccessat 300
-#define __NR_pselect6 301
-#define __NR_ppoll 302
-#define __NR_unshare 303
-#define __NR_set_robust_list 304
-#define __NR_get_robust_list 305
-#define __NR_splice 306
-#define __NR_sync_file_range 307
-#define __NR_tee 308
-#define __NR_vmsplice 309
-#define __NR_move_pages 310
-#define __NR_getcpu 311
-#define __NR_epoll_pwait 312
-#define __NR_utimes 313
-#define __NR_fallocate 314
-#define __NR_utimensat 315
-#define __NR_signalfd 316
-#define __NR_timerfd 317
-#define __NR_eventfd 318
-#define __NR_timerfd_create 319
-#define __NR_timerfd_settime 320
-#define __NR_timerfd_gettime 321
-#define __NR_signalfd4 322
-#define __NR_eventfd2 323
-#define __NR_inotify_init1 324
-#define __NR_pipe2 325
-#define __NR_dup3 326
-#define __NR_epoll_create1 327
-#define __NR_preadv 328
-#define __NR_pwritev 329
-#define __NR_rt_tgsigqueueinfo 330
-#define __NR_perf_event_open 331
-#define __NR_fanotify_init 332
-#define __NR_fanotify_mark 333
-#define __NR_prlimit64 334
-#define __NR_name_to_handle_at 335
-#define __NR_open_by_handle_at 336
-#define __NR_clock_adjtime 337
-#define __NR_syncfs 338
-#define __NR_setns 339
-#define __NR_process_vm_readv 340
-#define __NR_process_vm_writev 341
-#define __NR_s390_runtime_instr 342
-#define __NR_kcmp 343
-#define __NR_finit_module 344
-#define __NR_sched_setattr 345
-#define __NR_sched_getattr 346
-#define __NR_renameat2 347
-#define __NR_seccomp 348
-#define __NR_getrandom 349
-#define __NR_memfd_create 350
-#define __NR_bpf 351
-#define __NR_s390_pci_mmio_write 352
-#define __NR_s390_pci_mmio_read 353
-#define __NR_execveat 354
-#define __NR_userfaultfd 355
-#define __NR_membarrier 356
-#define __NR_recvmmsg 357
-#define __NR_sendmmsg 358
-#define __NR_socket 359
-#define __NR_socketpair 360
-#define __NR_bind 361
-#define __NR_connect 362
-#define __NR_listen 363
-#define __NR_accept4 364
-#define __NR_getsockopt 365
-#define __NR_setsockopt 366
-#define __NR_getsockname 367
-#define __NR_getpeername 368
-#define __NR_sendto 369
-#define __NR_sendmsg 370
-#define __NR_recvfrom 371
-#define __NR_recvmsg 372
-#define __NR_shutdown 373
-#define __NR_mlock2 374
-#define __NR_copy_file_range 375
-#define __NR_preadv2 376
-#define __NR_pwritev2 377
-#define __NR_s390_guarded_storage 378
-#define __NR_statx 379
-#define __NR_s390_sthyi 380
-#define __NR_kexec_file_load 381
-#define __NR_io_pgetevents 382
-#define __NR_rseq 383
-#define __NR_pkey_mprotect 384
-#define __NR_pkey_alloc 385
-#define __NR_pkey_free 386
-#define __NR_semget 393
-#define __NR_semctl 394
-#define __NR_shmget 395
-#define __NR_shmctl 396
-#define __NR_shmat 397
-#define __NR_shmdt 398
-#define __NR_msgget 399
-#define __NR_msgsnd 400
-#define __NR_msgrcv 401
-#define __NR_msgctl 402
-#define __NR_clock_gettime64 403
-#define __NR_clock_settime64 404
-#define __NR_clock_adjtime64 405
-#define __NR_clock_getres_time64 406
-#define __NR_clock_nanosleep_time64 407
-#define __NR_timer_gettime64 408
-#define __NR_timer_settime64 409
-#define __NR_timerfd_gettime64 410
-#define __NR_timerfd_settime64 411
-#define __NR_utimensat_time64 412
-#define __NR_pselect6_time64 413
-#define __NR_ppoll_time64 414
-#define __NR_io_pgetevents_time64 416
-#define __NR_recvmmsg_time64 417
-#define __NR_mq_timedsend_time64 418
-#define __NR_mq_timedreceive_time64 419
-#define __NR_semtimedop_time64 420
-#define __NR_rt_sigtimedwait_time64 421
-#define __NR_futex_time64 422
-#define __NR_sched_rr_get_interval_time64 423
-#define __NR_pidfd_send_signal 424
-#define __NR_io_uring_setup 425
-#define __NR_io_uring_enter 426
-#define __NR_io_uring_register 427
-#define __NR_open_tree 428
-#define __NR_move_mount 429
-#define __NR_fsopen 430
-#define __NR_fsconfig 431
-#define __NR_fsmount 432
-#define __NR_fspick 433
-#define __NR_pidfd_open 434
-#define __NR_clone3 435
-#define __NR_close_range 436
-#define __NR_openat2 437
-#define __NR_pidfd_getfd 438
-#define __NR_faccessat2 439
-#define __NR_process_madvise 440
-#define __NR_epoll_pwait2 441
-#define __NR_mount_setattr 442
-#define __NR_quotactl_fd 443
-#define __NR_landlock_create_ruleset 444
-#define __NR_landlock_add_rule 445
-#define __NR_landlock_restrict_self 446
-#define __NR_memfd_secret 447
-#define __NR_process_mrelease 448
-#define __NR_futex_waitv 449
-#define __NR_set_mempolicy_home_node 450
-#define __NR_cachestat 451
-#define __NR_fchmodat2 452
-#define __NR_map_shadow_stack 453
-#define __NR_futex_wake 454
-#define __NR_futex_wait 455
-#define __NR_futex_requeue 456
-#define __NR_statmount 457
-#define __NR_listmount 458
-#define __NR_lsm_get_self_attr 459
-#define __NR_lsm_set_self_attr 460
-#define __NR_lsm_list_modules 461
-#define __NR_mseal 462
-#define __NR_setxattrat 463
-#define __NR_getxattrat 464
-#define __NR_listxattrat 465
-#define __NR_removexattrat 466
-#define __NR_open_tree_attr 467
-#define __NR_file_getattr 468
-#define __NR_file_setattr 469
-
-#endif /* _ASM_S390_UNISTD_32_H */
diff --git a/linux-headers/asm-s390/unistd_64.h b/linux-headers/asm-s390/unistd_64.h
index 8d9e579ef50d46cb27ff1f0694f74083e285c17c..01f674c1bcb7c06f1479034a73f1eba55823570d 100644
--- a/linux-headers/asm-s390/unistd_64.h
+++ b/linux-headers/asm-s390/unistd_64.h
@@ -390,6 +390,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_64_H */
diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h
index b804fd25a2b861327c2be7a30f14b2dbb2df1944..01d46e29294f9c7cc1e615c4f35a3dc5c349d58c 100644
--- a/linux-headers/asm-x86/kvm.h
+++ b/linux-headers/asm-x86/kvm.h
@@ -197,13 +197,13 @@ struct kvm_msrs {
__u32 nmsrs; /* number of msrs in entries */
__u32 pad;
- struct kvm_msr_entry entries[];
+ __DECLARE_FLEX_ARRAY(struct kvm_msr_entry, entries);
};
/* for KVM_GET_MSR_INDEX_LIST */
struct kvm_msr_list {
__u32 nmsrs; /* number of msrs in entries */
- __u32 indices[];
+ __DECLARE_FLEX_ARRAY(__u32, indices);
};
/* Maximum size of any access bitmap in bytes */
@@ -243,7 +243,7 @@ struct kvm_cpuid_entry {
struct kvm_cpuid {
__u32 nent;
__u32 padding;
- struct kvm_cpuid_entry entries[];
+ __DECLARE_FLEX_ARRAY(struct kvm_cpuid_entry, entries);
};
struct kvm_cpuid_entry2 {
@@ -265,7 +265,7 @@ struct kvm_cpuid_entry2 {
struct kvm_cpuid2 {
__u32 nent;
__u32 padding;
- struct kvm_cpuid_entry2 entries[];
+ __DECLARE_FLEX_ARRAY(struct kvm_cpuid_entry2, entries);
};
/* for KVM_GET_PIT and KVM_SET_PIT */
@@ -396,7 +396,7 @@ struct kvm_xsave {
* the contents of CPUID leaf 0xD on the host.
*/
__u32 region[1024];
- __u32 extra[];
+ __DECLARE_FLEX_ARRAY(__u32, extra);
};
#define KVM_MAX_XCRS 16
@@ -474,6 +474,7 @@ struct kvm_sync_regs {
#define KVM_X86_QUIRK_SLOT_ZAP_ALL (1 << 7)
#define KVM_X86_QUIRK_STUFF_FEATURE_MSRS (1 << 8)
#define KVM_X86_QUIRK_IGNORE_GUEST_PAT (1 << 9)
+#define KVM_X86_QUIRK_VMCS12_ALLOW_FREEZE_IN_SMM (1 << 10)
#define KVM_STATE_NESTED_FORMAT_VMX 0
#define KVM_STATE_NESTED_FORMAT_SVM 1
@@ -501,6 +502,7 @@ struct kvm_sync_regs {
#define KVM_X86_GRP_SEV 1
# define KVM_X86_SEV_VMSA_FEATURES 0
# define KVM_X86_SNP_POLICY_BITS 1
+# define KVM_X86_SEV_SNP_REQ_CERTS 2
struct kvm_vmx_nested_state_data {
__u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
@@ -562,7 +564,7 @@ struct kvm_pmu_event_filter {
__u32 fixed_counter_bitmap;
__u32 flags;
__u32 pad[4];
- __u64 events[];
+ __DECLARE_FLEX_ARRAY(__u64, events);
};
#define KVM_PMU_EVENT_ALLOW 0
@@ -741,6 +743,7 @@ enum sev_cmd_id {
KVM_SEV_SNP_LAUNCH_START = 100,
KVM_SEV_SNP_LAUNCH_UPDATE,
KVM_SEV_SNP_LAUNCH_FINISH,
+ KVM_SEV_SNP_ENABLE_REQ_CERTS,
KVM_SEV_NR_MAX,
};
@@ -912,8 +915,10 @@ struct kvm_sev_snp_launch_finish {
__u64 pad1[4];
};
-#define KVM_X2APIC_API_USE_32BIT_IDS (1ULL << 0)
-#define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK (1ULL << 1)
+#define KVM_X2APIC_API_USE_32BIT_IDS _BITULL(0)
+#define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK _BITULL(1)
+#define KVM_X2APIC_ENABLE_SUPPRESS_EOI_BROADCAST _BITULL(2)
+#define KVM_X2APIC_DISABLE_SUPPRESS_EOI_BROADCAST _BITULL(3)
struct kvm_hyperv_eventfd {
__u32 conn_id;
diff --git a/linux-headers/asm-x86/unistd_32.h b/linux-headers/asm-x86/unistd_32.h
index 34255aac64f020864107bdd72b017d51ce321a02..e94546882962f3eae6619cd46ddd7b5c007a22ef 100644
--- a/linux-headers/asm-x86/unistd_32.h
+++ b/linux-headers/asm-x86/unistd_32.h
@@ -461,6 +461,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_32_H */
diff --git a/linux-headers/asm-x86/unistd_64.h b/linux-headers/asm-x86/unistd_64.h
index 07f242a5fa435cc1fead96e84328b0512a1c0645..3c49b00ed13cc21703aff4f0d60f10c81ba822e9 100644
--- a/linux-headers/asm-x86/unistd_64.h
+++ b/linux-headers/asm-x86/unistd_64.h
@@ -385,6 +385,7 @@
#define __NR_file_getattr 468
#define __NR_file_setattr 469
#define __NR_listns 470
+#define __NR_rseq_slice_yield 471
#endif /* _ASM_UNISTD_64_H */
diff --git a/linux-headers/asm-x86/unistd_x32.h b/linux-headers/asm-x86/unistd_x32.h
index 08fc9da2fab506d13713f0b56998004b269ba831..bd2af9ad088d8da3e8ee045743d3687289cf389d 100644
--- a/linux-headers/asm-x86/unistd_x32.h
+++ b/linux-headers/asm-x86/unistd_x32.h
@@ -338,6 +338,7 @@
#define __NR_file_getattr (__X32_SYSCALL_BIT + 468)
#define __NR_file_setattr (__X32_SYSCALL_BIT + 469)
#define __NR_listns (__X32_SYSCALL_BIT + 470)
+#define __NR_rseq_slice_yield (__X32_SYSCALL_BIT + 471)
#define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
#define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
#define __NR_ioctl (__X32_SYSCALL_BIT + 514)
diff --git a/linux-headers/linux/const.h b/linux-headers/linux/const.h
index 95ede2334204048d49b228284e9fbc1561337a16..c6a9d0c9835cae62a97209ca393ee2b8e930469f 100644
--- a/linux-headers/linux/const.h
+++ b/linux-headers/linux/const.h
@@ -50,4 +50,22 @@
#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
+/*
+ * Divide positive or negative dividend by positive or negative divisor
+ * and round to closest integer. Result is undefined for negative
+ * divisors if the dividend variable type is unsigned and for negative
+ * dividends if the divisor variable type is unsigned.
+ */
+#define __KERNEL_DIV_ROUND_CLOSEST(x, divisor) \
+({ \
+ __typeof__(x) __x = x; \
+ __typeof__(divisor) __d = divisor; \
+ \
+ (((__typeof__(x))-1) > 0 || \
+ ((__typeof__(divisor))-1) > 0 || \
+ (((__x) > 0) == ((__d) > 0))) ? \
+ (((__x) + ((__d) / 2)) / (__d)) : \
+ (((__x) - ((__d) / 2)) / (__d)); \
+})
+
#endif /* _LINUX_CONST_H */
diff --git a/linux-headers/linux/iommufd.h b/linux-headers/linux/iommufd.h
index 384183a40393cb5a5cde875fdfc60496eec5699e..82587c7d625a7fcd73998c16266559c5b767457d 100644
--- a/linux-headers/linux/iommufd.h
+++ b/linux-headers/linux/iommufd.h
@@ -465,16 +465,27 @@ struct iommu_hwpt_arm_smmuv3 {
__aligned_le64 ste[2];
};
+/**
+ * struct iommu_hwpt_amd_guest - AMD IOMMU guest I/O page table data
+ * (IOMMU_HWPT_DATA_AMD_GUEST)
+ * @dte: Guest Device Table Entry (DTE)
+ */
+struct iommu_hwpt_amd_guest {
+ __aligned_u64 dte[4];
+};
+
/**
* enum iommu_hwpt_data_type - IOMMU HWPT Data Type
* @IOMMU_HWPT_DATA_NONE: no data
* @IOMMU_HWPT_DATA_VTD_S1: Intel VT-d stage-1 page table
* @IOMMU_HWPT_DATA_ARM_SMMUV3: ARM SMMUv3 Context Descriptor Table
+ * @IOMMU_HWPT_DATA_AMD_GUEST: AMD IOMMU guest page table
*/
enum iommu_hwpt_data_type {
IOMMU_HWPT_DATA_NONE = 0,
IOMMU_HWPT_DATA_VTD_S1 = 1,
IOMMU_HWPT_DATA_ARM_SMMUV3 = 2,
+ IOMMU_HWPT_DATA_AMD_GUEST = 3,
};
/**
@@ -623,6 +634,32 @@ struct iommu_hw_info_tegra241_cmdqv {
__u8 __reserved;
};
+/**
+ * struct iommu_hw_info_amd - AMD IOMMU device info
+ *
+ * @efr : Value of AMD IOMMU Extended Feature Register (EFR)
+ * @efr2: Value of AMD IOMMU Extended Feature 2 Register (EFR2)
+ *
+ * Please See description of these registers in the following sections of
+ * the AMD I/O Virtualization Technology (IOMMU) Specification.
+ * (https://docs.amd.com/v/u/en-US/48882_3.10_PUB)
+ *
+ * - MMIO Offset 0030h IOMMU Extended Feature Register
+ * - MMIO Offset 01A0h IOMMU Extended Feature 2 Register
+ *
+ * Note: The EFR and EFR2 are raw values reported by hardware.
+ * VMM is responsible to determine the appropriate flags to be exposed to
+ * the VM since cetertain features are not currently supported by the kernel
+ * for HW-vIOMMU.
+ *
+ * Current VMM-allowed list of feature flags are:
+ * - EFR[GTSup, GASup, GioSup, PPRSup, EPHSup, GATS, GLX, PASmax]
+ */
+struct iommu_hw_info_amd {
+ __aligned_u64 efr;
+ __aligned_u64 efr2;
+};
+
/**
* enum iommu_hw_info_type - IOMMU Hardware Info Types
* @IOMMU_HW_INFO_TYPE_NONE: Output by the drivers that do not report hardware
@@ -632,6 +669,7 @@ struct iommu_hw_info_tegra241_cmdqv {
* @IOMMU_HW_INFO_TYPE_ARM_SMMUV3: ARM SMMUv3 iommu info type
* @IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV: NVIDIA Tegra241 CMDQV (extension for ARM
* SMMUv3) info type
+ * @IOMMU_HW_INFO_TYPE_AMD: AMD IOMMU info type
*/
enum iommu_hw_info_type {
IOMMU_HW_INFO_TYPE_NONE = 0,
@@ -639,6 +677,7 @@ enum iommu_hw_info_type {
IOMMU_HW_INFO_TYPE_INTEL_VTD = 1,
IOMMU_HW_INFO_TYPE_ARM_SMMUV3 = 2,
IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV = 3,
+ IOMMU_HW_INFO_TYPE_AMD = 4,
};
/**
@@ -656,11 +695,15 @@ enum iommu_hw_info_type {
* @IOMMU_HW_CAP_PCI_PASID_PRIV: Privileged Mode Supported, user ignores it
* when the struct
* iommu_hw_info::out_max_pasid_log2 is zero.
+ * @IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED: ATS is not supported or cannot be used
+ * on this device (absence implies ATS
+ * may be enabled)
*/
enum iommufd_hw_capabilities {
IOMMU_HW_CAP_DIRTY_TRACKING = 1 << 0,
IOMMU_HW_CAP_PCI_PASID_EXEC = 1 << 1,
IOMMU_HW_CAP_PCI_PASID_PRIV = 1 << 2,
+ IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED = 1 << 3,
};
/**
@@ -1013,6 +1056,11 @@ struct iommu_fault_alloc {
enum iommu_viommu_type {
IOMMU_VIOMMU_TYPE_DEFAULT = 0,
IOMMU_VIOMMU_TYPE_ARM_SMMUV3 = 1,
+ /*
+ * TEGRA241_CMDQV requirements (otherwise, VCMDQs will not work)
+ * - Kernel will allocate a VINTF (HYP_OWN=0) to back this VIOMMU. So,
+ * VMM must wire the HYP_OWN bit to 0 in guest VINTF_CONFIG register
+ */
IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV = 2,
};
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
index a4ab42dcba977797f20fad2375ab7e428f873f5e..50e87ed72c202417f47611f83ba464f2b89356d1 100644
--- a/linux-headers/linux/kvm.h
+++ b/linux-headers/linux/kvm.h
@@ -11,9 +11,11 @@
#include <linux/const.h>
#include <linux/types.h>
+#include <linux/stddef.h>
#include <linux/ioctl.h>
#include <asm/kvm.h>
+
#define KVM_API_VERSION 12
/*
@@ -135,6 +137,12 @@ struct kvm_xen_exit {
} u;
};
+struct kvm_exit_snp_req_certs {
+ __u64 gpa;
+ __u64 npages;
+ __u64 ret;
+};
+
#define KVM_S390_GET_SKEYS_NONE 1
#define KVM_S390_SKEYS_MAX 1048576
@@ -180,6 +188,8 @@ struct kvm_xen_exit {
#define KVM_EXIT_MEMORY_FAULT 39
#define KVM_EXIT_TDX 40
#define KVM_EXIT_ARM_SEA 41
+#define KVM_EXIT_ARM_LDST64B 42
+#define KVM_EXIT_SNP_REQ_CERTS 43
/* For KVM_EXIT_INTERNAL_ERROR */
/* Emulate instruction failed. */
@@ -394,7 +404,7 @@ struct kvm_run {
} eoi;
/* KVM_EXIT_HYPERV */
struct kvm_hyperv_exit hyperv;
- /* KVM_EXIT_ARM_NISV */
+ /* KVM_EXIT_ARM_NISV / KVM_EXIT_ARM_LDST64B */
struct {
__u64 esr_iss;
__u64 fault_ipa;
@@ -474,6 +484,8 @@ struct kvm_run {
__u64 gva;
__u64 gpa;
} arm_sea;
+ /* KVM_EXIT_SNP_REQ_CERTS */
+ struct kvm_exit_snp_req_certs snp_req_certs;
/* Fix the size of the union. */
char padding[256];
};
@@ -520,7 +532,7 @@ struct kvm_coalesced_mmio {
struct kvm_coalesced_mmio_ring {
__u32 first, last;
- struct kvm_coalesced_mmio coalesced_mmio[];
+ __DECLARE_FLEX_ARRAY(struct kvm_coalesced_mmio, coalesced_mmio);
};
#define KVM_COALESCED_MMIO_MAX \
@@ -570,7 +582,7 @@ struct kvm_clear_dirty_log {
/* for KVM_SET_SIGNAL_MASK */
struct kvm_signal_mask {
__u32 len;
- __u8 sigset[];
+ __DECLARE_FLEX_ARRAY(__u8, sigset);
};
/* for KVM_TPR_ACCESS_REPORTING */
@@ -681,6 +693,11 @@ struct kvm_enable_cap {
#define KVM_VM_TYPE_ARM_IPA_SIZE_MASK 0xffULL
#define KVM_VM_TYPE_ARM_IPA_SIZE(x) \
((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
+
+#define KVM_VM_TYPE_ARM_PROTECTED (1UL << 31)
+#define KVM_VM_TYPE_ARM_MASK (KVM_VM_TYPE_ARM_IPA_SIZE_MASK | \
+ KVM_VM_TYPE_ARM_PROTECTED)
+
/*
* ioctls for /dev/kvm fds:
*/
@@ -966,6 +983,8 @@ struct kvm_enable_cap {
#define KVM_CAP_GUEST_MEMFD_FLAGS 244
#define KVM_CAP_ARM_SEA_TO_USER 245
#define KVM_CAP_S390_USER_OPEREXEC 246
+#define KVM_CAP_S390_KEYOP 247
+#define KVM_CAP_S390_VSIE_ESAMODE 248
struct kvm_irq_routing_irqchip {
__u32 irqchip;
@@ -1028,7 +1047,7 @@ struct kvm_irq_routing_entry {
struct kvm_irq_routing {
__u32 nr;
__u32 flags;
- struct kvm_irq_routing_entry entries[];
+ __DECLARE_FLEX_ARRAY(struct kvm_irq_routing_entry, entries);
};
#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
@@ -1119,7 +1138,7 @@ struct kvm_dirty_tlb {
struct kvm_reg_list {
__u64 n; /* number of regs */
- __u64 reg[];
+ __DECLARE_FLEX_ARRAY(__u64, reg);
};
struct kvm_one_reg {
@@ -1201,6 +1220,10 @@ enum kvm_device_type {
#define KVM_DEV_TYPE_LOONGARCH_EIOINTC KVM_DEV_TYPE_LOONGARCH_EIOINTC
KVM_DEV_TYPE_LOONGARCH_PCHPIC,
#define KVM_DEV_TYPE_LOONGARCH_PCHPIC KVM_DEV_TYPE_LOONGARCH_PCHPIC
+ KVM_DEV_TYPE_LOONGARCH_DMSINTC,
+#define KVM_DEV_TYPE_LOONGARCH_DMSINTC KVM_DEV_TYPE_LOONGARCH_DMSINTC
+ KVM_DEV_TYPE_ARM_VGIC_V5,
+#define KVM_DEV_TYPE_ARM_VGIC_V5 KVM_DEV_TYPE_ARM_VGIC_V5
KVM_DEV_TYPE_MAX,
@@ -1211,6 +1234,16 @@ struct kvm_vfio_spapr_tce {
__s32 tablefd;
};
+#define KVM_S390_KEYOP_ISKE 0x01
+#define KVM_S390_KEYOP_RRBE 0x02
+#define KVM_S390_KEYOP_SSKE 0x03
+struct kvm_s390_keyop {
+ __u64 guest_addr;
+ __u8 key;
+ __u8 operation;
+ __u8 pad[6];
+};
+
/*
* KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
* a vcpu fd.
@@ -1230,6 +1263,7 @@ struct kvm_vfio_spapr_tce {
#define KVM_S390_UCAS_MAP _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
#define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
#define KVM_S390_VCPU_FAULT _IOW(KVMIO, 0x52, unsigned long)
+#define KVM_S390_KEYOP _IOWR(KVMIO, 0x53, struct kvm_s390_keyop)
/* Device model IOC */
#define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
@@ -1571,7 +1605,7 @@ struct kvm_stats_desc {
__u16 size;
__u32 offset;
__u32 bucket_size;
- char name[];
+ __DECLARE_FLEX_ARRAY(char, name);
};
#define KVM_GET_STATS_FD _IO(KVMIO, 0xce)
diff --git a/linux-headers/linux/mshv.h b/linux-headers/linux/mshv.h
index acceeddc1c9f14768e84b9426ae00a3303584932..6c7d3a93162cc3181c3989c28fe9f75e2ca5cc55 100644
--- a/linux-headers/linux/mshv.h
+++ b/linux-headers/linux/mshv.h
@@ -27,6 +27,8 @@ enum {
MSHV_PT_BIT_X2APIC,
MSHV_PT_BIT_GPA_SUPER_PAGES,
MSHV_PT_BIT_CPU_AND_XSAVE_FEATURES,
+ MSHV_PT_BIT_NESTED_VIRTUALIZATION,
+ MSHV_PT_BIT_SMT_ENABLED_GUEST,
MSHV_PT_BIT_COUNT,
};
@@ -355,7 +357,7 @@ struct mshv_vtl_sint_post_msg {
struct mshv_vtl_ram_disposition {
__u64 start_pfn;
- __u64 last_pfn;
+ __u64 last_pfn; /* last_pfn is excluded from the range [start_pfn, last_pfn) */
};
struct mshv_vtl_set_poll_file {
diff --git a/linux-headers/linux/psp-sev.h b/linux-headers/linux/psp-sev.h
index 9479928a4ad68afc56d0e347a3ba2b742e94ef1d..7df50022592a3f19f859faabd6e1566e95b84629 100644
--- a/linux-headers/linux/psp-sev.h
+++ b/linux-headers/linux/psp-sev.h
@@ -277,7 +277,7 @@ struct sev_user_data_snp_wrapped_vlek_hashstick {
* struct sev_issue_cmd - SEV ioctl parameters
*
* @cmd: SEV commands to execute
- * @opaque: pointer to the command structure
+ * @data: pointer to the command structure
* @error: SEV FW return code on failure
*/
struct sev_issue_cmd {
diff --git a/linux-headers/linux/stddef.h b/linux-headers/linux/stddef.h
index 48ee4438e0ef053680c64af21553e8180ce5fdee..457498259494646e52c8c8a8acf20d542ad97e29 100644
--- a/linux-headers/linux/stddef.h
+++ b/linux-headers/linux/stddef.h
@@ -69,6 +69,10 @@
#define __counted_by_be(m)
#endif
+#ifndef __counted_by_ptr
+#define __counted_by_ptr(m)
+#endif
+
#define __kernel_nonstring
#endif /* _LINUX_STDDEF_H */
diff --git a/linux-headers/linux/vduse.h b/linux-headers/linux/vduse.h
index da6ac89af18e3e60a7eb4180ec1b5471fd2c1c62..e19b3c0f51b5b4fccac4babf4203c93cebe5715f 100644
--- a/linux-headers/linux/vduse.h
+++ b/linux-headers/linux/vduse.h
@@ -10,6 +10,10 @@
#define VDUSE_API_VERSION 0
+/* VQ groups and ASID support */
+
+#define VDUSE_API_VERSION_1 1
+
/*
* Get the version of VDUSE API that kernel supported (VDUSE_API_VERSION).
* This is used for future extension.
@@ -27,6 +31,8 @@
* @features: virtio features
* @vq_num: the number of virtqueues
* @vq_align: the allocation alignment of virtqueue's metadata
+ * @ngroups: number of vq groups that VDUSE device declares
+ * @nas: number of address spaces that VDUSE device declares
* @reserved: for future use, needs to be initialized to zero
* @config_size: the size of the configuration space
* @config: the buffer of the configuration space
@@ -41,7 +47,9 @@ struct vduse_dev_config {
__u64 features;
__u32 vq_num;
__u32 vq_align;
- __u32 reserved[13];
+ __u32 ngroups; /* if VDUSE_API_VERSION >= 1 */
+ __u32 nas; /* if VDUSE_API_VERSION >= 1 */
+ __u32 reserved[11];
__u32 config_size;
__u8 config[];
};
@@ -118,14 +126,18 @@ struct vduse_config_data {
* struct vduse_vq_config - basic configuration of a virtqueue
* @index: virtqueue index
* @max_size: the max size of virtqueue
- * @reserved: for future use, needs to be initialized to zero
+ * @reserved1: for future use, needs to be initialized to zero
+ * @group: virtqueue group
+ * @reserved2: for future use, needs to be initialized to zero
*
* Structure used by VDUSE_VQ_SETUP ioctl to setup a virtqueue.
*/
struct vduse_vq_config {
__u32 index;
__u16 max_size;
- __u16 reserved[13];
+ __u16 reserved1;
+ __u32 group;
+ __u16 reserved2[10];
};
/*
@@ -156,6 +168,16 @@ struct vduse_vq_state_packed {
__u16 last_used_idx;
};
+/**
+ * struct vduse_vq_group_asid - virtqueue group ASID
+ * @group: Index of the virtqueue group
+ * @asid: Address space ID of the group
+ */
+struct vduse_vq_group_asid {
+ __u32 group;
+ __u32 asid;
+};
+
/**
* struct vduse_vq_info - information of a virtqueue
* @index: virtqueue index
@@ -215,6 +237,7 @@ struct vduse_vq_eventfd {
* @uaddr: start address of userspace memory, it must be aligned to page size
* @iova: start of the IOVA region
* @size: size of the IOVA region
+ * @asid: Address space ID of the IOVA region
* @reserved: for future use, needs to be initialized to zero
*
* Structure used by VDUSE_IOTLB_REG_UMEM and VDUSE_IOTLB_DEREG_UMEM
@@ -224,7 +247,8 @@ struct vduse_iova_umem {
__u64 uaddr;
__u64 iova;
__u64 size;
- __u64 reserved[3];
+ __u32 asid;
+ __u32 reserved[5];
};
/* Register userspace memory for IOVA regions */
@@ -238,6 +262,7 @@ struct vduse_iova_umem {
* @start: start of the IOVA region
* @last: last of the IOVA region
* @capability: capability of the IOVA region
+ * @asid: Address space ID of the IOVA region, only if device API version >= 1
* @reserved: for future use, needs to be initialized to zero
*
* Structure used by VDUSE_IOTLB_GET_INFO ioctl to get information of
@@ -248,7 +273,8 @@ struct vduse_iova_info {
__u64 last;
#define VDUSE_IOVA_CAP_UMEM (1 << 0)
__u64 capability;
- __u64 reserved[3];
+ __u32 asid; /* Only if device API version >= 1 */
+ __u32 reserved[5];
};
/*
@@ -257,6 +283,32 @@ struct vduse_iova_info {
*/
#define VDUSE_IOTLB_GET_INFO _IOWR(VDUSE_BASE, 0x1a, struct vduse_iova_info)
+/**
+ * struct vduse_iotlb_entry_v2 - entry of IOTLB to describe one IOVA region
+ *
+ * @v1: the original vduse_iotlb_entry
+ * @asid: address space ID of the IOVA region
+ * @reserved: for future use, needs to be initialized to zero
+ *
+ * Structure used by VDUSE_IOTLB_GET_FD2 ioctl to find an overlapped IOVA region.
+ */
+struct vduse_iotlb_entry_v2 {
+ __u64 offset;
+ __u64 start;
+ __u64 last;
+ __u8 perm;
+ __u8 padding[7];
+ __u32 asid;
+ __u32 reserved[11];
+};
+
+/*
+ * Same as VDUSE_IOTLB_GET_FD but with vduse_iotlb_entry_v2 argument that
+ * support extra fields.
+ */
+#define VDUSE_IOTLB_GET_FD2 _IOWR(VDUSE_BASE, 0x1b, struct vduse_iotlb_entry_v2)
+
+
/* The control messages definition for read(2)/write(2) on /dev/vduse/$NAME */
/**
@@ -265,11 +317,14 @@ struct vduse_iova_info {
* @VDUSE_SET_STATUS: set the device status
* @VDUSE_UPDATE_IOTLB: Notify userspace to update the memory mapping for
* specified IOVA range via VDUSE_IOTLB_GET_FD ioctl
+ * @VDUSE_SET_VQ_GROUP_ASID: Notify userspace to update the address space of a
+ * virtqueue group.
*/
enum vduse_req_type {
VDUSE_GET_VQ_STATE,
VDUSE_SET_STATUS,
VDUSE_UPDATE_IOTLB,
+ VDUSE_SET_VQ_GROUP_ASID,
};
/**
@@ -304,6 +359,19 @@ struct vduse_iova_range {
__u64 last;
};
+/**
+ * struct vduse_iova_range_v2 - IOVA range [start, last] if API_VERSION >= 1
+ * @start: start of the IOVA range
+ * @last: last of the IOVA range
+ * @asid: address space ID of the IOVA range
+ */
+struct vduse_iova_range_v2 {
+ __u64 start;
+ __u64 last;
+ __u32 asid;
+ __u32 padding;
+};
+
/**
* struct vduse_dev_request - control request
* @type: request type
@@ -312,6 +380,8 @@ struct vduse_iova_range {
* @vq_state: virtqueue state, only index field is available
* @s: device status
* @iova: IOVA range for updating
+ * @iova_v2: IOVA range for updating if API_VERSION >= 1
+ * @vq_group_asid: ASID of a virtqueue group
* @padding: padding
*
* Structure used by read(2) on /dev/vduse/$NAME.
@@ -324,6 +394,11 @@ struct vduse_dev_request {
struct vduse_vq_state vq_state;
struct vduse_dev_status s;
struct vduse_iova_range iova;
+ /* Following members but padding exist only if vduse api
+ * version >= 1
+ */
+ struct vduse_iova_range_v2 iova_v2;
+ struct vduse_vq_group_asid vq_group_asid;
__u32 padding[32];
};
};
diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
index 720edfee7af6adcba70361b94278024b860a1547..f3282b8e8650d68ccb164004fc45d493bf504a97 100644
--- a/linux-headers/linux/vfio.h
+++ b/linux-headers/linux/vfio.h
@@ -141,7 +141,7 @@ struct vfio_info_cap_header {
*
* Retrieve information about the group. Fills in provided
* struct vfio_group_info. Caller sets argsz.
- * Return: 0 on succes, -errno on failure.
+ * Return: 0 on success, -errno on failure.
* Availability: Always
*/
struct vfio_group_status {
@@ -964,6 +964,10 @@ struct vfio_device_bind_iommufd {
* hwpt corresponding to the given pt_id.
*
* Return: 0 on success, -errno on failure.
+ *
+ * When a device is resetting, -EBUSY will be returned to reject any concurrent
+ * attachment to the resetting device itself or any sibling device in the IOMMU
+ * group having the resetting device.
*/
struct vfio_device_attach_iommufd_pt {
__u32 argsz;
@@ -1262,6 +1266,19 @@ enum vfio_device_mig_state {
* The initial_bytes field indicates the amount of initial precopy
* data available from the device. This field should have a non-zero initial
* value and decrease as migration data is read from the device.
+ * The presence of the VFIO_PRECOPY_INFO_REINIT output flag indicates
+ * that new initial data is present on the stream.
+ * The new initial data may result, for example, from device reconfiguration
+ * during migration that requires additional initialization data.
+ * In that case initial_bytes may report a non-zero value irrespective of
+ * any previously reported values, which progresses towards zero as precopy
+ * data is read from the data stream. dirty_bytes is also reset
+ * to zero and represents the state change of the device relative to the new
+ * initial_bytes.
+ * VFIO_PRECOPY_INFO_REINIT can be reported only after userspace opts in to
+ * VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2. Without this opt-in, the flags field
+ * of struct vfio_precopy_info is reserved for bug-compatibility reasons.
+ *
* It is recommended to leave PRE_COPY for STOP_COPY only after this field
* reaches zero. Leaving PRE_COPY earlier might make things slower.
*
@@ -1297,6 +1314,7 @@ enum vfio_device_mig_state {
struct vfio_precopy_info {
__u32 argsz;
__u32 flags;
+#define VFIO_PRECOPY_INFO_REINIT (1 << 0) /* output - new initial data is present */
__aligned_u64 initial_bytes;
__aligned_u64 dirty_bytes;
};
@@ -1506,6 +1524,16 @@ struct vfio_device_feature_dma_buf {
struct vfio_region_dma_range dma_ranges[] __counted_by(nr_ranges);
};
+/*
+ * Enables the migration precopy_info_v2 behaviour.
+ *
+ * VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2.
+ *
+ * On SET, enables the v2 pre_copy_info behaviour, where the
+ * vfio_precopy_info.flags is a valid output field.
+ */
+#define VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2 12
+
/* -------- API for Type1 VFIO IOMMU -------- */
/**
--
2.54.0
在 2026/5/21 下午4:14, Cédric Le Goater 写道:
> Update headers to retrieve new IOMMUFD capabilities (ATS not-supported),
> VFIO migration flags (VFIO_PRECOPY_INFO_REINIT flag and
> VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2), KVM caps for LoongArch and
> more.
>
> Cc: Avihai Horon <avihaih@nvidia.com>
> Cc: Song Gao <gaosong@loongson.cn>
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> Cc: Cornelia Huck <cohuck@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Cédric Le Goater <clg@redhat.com>
> ---
> include/standard-headers/drm/drm_fourcc.h | 28 +-
> include/standard-headers/linux/const.h | 18 +
> include/standard-headers/linux/ethtool.h | 28 +-
> .../linux/input-event-codes.h | 13 +
> include/standard-headers/linux/pci_regs.h | 71 ++-
> include/standard-headers/linux/typelimits.h | 8 +
> include/standard-headers/linux/virtio_ring.h | 5 +-
> include/standard-headers/linux/virtio_rtc.h | 237 ++++++++++
> include/standard-headers/linux/vmclock-abi.h | 20 +
> linux-headers/asm-arm64/kvm.h | 1 +
> linux-headers/asm-arm64/unistd_64.h | 1 +
> linux-headers/asm-generic/unistd.h | 5 +-
> linux-headers/asm-loongarch/kvm.h | 5 +
> linux-headers/asm-loongarch/kvm_para.h | 1 +
> linux-headers/asm-loongarch/unistd_64.h | 2 +
> linux-headers/asm-mips/unistd_n32.h | 1 +
> linux-headers/asm-mips/unistd_n64.h | 1 +
> linux-headers/asm-mips/unistd_o32.h | 1 +
> linux-headers/asm-powerpc/unistd_32.h | 1 +
> linux-headers/asm-powerpc/unistd_64.h | 1 +
> linux-headers/asm-riscv/kvm.h | 11 +-
> linux-headers/asm-riscv/ptrace.h | 37 ++
> linux-headers/asm-riscv/unistd_32.h | 1 +
> linux-headers/asm-riscv/unistd_64.h | 1 +
> linux-headers/asm-s390/unistd_32.h | 446 ------------------
> linux-headers/asm-s390/unistd_64.h | 1 +
> linux-headers/asm-x86/kvm.h | 21 +-
> linux-headers/asm-x86/unistd_32.h | 1 +
> linux-headers/asm-x86/unistd_64.h | 1 +
> linux-headers/asm-x86/unistd_x32.h | 1 +
> linux-headers/linux/const.h | 18 +
> linux-headers/linux/iommufd.h | 48 ++
> linux-headers/linux/kvm.h | 46 +-
> linux-headers/linux/mshv.h | 4 +-
> linux-headers/linux/psp-sev.h | 2 +-
> linux-headers/linux/stddef.h | 4 +
> linux-headers/linux/vduse.h | 85 +++-
> linux-headers/linux/vfio.h | 30 +-
> 38 files changed, 713 insertions(+), 493 deletions(-)
> create mode 100644 include/standard-headers/linux/typelimits.h
> create mode 100644 include/standard-headers/linux/virtio_rtc.h
> delete mode 100644 linux-headers/asm-s390/unistd_32.h
Reviewed-by: Song Gao <gaosong@loongson.cn>
Thanks.
Song Gao
> diff --git a/include/standard-headers/drm/drm_fourcc.h b/include/standard-headers/drm/drm_fourcc.h
> index b39e197cc79f687966e40b78a955d3d0834efcc4..4bad457cc2d151e7cba8233d0a52ae43ef8333da 100644
> --- a/include/standard-headers/drm/drm_fourcc.h
> +++ b/include/standard-headers/drm/drm_fourcc.h
> @@ -400,8 +400,8 @@ extern "C" {
> * implementation can multiply the values by 2^6=64. For that reason the padding
> * must only contain zeros.
> * index 0 = Y plane, [15:0] z:Y [6:10] little endian
> - * index 1 = Cr plane, [15:0] z:Cr [6:10] little endian
> - * index 2 = Cb plane, [15:0] z:Cb [6:10] little endian
> + * index 1 = Cb plane, [15:0] z:Cb [6:10] little endian
> + * index 2 = Cr plane, [15:0] z:Cr [6:10] little endian
> */
> #define DRM_FORMAT_S010 fourcc_code('S', '0', '1', '0') /* 2x2 subsampled Cb (1) and Cr (2) planes 10 bits per channel */
> #define DRM_FORMAT_S210 fourcc_code('S', '2', '1', '0') /* 2x1 subsampled Cb (1) and Cr (2) planes 10 bits per channel */
> @@ -413,8 +413,8 @@ extern "C" {
> * implementation can multiply the values by 2^4=16. For that reason the padding
> * must only contain zeros.
> * index 0 = Y plane, [15:0] z:Y [4:12] little endian
> - * index 1 = Cr plane, [15:0] z:Cr [4:12] little endian
> - * index 2 = Cb plane, [15:0] z:Cb [4:12] little endian
> + * index 1 = Cb plane, [15:0] z:Cb [4:12] little endian
> + * index 2 = Cr plane, [15:0] z:Cr [4:12] little endian
> */
> #define DRM_FORMAT_S012 fourcc_code('S', '0', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes 12 bits per channel */
> #define DRM_FORMAT_S212 fourcc_code('S', '2', '1', '2') /* 2x1 subsampled Cb (1) and Cr (2) planes 12 bits per channel */
> @@ -423,8 +423,8 @@ extern "C" {
> /*
> * 3 plane YCbCr
> * index 0 = Y plane, [15:0] Y little endian
> - * index 1 = Cr plane, [15:0] Cr little endian
> - * index 2 = Cb plane, [15:0] Cb little endian
> + * index 1 = Cb plane, [15:0] Cb little endian
> + * index 2 = Cr plane, [15:0] Cr little endian
> */
> #define DRM_FORMAT_S016 fourcc_code('S', '0', '1', '6') /* 2x2 subsampled Cb (1) and Cr (2) planes 16 bits per channel */
> #define DRM_FORMAT_S216 fourcc_code('S', '2', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes 16 bits per channel */
> @@ -1421,6 +1421,22 @@ drm_fourcc_canonicalize_nvidia_format_mod(uint64_t modifier)
> #define DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED \
> DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 1ULL)
>
> +/*
> + * ARM 64k interleaved modifier
> + *
> + * This is used by ARM Mali v10+ GPUs. With this modifier, the plane is divided
> + * into 64k byte 1:1 or 2:1 -sided tiles. The 64k tiles are laid out linearly.
> + * Each 64k tile is divided into blocks of 16x16 texel blocks, which are
> + * themselves laid out linearly within a 64k tile. Then within each 16x16
> + * block, texel blocks are laid out according to U order, similar to
> + * 16X16_BLOCK_U_INTERLEAVED.
> + *
> + * Note that unlike 16X16_BLOCK_U_INTERLEAVED, the layout does not change
> + * depending on whether a format is compressed or not.
> + */
> +#define DRM_FORMAT_MOD_ARM_INTERLEAVED_64K \
> + DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 2ULL)
> +
> /*
> * Allwinner tiled modifier
> *
> diff --git a/include/standard-headers/linux/const.h b/include/standard-headers/linux/const.h
> index 95ede2334204048d49b228284e9fbc1561337a16..c6a9d0c9835cae62a97209ca393ee2b8e930469f 100644
> --- a/include/standard-headers/linux/const.h
> +++ b/include/standard-headers/linux/const.h
> @@ -50,4 +50,22 @@
>
> #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
>
> +/*
> + * Divide positive or negative dividend by positive or negative divisor
> + * and round to closest integer. Result is undefined for negative
> + * divisors if the dividend variable type is unsigned and for negative
> + * dividends if the divisor variable type is unsigned.
> + */
> +#define __KERNEL_DIV_ROUND_CLOSEST(x, divisor) \
> +({ \
> + __typeof__(x) __x = x; \
> + __typeof__(divisor) __d = divisor; \
> + \
> + (((__typeof__(x))-1) > 0 || \
> + ((__typeof__(divisor))-1) > 0 || \
> + (((__x) > 0) == ((__d) > 0))) ? \
> + (((__x) + ((__d) / 2)) / (__d)) : \
> + (((__x) - ((__d) / 2)) / (__d)); \
> +})
> +
> #endif /* _LINUX_CONST_H */
> diff --git a/include/standard-headers/linux/ethtool.h b/include/standard-headers/linux/ethtool.h
> index d0f7a63f1099c2e53d92a3ed608f495f3b64b5ff..5d82126cd7e8fb5ebd03a56224e80d8ed7c0bc83 100644
> --- a/include/standard-headers/linux/ethtool.h
> +++ b/include/standard-headers/linux/ethtool.h
> @@ -17,11 +17,10 @@
> #include "net/eth.h"
>
> #include "standard-headers/linux/const.h"
> +#include "standard-headers/linux/typelimits.h"
> #include "standard-headers/linux/types.h"
> #include "standard-headers/linux/if_ether.h"
>
> -#include <limits.h> /* for INT_MAX */
> -
> /* All structures exposed to userland should be defined such that they
> * have the same layout for 32-bit and 64-bit userland.
> */
> @@ -228,7 +227,7 @@ enum tunable_id {
> ETHTOOL_ID_UNSPEC,
> ETHTOOL_RX_COPYBREAK,
> ETHTOOL_TX_COPYBREAK,
> - ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */
> + ETHTOOL_PFC_PREVENTION_TOUT, /* both pause and pfc, see man ethtool */
> ETHTOOL_TX_COPYBREAK_BUF_SIZE,
> /*
> * Add your fresh new tunable attribute above and remember to update
> @@ -603,6 +602,8 @@ enum ethtool_link_ext_state {
> ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED,
> ETHTOOL_LINK_EXT_STATE_OVERHEAT,
> ETHTOOL_LINK_EXT_STATE_MODULE,
> + ETHTOOL_LINK_EXT_STATE_OTP_SPEED_VIOLATION,
> + ETHTOOL_LINK_EXT_STATE_BMC_REQUEST_DOWN,
> };
>
> /* More information in addition to ETHTOOL_LINK_EXT_STATE_AUTONEG. */
> @@ -1094,13 +1095,20 @@ enum ethtool_module_fw_flash_status {
> * struct ethtool_gstrings - string set for data tagging
> * @cmd: Command number = %ETHTOOL_GSTRINGS
> * @string_set: String set ID; one of &enum ethtool_stringset
> - * @len: On return, the number of strings in the string set
> + * @len: Number of strings in the string set
> * @data: Buffer for strings. Each string is null-padded to a size of
> * %ETH_GSTRING_LEN.
> *
> * Users must use %ETHTOOL_GSSET_INFO to find the number of strings in
> * the string set. They must allocate a buffer of the appropriate
> * size immediately following this structure.
> + *
> + * Setting @len on input is optional (though preferred), but must be zeroed
> + * otherwise.
> + * When set, @len will return the requested count if it matches the actual
> + * count; otherwise, it will be zero.
> + * This prevents issues when the number of strings is different than the
> + * userspace allocation.
> */
> struct ethtool_gstrings {
> uint32_t cmd;
> @@ -1177,13 +1185,20 @@ struct ethtool_test {
> /**
> * struct ethtool_stats - device-specific statistics
> * @cmd: Command number = %ETHTOOL_GSTATS
> - * @n_stats: On return, the number of statistics
> + * @n_stats: Number of statistics
> * @data: Array of statistics
> *
> * Users must use %ETHTOOL_GSSET_INFO or %ETHTOOL_GDRVINFO to find the
> * number of statistics that will be returned. They must allocate a
> * buffer of the appropriate size (8 * number of statistics)
> * immediately following this structure.
> + *
> + * Setting @n_stats on input is optional (though preferred), but must be zeroed
> + * otherwise.
> + * When set, @n_stats will return the requested count if it matches the actual
> + * count; otherwise, it will be zero.
> + * This prevents issues when the number of stats is different than the
> + * userspace allocation.
> */
> struct ethtool_stats {
> uint32_t cmd;
> @@ -2190,6 +2205,7 @@ enum ethtool_link_mode_bit_indices {
> #define SPEED_40000 40000
> #define SPEED_50000 50000
> #define SPEED_56000 56000
> +#define SPEED_80000 80000
> #define SPEED_100000 100000
> #define SPEED_200000 200000
> #define SPEED_400000 400000
> @@ -2200,7 +2216,7 @@ enum ethtool_link_mode_bit_indices {
>
> static inline int ethtool_validate_speed(uint32_t speed)
> {
> - return speed <= INT_MAX || speed == (uint32_t)SPEED_UNKNOWN;
> + return speed <= __KERNEL_INT_MAX || speed == (uint32_t)SPEED_UNKNOWN;
> }
>
> /* Duplex, half or full. */
> diff --git a/include/standard-headers/linux/input-event-codes.h b/include/standard-headers/linux/input-event-codes.h
> index ede79c6ae4f538bf18e80eedd7bab56dc1959115..dd7c986106e3749881ae43cb43143a590b6039fc 100644
> --- a/include/standard-headers/linux/input-event-codes.h
> +++ b/include/standard-headers/linux/input-event-codes.h
> @@ -643,6 +643,10 @@
> #define KEY_EPRIVACY_SCREEN_ON 0x252
> #define KEY_EPRIVACY_SCREEN_OFF 0x253
>
> +#define KEY_ACTION_ON_SELECTION 0x254 /* AL Action on Selection (HUTRR119) */
> +#define KEY_CONTEXTUAL_INSERT 0x255 /* AL Contextual Insertion (HUTRR119) */
> +#define KEY_CONTEXTUAL_QUERY 0x256 /* AL Contextual Query (HUTRR119) */
> +
> #define KEY_KBDINPUTASSIST_PREV 0x260
> #define KEY_KBDINPUTASSIST_NEXT 0x261
> #define KEY_KBDINPUTASSIST_PREVGROUP 0x262
> @@ -891,6 +895,7 @@
>
> #define ABS_VOLUME 0x20
> #define ABS_PROFILE 0x21
> +#define ABS_SND_PROFILE 0x22
>
> #define ABS_MISC 0x28
>
> @@ -1000,4 +1005,12 @@
> #define SND_MAX 0x07
> #define SND_CNT (SND_MAX+1)
>
> +/*
> + * ABS_SND_PROFILE values
> + */
> +
> +#define SND_PROFILE_SILENT 0x00
> +#define SND_PROFILE_VIBRATE 0x01
> +#define SND_PROFILE_RING 0x02
> +
> #endif
> diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h
> index 3add74ae259483bab76e7552cb28bd9c9ef0b30c..14f634ab9350d5442192162225b5e5202dbe2308 100644
> --- a/include/standard-headers/linux/pci_regs.h
> +++ b/include/standard-headers/linux/pci_regs.h
> @@ -132,6 +132,11 @@
> #define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */
> #define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */
> #define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */
> +/* Masks for dword-sized processing of Bus Number and Sec Latency Timer fields */
> +#define PCI_PRIMARY_BUS_MASK 0x000000ff
> +#define PCI_SECONDARY_BUS_MASK 0x0000ff00
> +#define PCI_SUBORDINATE_BUS_MASK 0x00ff0000
> +#define PCI_SEC_LATENCY_TIMER_MASK 0xff000000
> #define PCI_IO_BASE 0x1c /* I/O range behind the bridge */
> #define PCI_IO_LIMIT 0x1d
> #define PCI_IO_RANGE_TYPE_MASK 0x0fUL /* I/O bridging type */
> @@ -707,7 +712,7 @@
> #define PCI_EXP_LNKCTL2_HASD 0x0020 /* HW Autonomous Speed Disable */
> #define PCI_EXP_LNKSTA2 0x32 /* Link Status 2 */
> #define PCI_EXP_LNKSTA2_FLIT 0x0400 /* Flit Mode Status */
> -#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 0x32 /* end of v2 EPs w/ link */
> +#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 0x34 /* end of v2 EPs w/ link */
> #define PCI_EXP_SLTCAP2 0x34 /* Slot Capabilities 2 */
> #define PCI_EXP_SLTCAP2_IBPD 0x00000001 /* In-band PD Disable Supported */
> #define PCI_EXP_SLTCTL2 0x38 /* Slot Control 2 */
> @@ -1253,11 +1258,6 @@
> #define PCI_DEV3_STA 0x0c /* Device 3 Status Register */
> #define PCI_DEV3_STA_SEGMENT 0x8 /* Segment Captured (end-to-end flit-mode detected) */
>
> -/* Compute Express Link (CXL r3.1, sec 8.1.5) */
> -#define PCI_DVSEC_CXL_PORT 3
> -#define PCI_DVSEC_CXL_PORT_CTL 0x0c
> -#define PCI_DVSEC_CXL_PORT_CTL_UNMASK_SBR 0x00000001
> -
> /* Integrity and Data Encryption Extended Capability */
> #define PCI_IDE_CAP 0x04
> #define PCI_IDE_CAP_LINK 0x1 /* Link IDE Stream Supported */
> @@ -1338,4 +1338,63 @@
> #define PCI_IDE_SEL_ADDR_3(x) (28 + (x) * PCI_IDE_SEL_ADDR_BLOCK_SIZE)
> #define PCI_IDE_SEL_BLOCK_SIZE(nr_assoc) (20 + PCI_IDE_SEL_ADDR_BLOCK_SIZE * (nr_assoc))
>
> +/*
> + * Compute Express Link (CXL r4.0, sec 8.1)
> + *
> + * Note that CXL DVSEC id 3 and 7 to be ignored when the CXL link state
> + * is "disconnected" (CXL r4.0, sec 9.12.3). Re-enumerate these
> + * registers on downstream link-up events.
> + */
> +
> +/* CXL r4.0, 8.1.3: PCIe DVSEC for CXL Device */
> +#define PCI_DVSEC_CXL_DEVICE 0
> +#define PCI_DVSEC_CXL_CAP 0xA
> +#define PCI_DVSEC_CXL_MEM_CAPABLE _BITUL(2)
> +#define PCI_DVSEC_CXL_HDM_COUNT __GENMASK(5, 4)
> +#define PCI_DVSEC_CXL_CTRL 0xC
> +#define PCI_DVSEC_CXL_MEM_ENABLE _BITUL(2)
> +#define PCI_DVSEC_CXL_RANGE_SIZE_HIGH(i) (0x18 + (i * 0x10))
> +#define PCI_DVSEC_CXL_RANGE_SIZE_LOW(i) (0x1C + (i * 0x10))
> +#define PCI_DVSEC_CXL_MEM_INFO_VALID _BITUL(0)
> +#define PCI_DVSEC_CXL_MEM_ACTIVE _BITUL(1)
> +#define PCI_DVSEC_CXL_MEM_SIZE_LOW __GENMASK(31, 28)
> +#define PCI_DVSEC_CXL_RANGE_BASE_HIGH(i) (0x20 + (i * 0x10))
> +#define PCI_DVSEC_CXL_RANGE_BASE_LOW(i) (0x24 + (i * 0x10))
> +#define PCI_DVSEC_CXL_MEM_BASE_LOW __GENMASK(31, 28)
> +
> +#define CXL_DVSEC_RANGE_MAX 2
> +
> +/* CXL r4.0, 8.1.4: Non-CXL Function Map DVSEC */
> +#define PCI_DVSEC_CXL_FUNCTION_MAP 2
> +
> +/* CXL r4.0, 8.1.5: Extensions DVSEC for Ports */
> +#define PCI_DVSEC_CXL_PORT 3
> +#define PCI_DVSEC_CXL_PORT_CTL 0x0c
> +#define PCI_DVSEC_CXL_PORT_CTL_UNMASK_SBR 0x00000001
> +
> +/* CXL r4.0, 8.1.6: GPF DVSEC for CXL Port */
> +#define PCI_DVSEC_CXL_PORT_GPF 4
> +#define PCI_DVSEC_CXL_PORT_GPF_PHASE_1_CONTROL 0x0C
> +#define PCI_DVSEC_CXL_PORT_GPF_PHASE_1_TMO_BASE __GENMASK(3, 0)
> +#define PCI_DVSEC_CXL_PORT_GPF_PHASE_1_TMO_SCALE __GENMASK(11, 8)
> +#define PCI_DVSEC_CXL_PORT_GPF_PHASE_2_CONTROL 0xE
> +#define PCI_DVSEC_CXL_PORT_GPF_PHASE_2_TMO_BASE __GENMASK(3, 0)
> +#define PCI_DVSEC_CXL_PORT_GPF_PHASE_2_TMO_SCALE __GENMASK(11, 8)
> +
> +/* CXL r4.0, 8.1.7: GPF DVSEC for CXL Device */
> +#define PCI_DVSEC_CXL_DEVICE_GPF 5
> +
> +/* CXL r4.0, 8.1.8: Flex Bus DVSEC */
> +#define PCI_DVSEC_CXL_FLEXBUS_PORT 7
> +#define PCI_DVSEC_CXL_FLEXBUS_PORT_STATUS 0xE
> +#define PCI_DVSEC_CXL_FLEXBUS_PORT_STATUS_CACHE _BITUL(0)
> +#define PCI_DVSEC_CXL_FLEXBUS_PORT_STATUS_MEM _BITUL(2)
> +
> +/* CXL r4.0, 8.1.9: Register Locator DVSEC */
> +#define PCI_DVSEC_CXL_REG_LOCATOR 8
> +#define PCI_DVSEC_CXL_REG_LOCATOR_BLOCK1 0xC
> +#define PCI_DVSEC_CXL_REG_LOCATOR_BIR __GENMASK(2, 0)
> +#define PCI_DVSEC_CXL_REG_LOCATOR_BLOCK_ID __GENMASK(15, 8)
> +#define PCI_DVSEC_CXL_REG_LOCATOR_BLOCK_OFF_LOW __GENMASK(31, 16)
> +
> #endif /* LINUX_PCI_REGS_H */
> diff --git a/include/standard-headers/linux/typelimits.h b/include/standard-headers/linux/typelimits.h
> new file mode 100644
> index 0000000000000000000000000000000000000000..130452008212423c5bb011300799ff5bd9ca8237
> --- /dev/null
> +++ b/include/standard-headers/linux/typelimits.h
> @@ -0,0 +1,8 @@
> +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
> +#ifndef _LINUX_TYPELIMITS_H
> +#define _LINUX_TYPELIMITS_H
> +
> +#define __KERNEL_INT_MAX ((int)(~0U >> 1))
> +#define __KERNEL_INT_MIN (-__KERNEL_INT_MAX - 1)
> +
> +#endif /* _LINUX_TYPELIMITS_H */
> diff --git a/include/standard-headers/linux/virtio_ring.h b/include/standard-headers/linux/virtio_ring.h
> index 22f6eb8ca710d3f35060e26df99dd4beb6fb95f1..a0f73a1c7ba00b187a43dd9f38b493531e9ac5cd 100644
> --- a/include/standard-headers/linux/virtio_ring.h
> +++ b/include/standard-headers/linux/virtio_ring.h
> @@ -1,5 +1,7 @@
> #ifndef _LINUX_VIRTIO_RING_H
> #define _LINUX_VIRTIO_RING_H
> +
> +#define VIRTIO_RING_NO_LEGACY
> /* An interface for efficient virtio implementation, currently for use by KVM,
> * but hopefully others soon. Do NOT change this since it will
> * break existing servers and clients.
> @@ -31,7 +33,6 @@
> * SUCH DAMAGE.
> *
> * Copyright Rusty Russell IBM Corporation 2007. */
> -#include <stdint.h>
> #include "standard-headers/linux/types.h"
> #include "standard-headers/linux/virtio_types.h"
>
> @@ -200,7 +201,7 @@ static inline void vring_init(struct vring *vr, unsigned int num, void *p,
> vr->num = num;
> vr->desc = p;
> vr->avail = (struct vring_avail *)((char *)p + num * sizeof(struct vring_desc));
> - vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] + sizeof(__virtio16)
> + vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(__virtio16)
> + align-1) & ~(align - 1));
> }
>
> diff --git a/include/standard-headers/linux/virtio_rtc.h b/include/standard-headers/linux/virtio_rtc.h
> new file mode 100644
> index 0000000000000000000000000000000000000000..7e2c21ebff58e6c821320f0999a9f351d0d2ae36
> --- /dev/null
> +++ b/include/standard-headers/linux/virtio_rtc.h
> @@ -0,0 +1,237 @@
> +/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */
> +/*
> + * Copyright (C) 2022-2024 OpenSynergy GmbH
> + * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
> + */
> +
> +#ifndef _LINUX_VIRTIO_RTC_H
> +#define _LINUX_VIRTIO_RTC_H
> +
> +#include "standard-headers/linux/types.h"
> +
> +/* alarm feature */
> +#define VIRTIO_RTC_F_ALARM 0
> +
> +/* read request message types */
> +
> +#define VIRTIO_RTC_REQ_READ 0x0001
> +#define VIRTIO_RTC_REQ_READ_CROSS 0x0002
> +
> +/* control request message types */
> +
> +#define VIRTIO_RTC_REQ_CFG 0x1000
> +#define VIRTIO_RTC_REQ_CLOCK_CAP 0x1001
> +#define VIRTIO_RTC_REQ_CROSS_CAP 0x1002
> +#define VIRTIO_RTC_REQ_READ_ALARM 0x1003
> +#define VIRTIO_RTC_REQ_SET_ALARM 0x1004
> +#define VIRTIO_RTC_REQ_SET_ALARM_ENABLED 0x1005
> +
> +/* alarmq message types */
> +
> +#define VIRTIO_RTC_NOTIF_ALARM 0x2000
> +
> +/* Message headers */
> +
> +/** common request header */
> +struct virtio_rtc_req_head {
> + uint16_t msg_type;
> + uint8_t reserved[6];
> +};
> +
> +/** common response header */
> +struct virtio_rtc_resp_head {
> +#define VIRTIO_RTC_S_OK 0
> +#define VIRTIO_RTC_S_EOPNOTSUPP 2
> +#define VIRTIO_RTC_S_ENODEV 3
> +#define VIRTIO_RTC_S_EINVAL 4
> +#define VIRTIO_RTC_S_EIO 5
> + uint8_t status;
> + uint8_t reserved[7];
> +};
> +
> +/** common notification header */
> +struct virtio_rtc_notif_head {
> + uint16_t msg_type;
> + uint8_t reserved[6];
> +};
> +
> +/* read requests */
> +
> +/* VIRTIO_RTC_REQ_READ message */
> +
> +struct virtio_rtc_req_read {
> + struct virtio_rtc_req_head head;
> + uint16_t clock_id;
> + uint8_t reserved[6];
> +};
> +
> +struct virtio_rtc_resp_read {
> + struct virtio_rtc_resp_head head;
> + uint64_t clock_reading;
> +};
> +
> +/* VIRTIO_RTC_REQ_READ_CROSS message */
> +
> +struct virtio_rtc_req_read_cross {
> + struct virtio_rtc_req_head head;
> + uint16_t clock_id;
> +/* Arm Generic Timer Counter-timer Virtual Count Register (CNTVCT_EL0) */
> +#define VIRTIO_RTC_COUNTER_ARM_VCT 0
> +/* x86 Time-Stamp Counter */
> +#define VIRTIO_RTC_COUNTER_X86_TSC 1
> +/* Invalid */
> +#define VIRTIO_RTC_COUNTER_INVALID 0xFF
> + uint8_t hw_counter;
> + uint8_t reserved[5];
> +};
> +
> +struct virtio_rtc_resp_read_cross {
> + struct virtio_rtc_resp_head head;
> + uint64_t clock_reading;
> + uint64_t counter_cycles;
> +};
> +
> +/* control requests */
> +
> +/* VIRTIO_RTC_REQ_CFG message */
> +
> +struct virtio_rtc_req_cfg {
> + struct virtio_rtc_req_head head;
> + /* no request params */
> +};
> +
> +struct virtio_rtc_resp_cfg {
> + struct virtio_rtc_resp_head head;
> + /** # of clocks -> clock ids < num_clocks are valid */
> + uint16_t num_clocks;
> + uint8_t reserved[6];
> +};
> +
> +/* VIRTIO_RTC_REQ_CLOCK_CAP message */
> +
> +struct virtio_rtc_req_clock_cap {
> + struct virtio_rtc_req_head head;
> + uint16_t clock_id;
> + uint8_t reserved[6];
> +};
> +
> +struct virtio_rtc_resp_clock_cap {
> + struct virtio_rtc_resp_head head;
> +#define VIRTIO_RTC_CLOCK_UTC 0
> +#define VIRTIO_RTC_CLOCK_TAI 1
> +#define VIRTIO_RTC_CLOCK_MONOTONIC 2
> +#define VIRTIO_RTC_CLOCK_UTC_SMEARED 3
> +#define VIRTIO_RTC_CLOCK_UTC_MAYBE_SMEARED 4
> + uint8_t type;
> +#define VIRTIO_RTC_SMEAR_UNSPECIFIED 0
> +#define VIRTIO_RTC_SMEAR_NOON_LINEAR 1
> +#define VIRTIO_RTC_SMEAR_UTC_SLS 2
> + uint8_t leap_second_smearing;
> +#define VIRTIO_RTC_FLAG_ALARM_CAP (1 << 0)
> + uint8_t flags;
> + uint8_t reserved[5];
> +};
> +
> +/* VIRTIO_RTC_REQ_CROSS_CAP message */
> +
> +struct virtio_rtc_req_cross_cap {
> + struct virtio_rtc_req_head head;
> + uint16_t clock_id;
> + uint8_t hw_counter;
> + uint8_t reserved[5];
> +};
> +
> +struct virtio_rtc_resp_cross_cap {
> + struct virtio_rtc_resp_head head;
> +#define VIRTIO_RTC_FLAG_CROSS_CAP (1 << 0)
> + uint8_t flags;
> + uint8_t reserved[7];
> +};
> +
> +/* VIRTIO_RTC_REQ_READ_ALARM message */
> +
> +struct virtio_rtc_req_read_alarm {
> + struct virtio_rtc_req_head head;
> + uint16_t clock_id;
> + uint8_t reserved[6];
> +};
> +
> +struct virtio_rtc_resp_read_alarm {
> + struct virtio_rtc_resp_head head;
> + uint64_t alarm_time;
> +#define VIRTIO_RTC_FLAG_ALARM_ENABLED (1 << 0)
> + uint8_t flags;
> + uint8_t reserved[7];
> +};
> +
> +/* VIRTIO_RTC_REQ_SET_ALARM message */
> +
> +struct virtio_rtc_req_set_alarm {
> + struct virtio_rtc_req_head head;
> + uint64_t alarm_time;
> + uint16_t clock_id;
> + /* flag VIRTIO_RTC_FLAG_ALARM_ENABLED */
> + uint8_t flags;
> + uint8_t reserved[5];
> +};
> +
> +struct virtio_rtc_resp_set_alarm {
> + struct virtio_rtc_resp_head head;
> + /* no response params */
> +};
> +
> +/* VIRTIO_RTC_REQ_SET_ALARM_ENABLED message */
> +
> +struct virtio_rtc_req_set_alarm_enabled {
> + struct virtio_rtc_req_head head;
> + uint16_t clock_id;
> + /* flag VIRTIO_RTC_ALARM_ENABLED */
> + uint8_t flags;
> + uint8_t reserved[5];
> +};
> +
> +struct virtio_rtc_resp_set_alarm_enabled {
> + struct virtio_rtc_resp_head head;
> + /* no response params */
> +};
> +
> +/** Union of request types for requestq */
> +union virtio_rtc_req_requestq {
> + struct virtio_rtc_req_read read;
> + struct virtio_rtc_req_read_cross read_cross;
> + struct virtio_rtc_req_cfg cfg;
> + struct virtio_rtc_req_clock_cap clock_cap;
> + struct virtio_rtc_req_cross_cap cross_cap;
> + struct virtio_rtc_req_read_alarm read_alarm;
> + struct virtio_rtc_req_set_alarm set_alarm;
> + struct virtio_rtc_req_set_alarm_enabled set_alarm_enabled;
> +};
> +
> +/** Union of response types for requestq */
> +union virtio_rtc_resp_requestq {
> + struct virtio_rtc_resp_read read;
> + struct virtio_rtc_resp_read_cross read_cross;
> + struct virtio_rtc_resp_cfg cfg;
> + struct virtio_rtc_resp_clock_cap clock_cap;
> + struct virtio_rtc_resp_cross_cap cross_cap;
> + struct virtio_rtc_resp_read_alarm read_alarm;
> + struct virtio_rtc_resp_set_alarm set_alarm;
> + struct virtio_rtc_resp_set_alarm_enabled set_alarm_enabled;
> +};
> +
> +/* alarmq notifications */
> +
> +/* VIRTIO_RTC_NOTIF_ALARM notification */
> +
> +struct virtio_rtc_notif_alarm {
> + struct virtio_rtc_notif_head head;
> + uint16_t clock_id;
> + uint8_t reserved[6];
> +};
> +
> +/** Union of notification types for alarmq */
> +union virtio_rtc_notif_alarmq {
> + struct virtio_rtc_notif_alarm alarm;
> +};
> +
> +#endif /* _LINUX_VIRTIO_RTC_H */
> diff --git a/include/standard-headers/linux/vmclock-abi.h b/include/standard-headers/linux/vmclock-abi.h
> index 15b0316cb4cdffb6e56abc7f55a584dc8b68fb10..fe824badc0445f5e913955eab4ef09f360c82e70 100644
> --- a/include/standard-headers/linux/vmclock-abi.h
> +++ b/include/standard-headers/linux/vmclock-abi.h
> @@ -115,6 +115,17 @@ struct vmclock_abi {
> * bit again after the update, using the about-to-be-valid fields.
> */
> #define VMCLOCK_FLAG_TIME_MONOTONIC (1 << 7)
> + /*
> + * If the VM_GEN_COUNTER_PRESENT flag is set, the hypervisor will
> + * bump the vm_generation_counter field every time the guest is
> + * loaded from some save state (restored from a snapshot).
> + */
> +#define VMCLOCK_FLAG_VM_GEN_COUNTER_PRESENT (1 << 8)
> + /*
> + * If the NOTIFICATION_PRESENT flag is set, the hypervisor will send
> + * a notification every time it updates seq_count to a new even number.
> + */
> +#define VMCLOCK_FLAG_NOTIFICATION_PRESENT (1 << 9)
>
> uint8_t pad[2];
> uint8_t clock_status;
> @@ -177,6 +188,15 @@ struct vmclock_abi {
> uint64_t time_frac_sec; /* Units of 1/2^64 of a second */
> uint64_t time_esterror_nanosec;
> uint64_t time_maxerror_nanosec;
> +
> + /*
> + * This field changes to another non-repeating value when the guest
> + * has been loaded from a snapshot. In addition to handling a
> + * disruption in time (which will also be signalled through the
> + * disruption_marker field), a guest may wish to discard UUIDs,
> + * reset network connections, reseed entropy, etc.
> + */
> + uint64_t vm_generation_counter;
> };
>
> #endif /* __VMCLOCK_ABI_H__ */
> diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h
> index 46ffbddab54bc4248c9a22db3a06395ff93338db..6aefe79738145a0bc5f3ade3c4d2e2686c3910c3 100644
> --- a/linux-headers/asm-arm64/kvm.h
> +++ b/linux-headers/asm-arm64/kvm.h
> @@ -416,6 +416,7 @@ enum {
> #define KVM_DEV_ARM_ITS_RESTORE_TABLES 2
> #define KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES 3
> #define KVM_DEV_ARM_ITS_CTRL_RESET 4
> +#define KVM_DEV_ARM_VGIC_USERSPACE_PPIS 5
>
> /* Device Control API on vcpu fd */
> #define KVM_ARM_VCPU_PMU_V3_CTRL 0
> diff --git a/linux-headers/asm-arm64/unistd_64.h b/linux-headers/asm-arm64/unistd_64.h
> index 1ef9c408135b2be7e6943e1a8927e9a11c2b38a1..70b3754a4247108544c6e377e21825166ca27757 100644
> --- a/linux-headers/asm-arm64/unistd_64.h
> +++ b/linux-headers/asm-arm64/unistd_64.h
> @@ -327,6 +327,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_64_H */
> diff --git a/linux-headers/asm-generic/unistd.h b/linux-headers/asm-generic/unistd.h
> index 942370b3f5d252305832d105615f1628fa0ad304..a627acc8fb5fead80aeb95f4dfebff16a79cedf5 100644
> --- a/linux-headers/asm-generic/unistd.h
> +++ b/linux-headers/asm-generic/unistd.h
> @@ -860,8 +860,11 @@ __SYSCALL(__NR_file_setattr, sys_file_setattr)
> #define __NR_listns 470
> __SYSCALL(__NR_listns, sys_listns)
>
> +#define __NR_rseq_slice_yield 471
> +__SYSCALL(__NR_rseq_slice_yield, sys_rseq_slice_yield)
> +
> #undef __NR_syscalls
> -#define __NR_syscalls 471
> +#define __NR_syscalls 472
>
> /*
> * 32 bit systems traditionally used different
> diff --git a/linux-headers/asm-loongarch/kvm.h b/linux-headers/asm-loongarch/kvm.h
> index de6c3f18e40ab13f9f56daeeed9b6d3c7a9fe17b..cd0b5c11ca9c2b681f8119a82f15912925a28089 100644
> --- a/linux-headers/asm-loongarch/kvm.h
> +++ b/linux-headers/asm-loongarch/kvm.h
> @@ -105,6 +105,7 @@ struct kvm_fpu {
> #define KVM_LOONGARCH_VM_FEAT_PV_STEALTIME 7
> #define KVM_LOONGARCH_VM_FEAT_PTW 8
> #define KVM_LOONGARCH_VM_FEAT_MSGINT 9
> +#define KVM_LOONGARCH_VM_FEAT_PV_PREEMPT 10
>
> /* Device Control API on vcpu fd */
> #define KVM_LOONGARCH_VCPU_CPUCFG 0
> @@ -154,4 +155,8 @@ struct kvm_iocsr_entry {
> #define KVM_DEV_LOONGARCH_PCH_PIC_GRP_CTRL 0x40000006
> #define KVM_DEV_LOONGARCH_PCH_PIC_CTRL_INIT 0
>
> +#define KVM_DEV_LOONGARCH_DMSINTC_GRP_CTRL 0x40000007
> +#define KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_BASE 0x0
> +#define KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_SIZE 0x1
> +
> #endif /* __UAPI_ASM_LOONGARCH_KVM_H */
> diff --git a/linux-headers/asm-loongarch/kvm_para.h b/linux-headers/asm-loongarch/kvm_para.h
> index fd7f40713d49240a982d542667fe10383abbbc09..3fd87a096b66e3e6f3284e38dbd0de8f85b74722 100644
> --- a/linux-headers/asm-loongarch/kvm_para.h
> +++ b/linux-headers/asm-loongarch/kvm_para.h
> @@ -15,6 +15,7 @@
> #define CPUCFG_KVM_FEATURE (CPUCFG_KVM_BASE + 4)
> #define KVM_FEATURE_IPI 1
> #define KVM_FEATURE_STEAL_TIME 2
> +#define KVM_FEATURE_PREEMPT 3
> /* BIT 24 - 31 are features configurable by user space vmm */
> #define KVM_FEATURE_VIRT_EXTIOI 24
> #define KVM_FEATURE_USER_HCALL 25
> diff --git a/linux-headers/asm-loongarch/unistd_64.h b/linux-headers/asm-loongarch/unistd_64.h
> index aa5daac4ef9020807a1bc7bb60e3005857ac8206..3a29d86e1dee499105408c409562d8dcb8d3f9a9 100644
> --- a/linux-headers/asm-loongarch/unistd_64.h
> +++ b/linux-headers/asm-loongarch/unistd_64.h
> @@ -300,6 +300,7 @@
> #define __NR_landlock_create_ruleset 444
> #define __NR_landlock_add_rule 445
> #define __NR_landlock_restrict_self 446
> +#define __NR_memfd_secret 447
> #define __NR_process_mrelease 448
> #define __NR_futex_waitv 449
> #define __NR_set_mempolicy_home_node 450
> @@ -323,6 +324,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_64_H */
> diff --git a/linux-headers/asm-mips/unistd_n32.h b/linux-headers/asm-mips/unistd_n32.h
> index a33d106dca769262119aba6924394cbc90430042..5fa1ee0cb4651af7d34d6177a12b9538702e5027 100644
> --- a/linux-headers/asm-mips/unistd_n32.h
> +++ b/linux-headers/asm-mips/unistd_n32.h
> @@ -399,5 +399,6 @@
> #define __NR_file_getattr (__NR_Linux + 468)
> #define __NR_file_setattr (__NR_Linux + 469)
> #define __NR_listns (__NR_Linux + 470)
> +#define __NR_rseq_slice_yield (__NR_Linux + 471)
>
> #endif /* _ASM_UNISTD_N32_H */
> diff --git a/linux-headers/asm-mips/unistd_n64.h b/linux-headers/asm-mips/unistd_n64.h
> index 1bc251e4507c3a86b31fe80a7d2788853a1abc73..e1f873d83a5d521342801fb05e1debb2564ffa21 100644
> --- a/linux-headers/asm-mips/unistd_n64.h
> +++ b/linux-headers/asm-mips/unistd_n64.h
> @@ -375,5 +375,6 @@
> #define __NR_file_getattr (__NR_Linux + 468)
> #define __NR_file_setattr (__NR_Linux + 469)
> #define __NR_listns (__NR_Linux + 470)
> +#define __NR_rseq_slice_yield (__NR_Linux + 471)
>
> #endif /* _ASM_UNISTD_N64_H */
> diff --git a/linux-headers/asm-mips/unistd_o32.h b/linux-headers/asm-mips/unistd_o32.h
> index c57175d496c080cebb8414c91b5a93c96e7725c3..8207e9ca4f674867b65d4d7297b5c2b019f564a1 100644
> --- a/linux-headers/asm-mips/unistd_o32.h
> +++ b/linux-headers/asm-mips/unistd_o32.h
> @@ -445,5 +445,6 @@
> #define __NR_file_getattr (__NR_Linux + 468)
> #define __NR_file_setattr (__NR_Linux + 469)
> #define __NR_listns (__NR_Linux + 470)
> +#define __NR_rseq_slice_yield (__NR_Linux + 471)
>
> #endif /* _ASM_UNISTD_O32_H */
> diff --git a/linux-headers/asm-powerpc/unistd_32.h b/linux-headers/asm-powerpc/unistd_32.h
> index a3f4aa2fe20f2ff30cc825174c0d0c3df50c1425..1f633601201b544f5210c601a4d573792807ac5e 100644
> --- a/linux-headers/asm-powerpc/unistd_32.h
> +++ b/linux-headers/asm-powerpc/unistd_32.h
> @@ -452,6 +452,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_32_H */
> diff --git a/linux-headers/asm-powerpc/unistd_64.h b/linux-headers/asm-powerpc/unistd_64.h
> index d4444557f1ce4bf0d0ed2fdfdd60432cff9c677e..87439c53c121ec4189d0dad404c438265e0c92eb 100644
> --- a/linux-headers/asm-powerpc/unistd_64.h
> +++ b/linux-headers/asm-powerpc/unistd_64.h
> @@ -424,6 +424,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_64_H */
> diff --git a/linux-headers/asm-riscv/kvm.h b/linux-headers/asm-riscv/kvm.h
> index 54f3ad7ed2e4bf2580c1659758bd9f89f7a451c8..504e73305343a8d3ffac39ed8fb675f90e1d6ed3 100644
> --- a/linux-headers/asm-riscv/kvm.h
> +++ b/linux-headers/asm-riscv/kvm.h
> @@ -110,6 +110,10 @@ struct kvm_riscv_timer {
> __u64 state;
> };
>
> +/* Possible states for kvm_riscv_timer */
> +#define KVM_RISCV_TIMER_STATE_OFF 0
> +#define KVM_RISCV_TIMER_STATE_ON 1
> +
> /*
> * ISA extension IDs specific to KVM. This is not the same as the host ISA
> * extension IDs as that is internal to the host and should not be exposed
> @@ -192,6 +196,9 @@ enum KVM_RISCV_ISA_EXT_ID {
> KVM_RISCV_ISA_EXT_ZFBFMIN,
> KVM_RISCV_ISA_EXT_ZVFBFMIN,
> KVM_RISCV_ISA_EXT_ZVFBFWMA,
> + KVM_RISCV_ISA_EXT_ZCLSD,
> + KVM_RISCV_ISA_EXT_ZILSD,
> + KVM_RISCV_ISA_EXT_ZALASR,
> KVM_RISCV_ISA_EXT_MAX,
> };
>
> @@ -235,10 +242,6 @@ struct kvm_riscv_sbi_fwft {
> struct kvm_riscv_sbi_fwft_feature pointer_masking;
> };
>
> -/* Possible states for kvm_riscv_timer */
> -#define KVM_RISCV_TIMER_STATE_OFF 0
> -#define KVM_RISCV_TIMER_STATE_ON 1
> -
> /* If you need to interpret the index values, here is the key: */
> #define KVM_REG_RISCV_TYPE_MASK 0x00000000FF000000
> #define KVM_REG_RISCV_TYPE_SHIFT 24
> diff --git a/linux-headers/asm-riscv/ptrace.h b/linux-headers/asm-riscv/ptrace.h
> index a3f8211ede44bb131adaa6e6058e06388fcaccbe..cf8764299496b3024a3eaf202d70453944f9ce59 100644
> --- a/linux-headers/asm-riscv/ptrace.h
> +++ b/linux-headers/asm-riscv/ptrace.h
> @@ -9,6 +9,7 @@
> #ifndef __ASSEMBLER__
>
> #include <linux/types.h>
> +#include <linux/const.h>
>
> #define PTRACE_GETFDPIC 33
>
> @@ -127,6 +128,42 @@ struct __riscv_v_regset_state {
> */
> #define RISCV_MAX_VLENB (8192)
>
> +struct __sc_riscv_cfi_state {
> + unsigned long ss_ptr; /* shadow stack pointer */
> +};
> +
> +#define PTRACE_CFI_BRANCH_LANDING_PAD_EN_BIT 0
> +#define PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_BIT 1
> +#define PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_BIT 2
> +#define PTRACE_CFI_SHADOW_STACK_EN_BIT 3
> +#define PTRACE_CFI_SHADOW_STACK_LOCK_BIT 4
> +#define PTRACE_CFI_SHADOW_STACK_PTR_BIT 5
> +
> +#define PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE _BITUL(PTRACE_CFI_BRANCH_LANDING_PAD_EN_BIT)
> +#define PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE \
> + _BITUL(PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_BIT)
> +#define PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE \
> + _BITUL(PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_BIT)
> +#define PTRACE_CFI_SHADOW_STACK_EN_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_EN_BIT)
> +#define PTRACE_CFI_SHADOW_STACK_LOCK_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_LOCK_BIT)
> +#define PTRACE_CFI_SHADOW_STACK_PTR_STATE _BITUL(PTRACE_CFI_SHADOW_STACK_PTR_BIT)
> +
> +#define PTRACE_CFI_STATE_INVALID_MASK ~(PTRACE_CFI_BRANCH_LANDING_PAD_EN_STATE | \
> + PTRACE_CFI_BRANCH_LANDING_PAD_LOCK_STATE | \
> + PTRACE_CFI_BRANCH_EXPECTED_LANDING_PAD_STATE | \
> + PTRACE_CFI_SHADOW_STACK_EN_STATE | \
> + PTRACE_CFI_SHADOW_STACK_LOCK_STATE | \
> + PTRACE_CFI_SHADOW_STACK_PTR_STATE)
> +
> +struct __cfi_status {
> + __u64 cfi_state;
> +};
> +
> +struct user_cfi_state {
> + struct __cfi_status cfi_status;
> + __u64 shstk_ptr;
> +};
> +
> #endif /* __ASSEMBLER__ */
>
> #endif /* _ASM_RISCV_PTRACE_H */
> diff --git a/linux-headers/asm-riscv/unistd_32.h b/linux-headers/asm-riscv/unistd_32.h
> index 9f33956246392da58bdfc1e4ceafd97cdfee221b..828f3c2b9de1d3a8f55de8771fb0fea67379e4f1 100644
> --- a/linux-headers/asm-riscv/unistd_32.h
> +++ b/linux-headers/asm-riscv/unistd_32.h
> @@ -318,6 +318,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_32_H */
> diff --git a/linux-headers/asm-riscv/unistd_64.h b/linux-headers/asm-riscv/unistd_64.h
> index c2e7258916470221e354f83d6e3c8237b7bfb36c..8fa59835a333721f6fae361115fa52ff94f8cf7c 100644
> --- a/linux-headers/asm-riscv/unistd_64.h
> +++ b/linux-headers/asm-riscv/unistd_64.h
> @@ -328,6 +328,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_64_H */
> diff --git a/linux-headers/asm-s390/unistd_32.h b/linux-headers/asm-s390/unistd_32.h
> deleted file mode 100644
> index 37b8f6f3585dfcb86ce39a86c4210f7b200e218b..0000000000000000000000000000000000000000
> --- a/linux-headers/asm-s390/unistd_32.h
> +++ /dev/null
> @@ -1,446 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
> -#ifndef _ASM_S390_UNISTD_32_H
> -#define _ASM_S390_UNISTD_32_H
> -
> -#define __NR_exit 1
> -#define __NR_fork 2
> -#define __NR_read 3
> -#define __NR_write 4
> -#define __NR_open 5
> -#define __NR_close 6
> -#define __NR_restart_syscall 7
> -#define __NR_creat 8
> -#define __NR_link 9
> -#define __NR_unlink 10
> -#define __NR_execve 11
> -#define __NR_chdir 12
> -#define __NR_time 13
> -#define __NR_mknod 14
> -#define __NR_chmod 15
> -#define __NR_lchown 16
> -#define __NR_lseek 19
> -#define __NR_getpid 20
> -#define __NR_mount 21
> -#define __NR_umount 22
> -#define __NR_setuid 23
> -#define __NR_getuid 24
> -#define __NR_stime 25
> -#define __NR_ptrace 26
> -#define __NR_alarm 27
> -#define __NR_pause 29
> -#define __NR_utime 30
> -#define __NR_access 33
> -#define __NR_nice 34
> -#define __NR_sync 36
> -#define __NR_kill 37
> -#define __NR_rename 38
> -#define __NR_mkdir 39
> -#define __NR_rmdir 40
> -#define __NR_dup 41
> -#define __NR_pipe 42
> -#define __NR_times 43
> -#define __NR_brk 45
> -#define __NR_setgid 46
> -#define __NR_getgid 47
> -#define __NR_signal 48
> -#define __NR_geteuid 49
> -#define __NR_getegid 50
> -#define __NR_acct 51
> -#define __NR_umount2 52
> -#define __NR_ioctl 54
> -#define __NR_fcntl 55
> -#define __NR_setpgid 57
> -#define __NR_umask 60
> -#define __NR_chroot 61
> -#define __NR_ustat 62
> -#define __NR_dup2 63
> -#define __NR_getppid 64
> -#define __NR_getpgrp 65
> -#define __NR_setsid 66
> -#define __NR_sigaction 67
> -#define __NR_setreuid 70
> -#define __NR_setregid 71
> -#define __NR_sigsuspend 72
> -#define __NR_sigpending 73
> -#define __NR_sethostname 74
> -#define __NR_setrlimit 75
> -#define __NR_getrlimit 76
> -#define __NR_getrusage 77
> -#define __NR_gettimeofday 78
> -#define __NR_settimeofday 79
> -#define __NR_getgroups 80
> -#define __NR_setgroups 81
> -#define __NR_symlink 83
> -#define __NR_readlink 85
> -#define __NR_uselib 86
> -#define __NR_swapon 87
> -#define __NR_reboot 88
> -#define __NR_readdir 89
> -#define __NR_mmap 90
> -#define __NR_munmap 91
> -#define __NR_truncate 92
> -#define __NR_ftruncate 93
> -#define __NR_fchmod 94
> -#define __NR_fchown 95
> -#define __NR_getpriority 96
> -#define __NR_setpriority 97
> -#define __NR_statfs 99
> -#define __NR_fstatfs 100
> -#define __NR_ioperm 101
> -#define __NR_socketcall 102
> -#define __NR_syslog 103
> -#define __NR_setitimer 104
> -#define __NR_getitimer 105
> -#define __NR_stat 106
> -#define __NR_lstat 107
> -#define __NR_fstat 108
> -#define __NR_lookup_dcookie 110
> -#define __NR_vhangup 111
> -#define __NR_idle 112
> -#define __NR_wait4 114
> -#define __NR_swapoff 115
> -#define __NR_sysinfo 116
> -#define __NR_ipc 117
> -#define __NR_fsync 118
> -#define __NR_sigreturn 119
> -#define __NR_clone 120
> -#define __NR_setdomainname 121
> -#define __NR_uname 122
> -#define __NR_adjtimex 124
> -#define __NR_mprotect 125
> -#define __NR_sigprocmask 126
> -#define __NR_create_module 127
> -#define __NR_init_module 128
> -#define __NR_delete_module 129
> -#define __NR_get_kernel_syms 130
> -#define __NR_quotactl 131
> -#define __NR_getpgid 132
> -#define __NR_fchdir 133
> -#define __NR_bdflush 134
> -#define __NR_sysfs 135
> -#define __NR_personality 136
> -#define __NR_afs_syscall 137
> -#define __NR_setfsuid 138
> -#define __NR_setfsgid 139
> -#define __NR__llseek 140
> -#define __NR_getdents 141
> -#define __NR__newselect 142
> -#define __NR_flock 143
> -#define __NR_msync 144
> -#define __NR_readv 145
> -#define __NR_writev 146
> -#define __NR_getsid 147
> -#define __NR_fdatasync 148
> -#define __NR__sysctl 149
> -#define __NR_mlock 150
> -#define __NR_munlock 151
> -#define __NR_mlockall 152
> -#define __NR_munlockall 153
> -#define __NR_sched_setparam 154
> -#define __NR_sched_getparam 155
> -#define __NR_sched_setscheduler 156
> -#define __NR_sched_getscheduler 157
> -#define __NR_sched_yield 158
> -#define __NR_sched_get_priority_max 159
> -#define __NR_sched_get_priority_min 160
> -#define __NR_sched_rr_get_interval 161
> -#define __NR_nanosleep 162
> -#define __NR_mremap 163
> -#define __NR_setresuid 164
> -#define __NR_getresuid 165
> -#define __NR_query_module 167
> -#define __NR_poll 168
> -#define __NR_nfsservctl 169
> -#define __NR_setresgid 170
> -#define __NR_getresgid 171
> -#define __NR_prctl 172
> -#define __NR_rt_sigreturn 173
> -#define __NR_rt_sigaction 174
> -#define __NR_rt_sigprocmask 175
> -#define __NR_rt_sigpending 176
> -#define __NR_rt_sigtimedwait 177
> -#define __NR_rt_sigqueueinfo 178
> -#define __NR_rt_sigsuspend 179
> -#define __NR_pread64 180
> -#define __NR_pwrite64 181
> -#define __NR_chown 182
> -#define __NR_getcwd 183
> -#define __NR_capget 184
> -#define __NR_capset 185
> -#define __NR_sigaltstack 186
> -#define __NR_sendfile 187
> -#define __NR_getpmsg 188
> -#define __NR_putpmsg 189
> -#define __NR_vfork 190
> -#define __NR_ugetrlimit 191
> -#define __NR_mmap2 192
> -#define __NR_truncate64 193
> -#define __NR_ftruncate64 194
> -#define __NR_stat64 195
> -#define __NR_lstat64 196
> -#define __NR_fstat64 197
> -#define __NR_lchown32 198
> -#define __NR_getuid32 199
> -#define __NR_getgid32 200
> -#define __NR_geteuid32 201
> -#define __NR_getegid32 202
> -#define __NR_setreuid32 203
> -#define __NR_setregid32 204
> -#define __NR_getgroups32 205
> -#define __NR_setgroups32 206
> -#define __NR_fchown32 207
> -#define __NR_setresuid32 208
> -#define __NR_getresuid32 209
> -#define __NR_setresgid32 210
> -#define __NR_getresgid32 211
> -#define __NR_chown32 212
> -#define __NR_setuid32 213
> -#define __NR_setgid32 214
> -#define __NR_setfsuid32 215
> -#define __NR_setfsgid32 216
> -#define __NR_pivot_root 217
> -#define __NR_mincore 218
> -#define __NR_madvise 219
> -#define __NR_getdents64 220
> -#define __NR_fcntl64 221
> -#define __NR_readahead 222
> -#define __NR_sendfile64 223
> -#define __NR_setxattr 224
> -#define __NR_lsetxattr 225
> -#define __NR_fsetxattr 226
> -#define __NR_getxattr 227
> -#define __NR_lgetxattr 228
> -#define __NR_fgetxattr 229
> -#define __NR_listxattr 230
> -#define __NR_llistxattr 231
> -#define __NR_flistxattr 232
> -#define __NR_removexattr 233
> -#define __NR_lremovexattr 234
> -#define __NR_fremovexattr 235
> -#define __NR_gettid 236
> -#define __NR_tkill 237
> -#define __NR_futex 238
> -#define __NR_sched_setaffinity 239
> -#define __NR_sched_getaffinity 240
> -#define __NR_tgkill 241
> -#define __NR_io_setup 243
> -#define __NR_io_destroy 244
> -#define __NR_io_getevents 245
> -#define __NR_io_submit 246
> -#define __NR_io_cancel 247
> -#define __NR_exit_group 248
> -#define __NR_epoll_create 249
> -#define __NR_epoll_ctl 250
> -#define __NR_epoll_wait 251
> -#define __NR_set_tid_address 252
> -#define __NR_fadvise64 253
> -#define __NR_timer_create 254
> -#define __NR_timer_settime 255
> -#define __NR_timer_gettime 256
> -#define __NR_timer_getoverrun 257
> -#define __NR_timer_delete 258
> -#define __NR_clock_settime 259
> -#define __NR_clock_gettime 260
> -#define __NR_clock_getres 261
> -#define __NR_clock_nanosleep 262
> -#define __NR_fadvise64_64 264
> -#define __NR_statfs64 265
> -#define __NR_fstatfs64 266
> -#define __NR_remap_file_pages 267
> -#define __NR_mbind 268
> -#define __NR_get_mempolicy 269
> -#define __NR_set_mempolicy 270
> -#define __NR_mq_open 271
> -#define __NR_mq_unlink 272
> -#define __NR_mq_timedsend 273
> -#define __NR_mq_timedreceive 274
> -#define __NR_mq_notify 275
> -#define __NR_mq_getsetattr 276
> -#define __NR_kexec_load 277
> -#define __NR_add_key 278
> -#define __NR_request_key 279
> -#define __NR_keyctl 280
> -#define __NR_waitid 281
> -#define __NR_ioprio_set 282
> -#define __NR_ioprio_get 283
> -#define __NR_inotify_init 284
> -#define __NR_inotify_add_watch 285
> -#define __NR_inotify_rm_watch 286
> -#define __NR_migrate_pages 287
> -#define __NR_openat 288
> -#define __NR_mkdirat 289
> -#define __NR_mknodat 290
> -#define __NR_fchownat 291
> -#define __NR_futimesat 292
> -#define __NR_fstatat64 293
> -#define __NR_unlinkat 294
> -#define __NR_renameat 295
> -#define __NR_linkat 296
> -#define __NR_symlinkat 297
> -#define __NR_readlinkat 298
> -#define __NR_fchmodat 299
> -#define __NR_faccessat 300
> -#define __NR_pselect6 301
> -#define __NR_ppoll 302
> -#define __NR_unshare 303
> -#define __NR_set_robust_list 304
> -#define __NR_get_robust_list 305
> -#define __NR_splice 306
> -#define __NR_sync_file_range 307
> -#define __NR_tee 308
> -#define __NR_vmsplice 309
> -#define __NR_move_pages 310
> -#define __NR_getcpu 311
> -#define __NR_epoll_pwait 312
> -#define __NR_utimes 313
> -#define __NR_fallocate 314
> -#define __NR_utimensat 315
> -#define __NR_signalfd 316
> -#define __NR_timerfd 317
> -#define __NR_eventfd 318
> -#define __NR_timerfd_create 319
> -#define __NR_timerfd_settime 320
> -#define __NR_timerfd_gettime 321
> -#define __NR_signalfd4 322
> -#define __NR_eventfd2 323
> -#define __NR_inotify_init1 324
> -#define __NR_pipe2 325
> -#define __NR_dup3 326
> -#define __NR_epoll_create1 327
> -#define __NR_preadv 328
> -#define __NR_pwritev 329
> -#define __NR_rt_tgsigqueueinfo 330
> -#define __NR_perf_event_open 331
> -#define __NR_fanotify_init 332
> -#define __NR_fanotify_mark 333
> -#define __NR_prlimit64 334
> -#define __NR_name_to_handle_at 335
> -#define __NR_open_by_handle_at 336
> -#define __NR_clock_adjtime 337
> -#define __NR_syncfs 338
> -#define __NR_setns 339
> -#define __NR_process_vm_readv 340
> -#define __NR_process_vm_writev 341
> -#define __NR_s390_runtime_instr 342
> -#define __NR_kcmp 343
> -#define __NR_finit_module 344
> -#define __NR_sched_setattr 345
> -#define __NR_sched_getattr 346
> -#define __NR_renameat2 347
> -#define __NR_seccomp 348
> -#define __NR_getrandom 349
> -#define __NR_memfd_create 350
> -#define __NR_bpf 351
> -#define __NR_s390_pci_mmio_write 352
> -#define __NR_s390_pci_mmio_read 353
> -#define __NR_execveat 354
> -#define __NR_userfaultfd 355
> -#define __NR_membarrier 356
> -#define __NR_recvmmsg 357
> -#define __NR_sendmmsg 358
> -#define __NR_socket 359
> -#define __NR_socketpair 360
> -#define __NR_bind 361
> -#define __NR_connect 362
> -#define __NR_listen 363
> -#define __NR_accept4 364
> -#define __NR_getsockopt 365
> -#define __NR_setsockopt 366
> -#define __NR_getsockname 367
> -#define __NR_getpeername 368
> -#define __NR_sendto 369
> -#define __NR_sendmsg 370
> -#define __NR_recvfrom 371
> -#define __NR_recvmsg 372
> -#define __NR_shutdown 373
> -#define __NR_mlock2 374
> -#define __NR_copy_file_range 375
> -#define __NR_preadv2 376
> -#define __NR_pwritev2 377
> -#define __NR_s390_guarded_storage 378
> -#define __NR_statx 379
> -#define __NR_s390_sthyi 380
> -#define __NR_kexec_file_load 381
> -#define __NR_io_pgetevents 382
> -#define __NR_rseq 383
> -#define __NR_pkey_mprotect 384
> -#define __NR_pkey_alloc 385
> -#define __NR_pkey_free 386
> -#define __NR_semget 393
> -#define __NR_semctl 394
> -#define __NR_shmget 395
> -#define __NR_shmctl 396
> -#define __NR_shmat 397
> -#define __NR_shmdt 398
> -#define __NR_msgget 399
> -#define __NR_msgsnd 400
> -#define __NR_msgrcv 401
> -#define __NR_msgctl 402
> -#define __NR_clock_gettime64 403
> -#define __NR_clock_settime64 404
> -#define __NR_clock_adjtime64 405
> -#define __NR_clock_getres_time64 406
> -#define __NR_clock_nanosleep_time64 407
> -#define __NR_timer_gettime64 408
> -#define __NR_timer_settime64 409
> -#define __NR_timerfd_gettime64 410
> -#define __NR_timerfd_settime64 411
> -#define __NR_utimensat_time64 412
> -#define __NR_pselect6_time64 413
> -#define __NR_ppoll_time64 414
> -#define __NR_io_pgetevents_time64 416
> -#define __NR_recvmmsg_time64 417
> -#define __NR_mq_timedsend_time64 418
> -#define __NR_mq_timedreceive_time64 419
> -#define __NR_semtimedop_time64 420
> -#define __NR_rt_sigtimedwait_time64 421
> -#define __NR_futex_time64 422
> -#define __NR_sched_rr_get_interval_time64 423
> -#define __NR_pidfd_send_signal 424
> -#define __NR_io_uring_setup 425
> -#define __NR_io_uring_enter 426
> -#define __NR_io_uring_register 427
> -#define __NR_open_tree 428
> -#define __NR_move_mount 429
> -#define __NR_fsopen 430
> -#define __NR_fsconfig 431
> -#define __NR_fsmount 432
> -#define __NR_fspick 433
> -#define __NR_pidfd_open 434
> -#define __NR_clone3 435
> -#define __NR_close_range 436
> -#define __NR_openat2 437
> -#define __NR_pidfd_getfd 438
> -#define __NR_faccessat2 439
> -#define __NR_process_madvise 440
> -#define __NR_epoll_pwait2 441
> -#define __NR_mount_setattr 442
> -#define __NR_quotactl_fd 443
> -#define __NR_landlock_create_ruleset 444
> -#define __NR_landlock_add_rule 445
> -#define __NR_landlock_restrict_self 446
> -#define __NR_memfd_secret 447
> -#define __NR_process_mrelease 448
> -#define __NR_futex_waitv 449
> -#define __NR_set_mempolicy_home_node 450
> -#define __NR_cachestat 451
> -#define __NR_fchmodat2 452
> -#define __NR_map_shadow_stack 453
> -#define __NR_futex_wake 454
> -#define __NR_futex_wait 455
> -#define __NR_futex_requeue 456
> -#define __NR_statmount 457
> -#define __NR_listmount 458
> -#define __NR_lsm_get_self_attr 459
> -#define __NR_lsm_set_self_attr 460
> -#define __NR_lsm_list_modules 461
> -#define __NR_mseal 462
> -#define __NR_setxattrat 463
> -#define __NR_getxattrat 464
> -#define __NR_listxattrat 465
> -#define __NR_removexattrat 466
> -#define __NR_open_tree_attr 467
> -#define __NR_file_getattr 468
> -#define __NR_file_setattr 469
> -
> -#endif /* _ASM_S390_UNISTD_32_H */
> diff --git a/linux-headers/asm-s390/unistd_64.h b/linux-headers/asm-s390/unistd_64.h
> index 8d9e579ef50d46cb27ff1f0694f74083e285c17c..01f674c1bcb7c06f1479034a73f1eba55823570d 100644
> --- a/linux-headers/asm-s390/unistd_64.h
> +++ b/linux-headers/asm-s390/unistd_64.h
> @@ -390,6 +390,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_64_H */
> diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h
> index b804fd25a2b861327c2be7a30f14b2dbb2df1944..01d46e29294f9c7cc1e615c4f35a3dc5c349d58c 100644
> --- a/linux-headers/asm-x86/kvm.h
> +++ b/linux-headers/asm-x86/kvm.h
> @@ -197,13 +197,13 @@ struct kvm_msrs {
> __u32 nmsrs; /* number of msrs in entries */
> __u32 pad;
>
> - struct kvm_msr_entry entries[];
> + __DECLARE_FLEX_ARRAY(struct kvm_msr_entry, entries);
> };
>
> /* for KVM_GET_MSR_INDEX_LIST */
> struct kvm_msr_list {
> __u32 nmsrs; /* number of msrs in entries */
> - __u32 indices[];
> + __DECLARE_FLEX_ARRAY(__u32, indices);
> };
>
> /* Maximum size of any access bitmap in bytes */
> @@ -243,7 +243,7 @@ struct kvm_cpuid_entry {
> struct kvm_cpuid {
> __u32 nent;
> __u32 padding;
> - struct kvm_cpuid_entry entries[];
> + __DECLARE_FLEX_ARRAY(struct kvm_cpuid_entry, entries);
> };
>
> struct kvm_cpuid_entry2 {
> @@ -265,7 +265,7 @@ struct kvm_cpuid_entry2 {
> struct kvm_cpuid2 {
> __u32 nent;
> __u32 padding;
> - struct kvm_cpuid_entry2 entries[];
> + __DECLARE_FLEX_ARRAY(struct kvm_cpuid_entry2, entries);
> };
>
> /* for KVM_GET_PIT and KVM_SET_PIT */
> @@ -396,7 +396,7 @@ struct kvm_xsave {
> * the contents of CPUID leaf 0xD on the host.
> */
> __u32 region[1024];
> - __u32 extra[];
> + __DECLARE_FLEX_ARRAY(__u32, extra);
> };
>
> #define KVM_MAX_XCRS 16
> @@ -474,6 +474,7 @@ struct kvm_sync_regs {
> #define KVM_X86_QUIRK_SLOT_ZAP_ALL (1 << 7)
> #define KVM_X86_QUIRK_STUFF_FEATURE_MSRS (1 << 8)
> #define KVM_X86_QUIRK_IGNORE_GUEST_PAT (1 << 9)
> +#define KVM_X86_QUIRK_VMCS12_ALLOW_FREEZE_IN_SMM (1 << 10)
>
> #define KVM_STATE_NESTED_FORMAT_VMX 0
> #define KVM_STATE_NESTED_FORMAT_SVM 1
> @@ -501,6 +502,7 @@ struct kvm_sync_regs {
> #define KVM_X86_GRP_SEV 1
> # define KVM_X86_SEV_VMSA_FEATURES 0
> # define KVM_X86_SNP_POLICY_BITS 1
> +# define KVM_X86_SEV_SNP_REQ_CERTS 2
>
> struct kvm_vmx_nested_state_data {
> __u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
> @@ -562,7 +564,7 @@ struct kvm_pmu_event_filter {
> __u32 fixed_counter_bitmap;
> __u32 flags;
> __u32 pad[4];
> - __u64 events[];
> + __DECLARE_FLEX_ARRAY(__u64, events);
> };
>
> #define KVM_PMU_EVENT_ALLOW 0
> @@ -741,6 +743,7 @@ enum sev_cmd_id {
> KVM_SEV_SNP_LAUNCH_START = 100,
> KVM_SEV_SNP_LAUNCH_UPDATE,
> KVM_SEV_SNP_LAUNCH_FINISH,
> + KVM_SEV_SNP_ENABLE_REQ_CERTS,
>
> KVM_SEV_NR_MAX,
> };
> @@ -912,8 +915,10 @@ struct kvm_sev_snp_launch_finish {
> __u64 pad1[4];
> };
>
> -#define KVM_X2APIC_API_USE_32BIT_IDS (1ULL << 0)
> -#define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK (1ULL << 1)
> +#define KVM_X2APIC_API_USE_32BIT_IDS _BITULL(0)
> +#define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK _BITULL(1)
> +#define KVM_X2APIC_ENABLE_SUPPRESS_EOI_BROADCAST _BITULL(2)
> +#define KVM_X2APIC_DISABLE_SUPPRESS_EOI_BROADCAST _BITULL(3)
>
> struct kvm_hyperv_eventfd {
> __u32 conn_id;
> diff --git a/linux-headers/asm-x86/unistd_32.h b/linux-headers/asm-x86/unistd_32.h
> index 34255aac64f020864107bdd72b017d51ce321a02..e94546882962f3eae6619cd46ddd7b5c007a22ef 100644
> --- a/linux-headers/asm-x86/unistd_32.h
> +++ b/linux-headers/asm-x86/unistd_32.h
> @@ -461,6 +461,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_32_H */
> diff --git a/linux-headers/asm-x86/unistd_64.h b/linux-headers/asm-x86/unistd_64.h
> index 07f242a5fa435cc1fead96e84328b0512a1c0645..3c49b00ed13cc21703aff4f0d60f10c81ba822e9 100644
> --- a/linux-headers/asm-x86/unistd_64.h
> +++ b/linux-headers/asm-x86/unistd_64.h
> @@ -385,6 +385,7 @@
> #define __NR_file_getattr 468
> #define __NR_file_setattr 469
> #define __NR_listns 470
> +#define __NR_rseq_slice_yield 471
>
>
> #endif /* _ASM_UNISTD_64_H */
> diff --git a/linux-headers/asm-x86/unistd_x32.h b/linux-headers/asm-x86/unistd_x32.h
> index 08fc9da2fab506d13713f0b56998004b269ba831..bd2af9ad088d8da3e8ee045743d3687289cf389d 100644
> --- a/linux-headers/asm-x86/unistd_x32.h
> +++ b/linux-headers/asm-x86/unistd_x32.h
> @@ -338,6 +338,7 @@
> #define __NR_file_getattr (__X32_SYSCALL_BIT + 468)
> #define __NR_file_setattr (__X32_SYSCALL_BIT + 469)
> #define __NR_listns (__X32_SYSCALL_BIT + 470)
> +#define __NR_rseq_slice_yield (__X32_SYSCALL_BIT + 471)
> #define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
> #define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
> #define __NR_ioctl (__X32_SYSCALL_BIT + 514)
> diff --git a/linux-headers/linux/const.h b/linux-headers/linux/const.h
> index 95ede2334204048d49b228284e9fbc1561337a16..c6a9d0c9835cae62a97209ca393ee2b8e930469f 100644
> --- a/linux-headers/linux/const.h
> +++ b/linux-headers/linux/const.h
> @@ -50,4 +50,22 @@
>
> #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
>
> +/*
> + * Divide positive or negative dividend by positive or negative divisor
> + * and round to closest integer. Result is undefined for negative
> + * divisors if the dividend variable type is unsigned and for negative
> + * dividends if the divisor variable type is unsigned.
> + */
> +#define __KERNEL_DIV_ROUND_CLOSEST(x, divisor) \
> +({ \
> + __typeof__(x) __x = x; \
> + __typeof__(divisor) __d = divisor; \
> + \
> + (((__typeof__(x))-1) > 0 || \
> + ((__typeof__(divisor))-1) > 0 || \
> + (((__x) > 0) == ((__d) > 0))) ? \
> + (((__x) + ((__d) / 2)) / (__d)) : \
> + (((__x) - ((__d) / 2)) / (__d)); \
> +})
> +
> #endif /* _LINUX_CONST_H */
> diff --git a/linux-headers/linux/iommufd.h b/linux-headers/linux/iommufd.h
> index 384183a40393cb5a5cde875fdfc60496eec5699e..82587c7d625a7fcd73998c16266559c5b767457d 100644
> --- a/linux-headers/linux/iommufd.h
> +++ b/linux-headers/linux/iommufd.h
> @@ -465,16 +465,27 @@ struct iommu_hwpt_arm_smmuv3 {
> __aligned_le64 ste[2];
> };
>
> +/**
> + * struct iommu_hwpt_amd_guest - AMD IOMMU guest I/O page table data
> + * (IOMMU_HWPT_DATA_AMD_GUEST)
> + * @dte: Guest Device Table Entry (DTE)
> + */
> +struct iommu_hwpt_amd_guest {
> + __aligned_u64 dte[4];
> +};
> +
> /**
> * enum iommu_hwpt_data_type - IOMMU HWPT Data Type
> * @IOMMU_HWPT_DATA_NONE: no data
> * @IOMMU_HWPT_DATA_VTD_S1: Intel VT-d stage-1 page table
> * @IOMMU_HWPT_DATA_ARM_SMMUV3: ARM SMMUv3 Context Descriptor Table
> + * @IOMMU_HWPT_DATA_AMD_GUEST: AMD IOMMU guest page table
> */
> enum iommu_hwpt_data_type {
> IOMMU_HWPT_DATA_NONE = 0,
> IOMMU_HWPT_DATA_VTD_S1 = 1,
> IOMMU_HWPT_DATA_ARM_SMMUV3 = 2,
> + IOMMU_HWPT_DATA_AMD_GUEST = 3,
> };
>
> /**
> @@ -623,6 +634,32 @@ struct iommu_hw_info_tegra241_cmdqv {
> __u8 __reserved;
> };
>
> +/**
> + * struct iommu_hw_info_amd - AMD IOMMU device info
> + *
> + * @efr : Value of AMD IOMMU Extended Feature Register (EFR)
> + * @efr2: Value of AMD IOMMU Extended Feature 2 Register (EFR2)
> + *
> + * Please See description of these registers in the following sections of
> + * the AMD I/O Virtualization Technology (IOMMU) Specification.
> + * (https://docs.amd.com/v/u/en-US/48882_3.10_PUB)
> + *
> + * - MMIO Offset 0030h IOMMU Extended Feature Register
> + * - MMIO Offset 01A0h IOMMU Extended Feature 2 Register
> + *
> + * Note: The EFR and EFR2 are raw values reported by hardware.
> + * VMM is responsible to determine the appropriate flags to be exposed to
> + * the VM since cetertain features are not currently supported by the kernel
> + * for HW-vIOMMU.
> + *
> + * Current VMM-allowed list of feature flags are:
> + * - EFR[GTSup, GASup, GioSup, PPRSup, EPHSup, GATS, GLX, PASmax]
> + */
> +struct iommu_hw_info_amd {
> + __aligned_u64 efr;
> + __aligned_u64 efr2;
> +};
> +
> /**
> * enum iommu_hw_info_type - IOMMU Hardware Info Types
> * @IOMMU_HW_INFO_TYPE_NONE: Output by the drivers that do not report hardware
> @@ -632,6 +669,7 @@ struct iommu_hw_info_tegra241_cmdqv {
> * @IOMMU_HW_INFO_TYPE_ARM_SMMUV3: ARM SMMUv3 iommu info type
> * @IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV: NVIDIA Tegra241 CMDQV (extension for ARM
> * SMMUv3) info type
> + * @IOMMU_HW_INFO_TYPE_AMD: AMD IOMMU info type
> */
> enum iommu_hw_info_type {
> IOMMU_HW_INFO_TYPE_NONE = 0,
> @@ -639,6 +677,7 @@ enum iommu_hw_info_type {
> IOMMU_HW_INFO_TYPE_INTEL_VTD = 1,
> IOMMU_HW_INFO_TYPE_ARM_SMMUV3 = 2,
> IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV = 3,
> + IOMMU_HW_INFO_TYPE_AMD = 4,
> };
>
> /**
> @@ -656,11 +695,15 @@ enum iommu_hw_info_type {
> * @IOMMU_HW_CAP_PCI_PASID_PRIV: Privileged Mode Supported, user ignores it
> * when the struct
> * iommu_hw_info::out_max_pasid_log2 is zero.
> + * @IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED: ATS is not supported or cannot be used
> + * on this device (absence implies ATS
> + * may be enabled)
> */
> enum iommufd_hw_capabilities {
> IOMMU_HW_CAP_DIRTY_TRACKING = 1 << 0,
> IOMMU_HW_CAP_PCI_PASID_EXEC = 1 << 1,
> IOMMU_HW_CAP_PCI_PASID_PRIV = 1 << 2,
> + IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED = 1 << 3,
> };
>
> /**
> @@ -1013,6 +1056,11 @@ struct iommu_fault_alloc {
> enum iommu_viommu_type {
> IOMMU_VIOMMU_TYPE_DEFAULT = 0,
> IOMMU_VIOMMU_TYPE_ARM_SMMUV3 = 1,
> + /*
> + * TEGRA241_CMDQV requirements (otherwise, VCMDQs will not work)
> + * - Kernel will allocate a VINTF (HYP_OWN=0) to back this VIOMMU. So,
> + * VMM must wire the HYP_OWN bit to 0 in guest VINTF_CONFIG register
> + */
> IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV = 2,
> };
>
> diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
> index a4ab42dcba977797f20fad2375ab7e428f873f5e..50e87ed72c202417f47611f83ba464f2b89356d1 100644
> --- a/linux-headers/linux/kvm.h
> +++ b/linux-headers/linux/kvm.h
> @@ -11,9 +11,11 @@
> #include <linux/const.h>
> #include <linux/types.h>
>
> +#include <linux/stddef.h>
> #include <linux/ioctl.h>
> #include <asm/kvm.h>
>
> +
> #define KVM_API_VERSION 12
>
> /*
> @@ -135,6 +137,12 @@ struct kvm_xen_exit {
> } u;
> };
>
> +struct kvm_exit_snp_req_certs {
> + __u64 gpa;
> + __u64 npages;
> + __u64 ret;
> +};
> +
> #define KVM_S390_GET_SKEYS_NONE 1
> #define KVM_S390_SKEYS_MAX 1048576
>
> @@ -180,6 +188,8 @@ struct kvm_xen_exit {
> #define KVM_EXIT_MEMORY_FAULT 39
> #define KVM_EXIT_TDX 40
> #define KVM_EXIT_ARM_SEA 41
> +#define KVM_EXIT_ARM_LDST64B 42
> +#define KVM_EXIT_SNP_REQ_CERTS 43
>
> /* For KVM_EXIT_INTERNAL_ERROR */
> /* Emulate instruction failed. */
> @@ -394,7 +404,7 @@ struct kvm_run {
> } eoi;
> /* KVM_EXIT_HYPERV */
> struct kvm_hyperv_exit hyperv;
> - /* KVM_EXIT_ARM_NISV */
> + /* KVM_EXIT_ARM_NISV / KVM_EXIT_ARM_LDST64B */
> struct {
> __u64 esr_iss;
> __u64 fault_ipa;
> @@ -474,6 +484,8 @@ struct kvm_run {
> __u64 gva;
> __u64 gpa;
> } arm_sea;
> + /* KVM_EXIT_SNP_REQ_CERTS */
> + struct kvm_exit_snp_req_certs snp_req_certs;
> /* Fix the size of the union. */
> char padding[256];
> };
> @@ -520,7 +532,7 @@ struct kvm_coalesced_mmio {
>
> struct kvm_coalesced_mmio_ring {
> __u32 first, last;
> - struct kvm_coalesced_mmio coalesced_mmio[];
> + __DECLARE_FLEX_ARRAY(struct kvm_coalesced_mmio, coalesced_mmio);
> };
>
> #define KVM_COALESCED_MMIO_MAX \
> @@ -570,7 +582,7 @@ struct kvm_clear_dirty_log {
> /* for KVM_SET_SIGNAL_MASK */
> struct kvm_signal_mask {
> __u32 len;
> - __u8 sigset[];
> + __DECLARE_FLEX_ARRAY(__u8, sigset);
> };
>
> /* for KVM_TPR_ACCESS_REPORTING */
> @@ -681,6 +693,11 @@ struct kvm_enable_cap {
> #define KVM_VM_TYPE_ARM_IPA_SIZE_MASK 0xffULL
> #define KVM_VM_TYPE_ARM_IPA_SIZE(x) \
> ((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
> +
> +#define KVM_VM_TYPE_ARM_PROTECTED (1UL << 31)
> +#define KVM_VM_TYPE_ARM_MASK (KVM_VM_TYPE_ARM_IPA_SIZE_MASK | \
> + KVM_VM_TYPE_ARM_PROTECTED)
> +
> /*
> * ioctls for /dev/kvm fds:
> */
> @@ -966,6 +983,8 @@ struct kvm_enable_cap {
> #define KVM_CAP_GUEST_MEMFD_FLAGS 244
> #define KVM_CAP_ARM_SEA_TO_USER 245
> #define KVM_CAP_S390_USER_OPEREXEC 246
> +#define KVM_CAP_S390_KEYOP 247
> +#define KVM_CAP_S390_VSIE_ESAMODE 248
>
> struct kvm_irq_routing_irqchip {
> __u32 irqchip;
> @@ -1028,7 +1047,7 @@ struct kvm_irq_routing_entry {
> struct kvm_irq_routing {
> __u32 nr;
> __u32 flags;
> - struct kvm_irq_routing_entry entries[];
> + __DECLARE_FLEX_ARRAY(struct kvm_irq_routing_entry, entries);
> };
>
> #define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
> @@ -1119,7 +1138,7 @@ struct kvm_dirty_tlb {
>
> struct kvm_reg_list {
> __u64 n; /* number of regs */
> - __u64 reg[];
> + __DECLARE_FLEX_ARRAY(__u64, reg);
> };
>
> struct kvm_one_reg {
> @@ -1201,6 +1220,10 @@ enum kvm_device_type {
> #define KVM_DEV_TYPE_LOONGARCH_EIOINTC KVM_DEV_TYPE_LOONGARCH_EIOINTC
> KVM_DEV_TYPE_LOONGARCH_PCHPIC,
> #define KVM_DEV_TYPE_LOONGARCH_PCHPIC KVM_DEV_TYPE_LOONGARCH_PCHPIC
> + KVM_DEV_TYPE_LOONGARCH_DMSINTC,
> +#define KVM_DEV_TYPE_LOONGARCH_DMSINTC KVM_DEV_TYPE_LOONGARCH_DMSINTC
> + KVM_DEV_TYPE_ARM_VGIC_V5,
> +#define KVM_DEV_TYPE_ARM_VGIC_V5 KVM_DEV_TYPE_ARM_VGIC_V5
>
> KVM_DEV_TYPE_MAX,
>
> @@ -1211,6 +1234,16 @@ struct kvm_vfio_spapr_tce {
> __s32 tablefd;
> };
>
> +#define KVM_S390_KEYOP_ISKE 0x01
> +#define KVM_S390_KEYOP_RRBE 0x02
> +#define KVM_S390_KEYOP_SSKE 0x03
> +struct kvm_s390_keyop {
> + __u64 guest_addr;
> + __u8 key;
> + __u8 operation;
> + __u8 pad[6];
> +};
> +
> /*
> * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
> * a vcpu fd.
> @@ -1230,6 +1263,7 @@ struct kvm_vfio_spapr_tce {
> #define KVM_S390_UCAS_MAP _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
> #define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
> #define KVM_S390_VCPU_FAULT _IOW(KVMIO, 0x52, unsigned long)
> +#define KVM_S390_KEYOP _IOWR(KVMIO, 0x53, struct kvm_s390_keyop)
>
> /* Device model IOC */
> #define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
> @@ -1571,7 +1605,7 @@ struct kvm_stats_desc {
> __u16 size;
> __u32 offset;
> __u32 bucket_size;
> - char name[];
> + __DECLARE_FLEX_ARRAY(char, name);
> };
>
> #define KVM_GET_STATS_FD _IO(KVMIO, 0xce)
> diff --git a/linux-headers/linux/mshv.h b/linux-headers/linux/mshv.h
> index acceeddc1c9f14768e84b9426ae00a3303584932..6c7d3a93162cc3181c3989c28fe9f75e2ca5cc55 100644
> --- a/linux-headers/linux/mshv.h
> +++ b/linux-headers/linux/mshv.h
> @@ -27,6 +27,8 @@ enum {
> MSHV_PT_BIT_X2APIC,
> MSHV_PT_BIT_GPA_SUPER_PAGES,
> MSHV_PT_BIT_CPU_AND_XSAVE_FEATURES,
> + MSHV_PT_BIT_NESTED_VIRTUALIZATION,
> + MSHV_PT_BIT_SMT_ENABLED_GUEST,
> MSHV_PT_BIT_COUNT,
> };
>
> @@ -355,7 +357,7 @@ struct mshv_vtl_sint_post_msg {
>
> struct mshv_vtl_ram_disposition {
> __u64 start_pfn;
> - __u64 last_pfn;
> + __u64 last_pfn; /* last_pfn is excluded from the range [start_pfn, last_pfn) */
> };
>
> struct mshv_vtl_set_poll_file {
> diff --git a/linux-headers/linux/psp-sev.h b/linux-headers/linux/psp-sev.h
> index 9479928a4ad68afc56d0e347a3ba2b742e94ef1d..7df50022592a3f19f859faabd6e1566e95b84629 100644
> --- a/linux-headers/linux/psp-sev.h
> +++ b/linux-headers/linux/psp-sev.h
> @@ -277,7 +277,7 @@ struct sev_user_data_snp_wrapped_vlek_hashstick {
> * struct sev_issue_cmd - SEV ioctl parameters
> *
> * @cmd: SEV commands to execute
> - * @opaque: pointer to the command structure
> + * @data: pointer to the command structure
> * @error: SEV FW return code on failure
> */
> struct sev_issue_cmd {
> diff --git a/linux-headers/linux/stddef.h b/linux-headers/linux/stddef.h
> index 48ee4438e0ef053680c64af21553e8180ce5fdee..457498259494646e52c8c8a8acf20d542ad97e29 100644
> --- a/linux-headers/linux/stddef.h
> +++ b/linux-headers/linux/stddef.h
> @@ -69,6 +69,10 @@
> #define __counted_by_be(m)
> #endif
>
> +#ifndef __counted_by_ptr
> +#define __counted_by_ptr(m)
> +#endif
> +
> #define __kernel_nonstring
>
> #endif /* _LINUX_STDDEF_H */
> diff --git a/linux-headers/linux/vduse.h b/linux-headers/linux/vduse.h
> index da6ac89af18e3e60a7eb4180ec1b5471fd2c1c62..e19b3c0f51b5b4fccac4babf4203c93cebe5715f 100644
> --- a/linux-headers/linux/vduse.h
> +++ b/linux-headers/linux/vduse.h
> @@ -10,6 +10,10 @@
>
> #define VDUSE_API_VERSION 0
>
> +/* VQ groups and ASID support */
> +
> +#define VDUSE_API_VERSION_1 1
> +
> /*
> * Get the version of VDUSE API that kernel supported (VDUSE_API_VERSION).
> * This is used for future extension.
> @@ -27,6 +31,8 @@
> * @features: virtio features
> * @vq_num: the number of virtqueues
> * @vq_align: the allocation alignment of virtqueue's metadata
> + * @ngroups: number of vq groups that VDUSE device declares
> + * @nas: number of address spaces that VDUSE device declares
> * @reserved: for future use, needs to be initialized to zero
> * @config_size: the size of the configuration space
> * @config: the buffer of the configuration space
> @@ -41,7 +47,9 @@ struct vduse_dev_config {
> __u64 features;
> __u32 vq_num;
> __u32 vq_align;
> - __u32 reserved[13];
> + __u32 ngroups; /* if VDUSE_API_VERSION >= 1 */
> + __u32 nas; /* if VDUSE_API_VERSION >= 1 */
> + __u32 reserved[11];
> __u32 config_size;
> __u8 config[];
> };
> @@ -118,14 +126,18 @@ struct vduse_config_data {
> * struct vduse_vq_config - basic configuration of a virtqueue
> * @index: virtqueue index
> * @max_size: the max size of virtqueue
> - * @reserved: for future use, needs to be initialized to zero
> + * @reserved1: for future use, needs to be initialized to zero
> + * @group: virtqueue group
> + * @reserved2: for future use, needs to be initialized to zero
> *
> * Structure used by VDUSE_VQ_SETUP ioctl to setup a virtqueue.
> */
> struct vduse_vq_config {
> __u32 index;
> __u16 max_size;
> - __u16 reserved[13];
> + __u16 reserved1;
> + __u32 group;
> + __u16 reserved2[10];
> };
>
> /*
> @@ -156,6 +168,16 @@ struct vduse_vq_state_packed {
> __u16 last_used_idx;
> };
>
> +/**
> + * struct vduse_vq_group_asid - virtqueue group ASID
> + * @group: Index of the virtqueue group
> + * @asid: Address space ID of the group
> + */
> +struct vduse_vq_group_asid {
> + __u32 group;
> + __u32 asid;
> +};
> +
> /**
> * struct vduse_vq_info - information of a virtqueue
> * @index: virtqueue index
> @@ -215,6 +237,7 @@ struct vduse_vq_eventfd {
> * @uaddr: start address of userspace memory, it must be aligned to page size
> * @iova: start of the IOVA region
> * @size: size of the IOVA region
> + * @asid: Address space ID of the IOVA region
> * @reserved: for future use, needs to be initialized to zero
> *
> * Structure used by VDUSE_IOTLB_REG_UMEM and VDUSE_IOTLB_DEREG_UMEM
> @@ -224,7 +247,8 @@ struct vduse_iova_umem {
> __u64 uaddr;
> __u64 iova;
> __u64 size;
> - __u64 reserved[3];
> + __u32 asid;
> + __u32 reserved[5];
> };
>
> /* Register userspace memory for IOVA regions */
> @@ -238,6 +262,7 @@ struct vduse_iova_umem {
> * @start: start of the IOVA region
> * @last: last of the IOVA region
> * @capability: capability of the IOVA region
> + * @asid: Address space ID of the IOVA region, only if device API version >= 1
> * @reserved: for future use, needs to be initialized to zero
> *
> * Structure used by VDUSE_IOTLB_GET_INFO ioctl to get information of
> @@ -248,7 +273,8 @@ struct vduse_iova_info {
> __u64 last;
> #define VDUSE_IOVA_CAP_UMEM (1 << 0)
> __u64 capability;
> - __u64 reserved[3];
> + __u32 asid; /* Only if device API version >= 1 */
> + __u32 reserved[5];
> };
>
> /*
> @@ -257,6 +283,32 @@ struct vduse_iova_info {
> */
> #define VDUSE_IOTLB_GET_INFO _IOWR(VDUSE_BASE, 0x1a, struct vduse_iova_info)
>
> +/**
> + * struct vduse_iotlb_entry_v2 - entry of IOTLB to describe one IOVA region
> + *
> + * @v1: the original vduse_iotlb_entry
> + * @asid: address space ID of the IOVA region
> + * @reserved: for future use, needs to be initialized to zero
> + *
> + * Structure used by VDUSE_IOTLB_GET_FD2 ioctl to find an overlapped IOVA region.
> + */
> +struct vduse_iotlb_entry_v2 {
> + __u64 offset;
> + __u64 start;
> + __u64 last;
> + __u8 perm;
> + __u8 padding[7];
> + __u32 asid;
> + __u32 reserved[11];
> +};
> +
> +/*
> + * Same as VDUSE_IOTLB_GET_FD but with vduse_iotlb_entry_v2 argument that
> + * support extra fields.
> + */
> +#define VDUSE_IOTLB_GET_FD2 _IOWR(VDUSE_BASE, 0x1b, struct vduse_iotlb_entry_v2)
> +
> +
> /* The control messages definition for read(2)/write(2) on /dev/vduse/$NAME */
>
> /**
> @@ -265,11 +317,14 @@ struct vduse_iova_info {
> * @VDUSE_SET_STATUS: set the device status
> * @VDUSE_UPDATE_IOTLB: Notify userspace to update the memory mapping for
> * specified IOVA range via VDUSE_IOTLB_GET_FD ioctl
> + * @VDUSE_SET_VQ_GROUP_ASID: Notify userspace to update the address space of a
> + * virtqueue group.
> */
> enum vduse_req_type {
> VDUSE_GET_VQ_STATE,
> VDUSE_SET_STATUS,
> VDUSE_UPDATE_IOTLB,
> + VDUSE_SET_VQ_GROUP_ASID,
> };
>
> /**
> @@ -304,6 +359,19 @@ struct vduse_iova_range {
> __u64 last;
> };
>
> +/**
> + * struct vduse_iova_range_v2 - IOVA range [start, last] if API_VERSION >= 1
> + * @start: start of the IOVA range
> + * @last: last of the IOVA range
> + * @asid: address space ID of the IOVA range
> + */
> +struct vduse_iova_range_v2 {
> + __u64 start;
> + __u64 last;
> + __u32 asid;
> + __u32 padding;
> +};
> +
> /**
> * struct vduse_dev_request - control request
> * @type: request type
> @@ -312,6 +380,8 @@ struct vduse_iova_range {
> * @vq_state: virtqueue state, only index field is available
> * @s: device status
> * @iova: IOVA range for updating
> + * @iova_v2: IOVA range for updating if API_VERSION >= 1
> + * @vq_group_asid: ASID of a virtqueue group
> * @padding: padding
> *
> * Structure used by read(2) on /dev/vduse/$NAME.
> @@ -324,6 +394,11 @@ struct vduse_dev_request {
> struct vduse_vq_state vq_state;
> struct vduse_dev_status s;
> struct vduse_iova_range iova;
> + /* Following members but padding exist only if vduse api
> + * version >= 1
> + */
> + struct vduse_iova_range_v2 iova_v2;
> + struct vduse_vq_group_asid vq_group_asid;
> __u32 padding[32];
> };
> };
> diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
> index 720edfee7af6adcba70361b94278024b860a1547..f3282b8e8650d68ccb164004fc45d493bf504a97 100644
> --- a/linux-headers/linux/vfio.h
> +++ b/linux-headers/linux/vfio.h
> @@ -141,7 +141,7 @@ struct vfio_info_cap_header {
> *
> * Retrieve information about the group. Fills in provided
> * struct vfio_group_info. Caller sets argsz.
> - * Return: 0 on succes, -errno on failure.
> + * Return: 0 on success, -errno on failure.
> * Availability: Always
> */
> struct vfio_group_status {
> @@ -964,6 +964,10 @@ struct vfio_device_bind_iommufd {
> * hwpt corresponding to the given pt_id.
> *
> * Return: 0 on success, -errno on failure.
> + *
> + * When a device is resetting, -EBUSY will be returned to reject any concurrent
> + * attachment to the resetting device itself or any sibling device in the IOMMU
> + * group having the resetting device.
> */
> struct vfio_device_attach_iommufd_pt {
> __u32 argsz;
> @@ -1262,6 +1266,19 @@ enum vfio_device_mig_state {
> * The initial_bytes field indicates the amount of initial precopy
> * data available from the device. This field should have a non-zero initial
> * value and decrease as migration data is read from the device.
> + * The presence of the VFIO_PRECOPY_INFO_REINIT output flag indicates
> + * that new initial data is present on the stream.
> + * The new initial data may result, for example, from device reconfiguration
> + * during migration that requires additional initialization data.
> + * In that case initial_bytes may report a non-zero value irrespective of
> + * any previously reported values, which progresses towards zero as precopy
> + * data is read from the data stream. dirty_bytes is also reset
> + * to zero and represents the state change of the device relative to the new
> + * initial_bytes.
> + * VFIO_PRECOPY_INFO_REINIT can be reported only after userspace opts in to
> + * VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2. Without this opt-in, the flags field
> + * of struct vfio_precopy_info is reserved for bug-compatibility reasons.
> + *
> * It is recommended to leave PRE_COPY for STOP_COPY only after this field
> * reaches zero. Leaving PRE_COPY earlier might make things slower.
> *
> @@ -1297,6 +1314,7 @@ enum vfio_device_mig_state {
> struct vfio_precopy_info {
> __u32 argsz;
> __u32 flags;
> +#define VFIO_PRECOPY_INFO_REINIT (1 << 0) /* output - new initial data is present */
> __aligned_u64 initial_bytes;
> __aligned_u64 dirty_bytes;
> };
> @@ -1506,6 +1524,16 @@ struct vfio_device_feature_dma_buf {
> struct vfio_region_dma_range dma_ranges[] __counted_by(nr_ranges);
> };
>
> +/*
> + * Enables the migration precopy_info_v2 behaviour.
> + *
> + * VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2.
> + *
> + * On SET, enables the v2 pre_copy_info behaviour, where the
> + * vfio_precopy_info.flags is a valid output field.
> + */
> +#define VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2 12
> +
> /* -------- API for Type1 VFIO IOMMU -------- */
>
> /**
© 2016 - 2026 Red Hat, Inc.