From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrey Smetanin Subject: Re: [PATCH v1 2/7] drivers/hv: Move struct hv_message into UAPI Hyper-V x86 header Date: Fri, 27 Nov 2015 14:21:58 +0300 Message-ID: <56583CD6.8030001@virtuozzo.com> References: <1448464821-8199-1-git-send-email-asmetanin@virtuozzo.com> <1448464821-8199-3-git-send-email-asmetanin@virtuozzo.com> <565823BB.7060904@redhat.com> Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Cc: Gleb Natapov , "K. Y. Srinivasan" , Haiyang Zhang , Vitaly Kuznetsov , Roman Kagan , "Denis V. Lunev" , To: Paolo Bonzini , Return-path: Received: from relay.parallels.com ([195.214.232.42]:46242 "EHLO relay.parallels.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753890AbbK0LW2 (ORCPT ); Fri, 27 Nov 2015 06:22:28 -0500 In-Reply-To: <565823BB.7060904@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 11/27/2015 12:34 PM, Paolo Bonzini wrote: > > > On 25/11/2015 16:20, Andrey Smetanin wrote: >> This struct is required for Hyper-V SynIC timers implementation inside KVM >> and for upcoming Hyper-V VMBus support by userspace(QEMU). So place it into >> Hyper-V UAPI header. >> >> Signed-off-by: Andrey Smetanin >> Reviewed-by: Roman Kagan >> CC: Gleb Natapov >> CC: Paolo Bonzini >> CC: "K. Y. Srinivasan" >> CC: Haiyang Zhang >> CC: Vitaly Kuznetsov >> CC: Roman Kagan >> CC: Denis V. Lunev >> CC: qemu-devel@nongnu.org >> --- >> arch/x86/include/uapi/asm/hyperv.h | 91 ++++++++++++++++++++++++++++++++++++++ >> drivers/hv/hyperv_vmbus.h | 91 -------------------------------------- >> 2 files changed, 91 insertions(+), 91 deletions(-) >> >> diff --git a/arch/x86/include/uapi/asm/hyperv.h b/arch/x86/include/uapi/asm/hyperv.h >> index 07981f0..e86d77e 100644 >> --- a/arch/x86/include/uapi/asm/hyperv.h >> +++ b/arch/x86/include/uapi/asm/hyperv.h >> @@ -271,4 +271,95 @@ typedef struct _HV_REFERENCE_TSC_PAGE { >> >> #define HV_SYNIC_STIMER_COUNT (4) >> >> +/* Define synthetic interrupt controller message constants. */ >> +#define HV_MESSAGE_SIZE (256) >> +#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240) >> +#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30) >> + >> +/* Define hypervisor message types. */ >> +enum hv_message_type { >> + HVMSG_NONE = 0x00000000, >> + >> + /* Memory access messages. */ >> + HVMSG_UNMAPPED_GPA = 0x80000000, >> + HVMSG_GPA_INTERCEPT = 0x80000001, >> + >> + /* Timer notification messages. */ >> + HVMSG_TIMER_EXPIRED = 0x80000010, >> + >> + /* Error messages. */ >> + HVMSG_INVALID_VP_REGISTER_VALUE = 0x80000020, >> + HVMSG_UNRECOVERABLE_EXCEPTION = 0x80000021, >> + HVMSG_UNSUPPORTED_FEATURE = 0x80000022, >> + >> + /* Trace buffer complete messages. */ >> + HVMSG_EVENTLOG_BUFFERCOMPLETE = 0x80000040, >> + >> + /* Platform-specific processor intercept messages. */ >> + HVMSG_X64_IOPORT_INTERCEPT = 0x80010000, >> + HVMSG_X64_MSR_INTERCEPT = 0x80010001, >> + HVMSG_X64_CPUID_INTERCEPT = 0x80010002, >> + HVMSG_X64_EXCEPTION_INTERCEPT = 0x80010003, >> + HVMSG_X64_APIC_EOI = 0x80010004, >> + HVMSG_X64_LEGACY_FP_ERROR = 0x80010005 >> +}; >> + >> +/* Define synthetic interrupt controller message flags. */ >> +union hv_message_flags { >> + __u8 asu8; >> + struct { >> + __u8 msg_pending:1; >> + __u8 reserved:7; >> + }; >> +}; >> + >> +/* Define port identifier type. */ >> +union hv_port_id { >> + __u32 asu32; >> + struct { >> + __u32 id:24; >> + __u32 reserved:8; >> + } u; >> +}; >> + >> +/* Define port type. */ >> +enum hv_port_type { >> + HVPORT_MSG = 1, >> + HVPORT_EVENT = 2, >> + HVPORT_MONITOR = 3 >> +}; >> + >> +/* Define synthetic interrupt controller message header. */ >> +struct hv_message_header { >> + enum hv_message_type message_type; > > Do not declare this as an enum, declare it as __u32 to make the size > portable. It can be a patch on top. Ok, I'll prepare such patch. > > KY, can you ack these two patches? > > Paolo > >> + __u8 payload_size; >> + union hv_message_flags message_flags; >> + __u8 reserved[2]; >> + union { >> + __u64 sender; >> + union hv_port_id port; >> + }; >> +}; >> + >> +/* Define timer message payload structure. */ >> +struct hv_timer_message_payload { >> + __u32 timer_index; >> + __u32 reserved; >> + __u64 expiration_time; /* When the timer expired */ >> + __u64 delivery_time; /* When the message was delivered */ >> +}; >> + >> +/* Define synthetic interrupt controller message format. */ >> +struct hv_message { >> + struct hv_message_header header; >> + union { >> + __u64 payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT]; >> + } u; >> +}; >> + >> +/* Define the synthetic interrupt message page layout. */ >> +struct hv_message_page { >> + struct hv_message sint_message[HV_SYNIC_SINT_COUNT]; >> +}; >> + >> #endif >> diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h >> index 46e23d1..d22230c 100644 >> --- a/drivers/hv/hyperv_vmbus.h >> +++ b/drivers/hv/hyperv_vmbus.h >> @@ -63,10 +63,6 @@ enum hv_cpuid_function { >> /* Define version of the synthetic interrupt controller. */ >> #define HV_SYNIC_VERSION (1) >> >> -/* Define synthetic interrupt controller message constants. */ >> -#define HV_MESSAGE_SIZE (256) >> -#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240) >> -#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30) >> #define HV_ANY_VP (0xFFFFFFFF) >> >> /* Define synthetic interrupt controller flag constants. */ >> @@ -74,53 +70,9 @@ enum hv_cpuid_function { >> #define HV_EVENT_FLAGS_BYTE_COUNT (256) >> #define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(u32)) >> >> -/* Define hypervisor message types. */ >> -enum hv_message_type { >> - HVMSG_NONE = 0x00000000, >> - >> - /* Memory access messages. */ >> - HVMSG_UNMAPPED_GPA = 0x80000000, >> - HVMSG_GPA_INTERCEPT = 0x80000001, >> - >> - /* Timer notification messages. */ >> - HVMSG_TIMER_EXPIRED = 0x80000010, >> - >> - /* Error messages. */ >> - HVMSG_INVALID_VP_REGISTER_VALUE = 0x80000020, >> - HVMSG_UNRECOVERABLE_EXCEPTION = 0x80000021, >> - HVMSG_UNSUPPORTED_FEATURE = 0x80000022, >> - >> - /* Trace buffer complete messages. */ >> - HVMSG_EVENTLOG_BUFFERCOMPLETE = 0x80000040, >> - >> - /* Platform-specific processor intercept messages. */ >> - HVMSG_X64_IOPORT_INTERCEPT = 0x80010000, >> - HVMSG_X64_MSR_INTERCEPT = 0x80010001, >> - HVMSG_X64_CPUID_INTERCEPT = 0x80010002, >> - HVMSG_X64_EXCEPTION_INTERCEPT = 0x80010003, >> - HVMSG_X64_APIC_EOI = 0x80010004, >> - HVMSG_X64_LEGACY_FP_ERROR = 0x80010005 >> -}; >> - >> /* Define invalid partition identifier. */ >> #define HV_PARTITION_ID_INVALID ((u64)0x0) >> >> -/* Define port identifier type. */ >> -union hv_port_id { >> - u32 asu32; >> - struct { >> - u32 id:24; >> - u32 reserved:8; >> - } u ; >> -}; >> - >> -/* Define port type. */ >> -enum hv_port_type { >> - HVPORT_MSG = 1, >> - HVPORT_EVENT = 2, >> - HVPORT_MONITOR = 3 >> -}; >> - >> /* Define port information structure. */ >> struct hv_port_info { >> enum hv_port_type port_type; >> @@ -161,27 +113,6 @@ struct hv_connection_info { >> }; >> }; >> >> -/* Define synthetic interrupt controller message flags. */ >> -union hv_message_flags { >> - u8 asu8; >> - struct { >> - u8 msg_pending:1; >> - u8 reserved:7; >> - }; >> -}; >> - >> -/* Define synthetic interrupt controller message header. */ >> -struct hv_message_header { >> - enum hv_message_type message_type; >> - u8 payload_size; >> - union hv_message_flags message_flags; >> - u8 reserved[2]; >> - union { >> - u64 sender; >> - union hv_port_id port; >> - }; >> -}; >> - >> /* >> * Timer configuration register. >> */ >> @@ -198,31 +129,9 @@ union hv_timer_config { >> }; >> }; >> >> - >> -/* Define timer message payload structure. */ >> -struct hv_timer_message_payload { >> - u32 timer_index; >> - u32 reserved; >> - u64 expiration_time; /* When the timer expired */ >> - u64 delivery_time; /* When the message was delivered */ >> -}; >> - >> -/* Define synthetic interrupt controller message format. */ >> -struct hv_message { >> - struct hv_message_header header; >> - union { >> - u64 payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT]; >> - } u ; >> -}; >> - >> /* Define the number of message buffers associated with each port. */ >> #define HV_PORT_MESSAGE_BUFFER_COUNT (16) >> >> -/* Define the synthetic interrupt message page layout. */ >> -struct hv_message_page { >> - struct hv_message sint_message[HV_SYNIC_SINT_COUNT]; >> -}; >> - >> /* Define the synthetic interrupt controller event flags format. */ >> union hv_synic_event_flags { >> u8 flags8[HV_EVENT_FLAGS_BYTE_COUNT]; >>