Thread (9 messages) flat view 9 messages, 3 authors, 2018-08-31

[PATCH v2 1/4] arm64: hyperv: Add core Hyper-V include files

From: Michael Kelley EOSG <hidden>
Date: 2018-08-31 15:42:10
Also in: lkml

From: KY Srinivasan Sent: Thursday, August 30, 2018 11:23 AM
quoted
+/*
+ * This file contains definitions from the Hyper-V Hypervisor Top-Level
+ * Functional Specification (TLFS):
+ * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
+
A lot of TLFS definitions are ISA independent and we are duplicating these
definitions both for X86_64 and ARM_64.  Perhaps we should look at splitting
this file into a common and ISA specific header file.
I agree that we want to end up with x86_64 and ARM64 ISA dependent files
that include an ISA independent file.  My thinking was to not make that
separation now, for a couple of reasons:

1) We don't have a Hyper-V TLFS that is explicit about what should be
considered ISA independent and ISA dependent.  I can make some
reasonable guesses, but it will be subject to change as the Hyper-V team
firms up the interface and decides what they want to commit to.

2) Some of the things defined in the TLFS have names that are
x86-specific (TSC, MSR, etc.).  For the ISA independent parts, those names
should be more generic, which is another dependency on the Hyper-V
team defining the ISA independent parts of the TLFS.

My judgment was that we'll end up with less perturbation overall to go
with this cloned version of hyperv-tlfs.h for now, and then come back
and do the separation once we have a definitive TLFS to base it on.  But
it's a judgment call, and if the sense is that we should do the separation
now, I can give it a try.
quoted
+#define HvRegisterHypervisorVersion0x00000100 /*CPUID
0x40000002 */
+#defineHvRegisterPrivilegesAndFeaturesInfo0x00000200 /*CPUID
0x40000003 */
+#defineHvRegisterFeaturesInfo0x00000201
/*CPUID 0x40000004 */
+#defineHvRegisterImplementationLimitsInfo0x00000202 /*CPUID
0x40000005 */
+#define HvARM64RegisterInterfaceVersion0x00090006 /*CPUID
0x40000001 */
Can we avoid the mixed case names.
Agreed. I'll fix this throughout to use all uppercase, with underscore
as the word separator.
quoted
+ * Linux-specific definitions for managing interactions with Microsoft's
+ * Hyper-V hypervisor. Definitions that are specified in the Hyper-V
+ * Top Level Functional Spec (TLFS) should not go in this file, but
+ * should instead go in hyperv-tlfs.h.
Would it make sense to breakup this header file into ISA independent and dependent files?
Yes, as above I agree the separation make sense.  And since this file is tied
To Linux and not to the Hyper-V TLFS, the separation isn't affected by the
TLFS issues mentioned above.  I'll give it a try and see if any issues arise.
quoted
+/*
+ * Define the IRQ numbers/vectors used by Hyper-V VMbus interrupts
+ * and by STIMER0 Direct Mode interrupts. Hyper-V should be supplying
+ * these values through ACPI, but there are no other interrupting
+ * devices in a Hyper-V VM on ARM64, so it's OK to hard code for now.
+ * The "CALLBACK_VECTOR" terminology is a left-over from the x86/x64
+ * world that is used in architecture independent Hyper-V code.
+ */
When we have direct device assignment for ARM-64 guests, can we still hardcode.
Yes, we can still hardcode.  These values are in the Per-Processor Interrupt
(PPI) range of 16 to 31.  Any IRQ numbers assigned to a Discrete Device
Assignment (DDA) device will be in the Shared Peripheral Interrupt (SPI)
range of 32-1019 or the Locality-specific Peripheral Interrupt (LPI) range
of greater than 8192.   The handling of DDA interrupts is still under
discussion with the Hyper-V team, but there won't be any conflicts with
the PPI values that are hardcoded here.
quoted
+/*
+ * The guest OS needs to register the guest ID with the hypervisor.
+ * The guest ID is a 64 bit entity and the structure of this ID is
+ * specified in the Hyper-V specification:
+ *
+ * msdn.microsoft.com/en-
us/library/windows/hardware/ff542653%28v=vs.85%29.aspx
+ *
+ * While the current guideline does not specify how Linux guest ID(s)
+ * need to be generated, our plan is to publish the guidelines for
+ * Linux and other guest operating systems that currently are hosted
+ * on Hyper-V. The implementation here conforms to this yet
+ * unpublished guidelines.
+ *
+ *
+ * Bit(s)
+ * 63 - Indicates if the OS is Open Source or not; 1 is Open Source
+ * 62:56 - Os Type; Linux is 0x100
+ * 55:48 - Distro specific identification
+ * 47:16 - Linux kernel version number
+ * 15:0  - Distro specific identification
+ *
+ * Generate the guest ID based on the guideline described above.
+ */
No need to repeat the above block comment (already included in the TLFS header).
Agreed.  Will make the change in v3 of the patch.
quoted
+/* Free the message slot and signal end-of-message if required */
+static inline void vmbus_signal_eom(struct hv_message *msg, u32
old_msg_type)
+{
+/*
+ * On crash we're reading some other CPU's message page and we
need
+ * to be careful: this other CPU may already had cleared the header
+ * and the host may already had delivered some other message
there.
+ * In case we blindly write msg->header.message_type we're going
+ * to lose it. We can still lose a message of the same type but
+ * we count on the fact that there can only be one
+ * CHANNELMSG_UNLOAD_RESPONSE and we don't care about
other messages
+ * on crash.
+ */
+if (cmpxchg(&msg->header.message_type, old_msg_type,
+    HVMSG_NONE) != old_msg_type)
+return;
+
+/*
+ * Make sure the write to MessageType (ie set to
+ * HVMSG_NONE) happens before we read the
+ * MessagePending and EOMing. Otherwise, the EOMing
+ * will not deliver any more messages since there is
+ * no empty slot
+ */
+mb();
+
+if (msg->header.message_flags.msg_pending) {
+/*
+ * This will cause message queue rescan to
+ * possibly deliver another msg from the
+ * hypervisor
+ */
+hv_set_vpreg(HvRegisterEom, 0);
+}
+}
The code above is identical to what we have on the x86 side except how we
signal EOM state. If we abstract this, this entire function can be in a common file.
Agreed.  I should be able to do that as part of breaking out
an ISA independent version of this include file.

Michael
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help