Drivers: hv: VMBus protocol version 6.0

The confidential VMBus is supported starting from the protocol
version 6.0 onwards.

Provide the required definitions. No functional changes.

Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
Reviewed-by: Alok Tiwari <alok.a.tiwari@oracle.com>
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
master
Roman Kisel 2025-10-08 16:34:04 -07:00 committed by Wei Liu
parent 92c7053b44
commit 6802d8af47
4 changed files with 65 additions and 19 deletions

View File

@ -333,6 +333,8 @@ extern const struct vmbus_channel_message_table_entry
/* General vmbus interface */
bool vmbus_is_confidential(void);
struct hv_device *vmbus_device_create(const guid_t *type,
const guid_t *instance,
struct vmbus_channel *channel);

View File

@ -56,6 +56,18 @@ static long __percpu *vmbus_evt;
int vmbus_irq;
int vmbus_interrupt;
/*
* If the Confidential VMBus is used, the data on the "wire" is not
* visible to either the host or the hypervisor.
*/
static bool is_confidential;
bool vmbus_is_confidential(void)
{
return is_confidential;
}
EXPORT_SYMBOL_GPL(vmbus_is_confidential);
/*
* The panic notifier below is responsible solely for unloading the
* vmbus connection, which is necessary in a panic event.

View File

@ -260,6 +260,7 @@ union hv_hypervisor_version_info {
#define HYPERV_CPUID_VIRT_STACK_PROPERTIES 0x40000082
/* Support for the extended IOAPIC RTE format */
#define HYPERV_VS_PROPERTIES_EAX_EXTENDED_IOAPIC_RTE BIT(2)
#define HYPERV_VS_PROPERTIES_EAX_CONFIDENTIAL_VMBUS_AVAILABLE BIT(3)
#define HYPERV_HYPERVISOR_PRESENT_BIT 0x80000000
#define HYPERV_CPUID_MIN 0x40000005

View File

@ -265,16 +265,18 @@ static inline u32 hv_get_avail_to_write_percent(
* Linux kernel.
*/
#define VERSION_WS2008 ((0 << 16) | (13))
#define VERSION_WIN7 ((1 << 16) | (1))
#define VERSION_WIN8 ((2 << 16) | (4))
#define VERSION_WIN8_1 ((3 << 16) | (0))
#define VERSION_WIN10 ((4 << 16) | (0))
#define VERSION_WIN10_V4_1 ((4 << 16) | (1))
#define VERSION_WIN10_V5 ((5 << 16) | (0))
#define VERSION_WIN10_V5_1 ((5 << 16) | (1))
#define VERSION_WIN10_V5_2 ((5 << 16) | (2))
#define VERSION_WIN10_V5_3 ((5 << 16) | (3))
#define VMBUS_MAKE_VERSION(MAJ, MIN) ((((u32)MAJ) << 16) | (MIN))
#define VERSION_WS2008 VMBUS_MAKE_VERSION(0, 13)
#define VERSION_WIN7 VMBUS_MAKE_VERSION(1, 1)
#define VERSION_WIN8 VMBUS_MAKE_VERSION(2, 4)
#define VERSION_WIN8_1 VMBUS_MAKE_VERSION(3, 0)
#define VERSION_WIN10 VMBUS_MAKE_VERSION(4, 0)
#define VERSION_WIN10_V4_1 VMBUS_MAKE_VERSION(4, 1)
#define VERSION_WIN10_V5 VMBUS_MAKE_VERSION(5, 0)
#define VERSION_WIN10_V5_1 VMBUS_MAKE_VERSION(5, 1)
#define VERSION_WIN10_V5_2 VMBUS_MAKE_VERSION(5, 2)
#define VERSION_WIN10_V5_3 VMBUS_MAKE_VERSION(5, 3)
#define VERSION_WIN10_V6_0 VMBUS_MAKE_VERSION(6, 0)
/* Make maximum size of pipe payload of 16K */
#define MAX_PIPE_DATA_PAYLOAD (sizeof(u8) * 16384)
@ -335,14 +337,22 @@ struct vmbus_channel_offer {
} __packed;
/* Server Flags */
#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 1
#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 2
#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 4
#define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10
#define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100
#define VMBUS_CHANNEL_PARENT_OFFER 0x200
#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400
#define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000
#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 0x0001
/*
* This flag indicates that the channel is offered by the paravisor, and must
* use encrypted memory for the channel ring buffer.
*/
#define VMBUS_CHANNEL_CONFIDENTIAL_RING_BUFFER 0x0002
/*
* This flag indicates that the channel is offered by the paravisor, and must
* use encrypted memory for GPA direct packets and additional GPADLs.
*/
#define VMBUS_CHANNEL_CONFIDENTIAL_EXTERNAL_MEMORY 0x0004
#define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x0010
#define VMBUS_CHANNEL_LOOPBACK_OFFER 0x0100
#define VMBUS_CHANNEL_PARENT_OFFER 0x0200
#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x0400
#define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000
struct vmpacket_descriptor {
u16 type;
@ -621,6 +631,12 @@ struct vmbus_channel_relid_released {
u32 child_relid;
} __packed;
/*
* Used by the paravisor only, means that the encrypted ring buffers and
* the encrypted external memory are supported
*/
#define VMBUS_FEATURE_FLAG_CONFIDENTIAL_CHANNELS 0x10
struct vmbus_channel_initiate_contact {
struct vmbus_channel_message_header header;
u32 vmbus_version_requested;
@ -630,7 +646,8 @@ struct vmbus_channel_initiate_contact {
struct {
u8 msg_sint;
u8 msg_vtl;
u8 reserved[6];
u8 reserved[2];
u32 feature_flags; /* VMBus version 6.0 */
};
};
u64 monitor_page1;
@ -1003,6 +1020,10 @@ struct vmbus_channel {
/* boolean to control visibility of sysfs for ring buffer */
bool ring_sysfs_visible;
/* The ring buffer is encrypted */
bool co_ring_buffer;
/* The external memory is encrypted */
bool co_external_memory;
};
#define lock_requestor(channel, flags) \
@ -1027,6 +1048,16 @@ u64 vmbus_request_addr_match(struct vmbus_channel *channel, u64 trans_id,
u64 rqst_addr);
u64 vmbus_request_addr(struct vmbus_channel *channel, u64 trans_id);
static inline bool is_co_ring_buffer(const struct vmbus_channel_offer_channel *o)
{
return !!(o->offer.chn_flags & VMBUS_CHANNEL_CONFIDENTIAL_RING_BUFFER);
}
static inline bool is_co_external_memory(const struct vmbus_channel_offer_channel *o)
{
return !!(o->offer.chn_flags & VMBUS_CHANNEL_CONFIDENTIAL_EXTERNAL_MEMORY);
}
static inline bool is_hvsock_offer(const struct vmbus_channel_offer_channel *o)
{
return !!(o->offer.chn_flags & VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER);