sepherosa_gmail.com created this revision.
sepherosa_gmail.com added reviewers: adrian, delphij, royger, 
decui_microsoft.com, honzhan_microsoft.com, howard0su_gmail.com.
sepherosa_gmail.com added a subscriber: freebsd-virtualization-list.

REVISION SUMMARY
  Better and simple solution is to do the same things as XEN'a EVTCHN, but that 
will require us to have a hyperv specific file always reside in kernel.
  
  Inspired by a discussion w/ Dexuan

REVISION DETAIL
  https://reviews.freebsd.org/D5291

AFFECTED FILES
  sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c

CHANGE DETAILS
  diff --git a/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c 
b/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
  --- a/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
  +++ b/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
  @@ -382,8 +382,12 @@
   #ifdef HYPERV
   extern inthand_t IDTVEC(rsvd), IDTVEC(hv_vmbus_callback);
   
  +#define VMBUS_IDT_START      IDT_DTRACE_RET 
  +#define VMBUS_IDT_END        APIC_TIMER_INT
  +
   /**
    * @brief Find a free IDT slot and setup the interrupt handler.
  + * range: (VMBUS_IDT_START, VMBUS_IDT_END)
    */
   static int
   vmbus_vector_alloc(void)
  @@ -397,8 +401,8 @@
         * as vmbus channel callback vector. We install 'hv_vmbus_callback'
         * handler at that vector and use it to interrupt vcpus.
         */
  -     vector = APIC_SPURIOUS_INT;
  -     while (--vector >= APIC_IPI_INTS) {
  +     vector = VMBUS_IDT_END;
  +     while (--vector > VMBUS_IDT_START) {
                ip = &idt[vector];
                func = ((long)ip->gd_hioffset << 16 | ip->gd_looffset);
                if (func == (uintptr_t)&IDTVEC(rsvd)) {
  @@ -428,7 +432,7 @@
        if (vector == 0)
                return;
   
  -        KASSERT(vector >= APIC_IPI_INTS && vector < APIC_SPURIOUS_INT,
  +        KASSERT(vector > VMBUS_IDT_START && vector < VMBUS_IDT_END,
               ("invalid vector %d", vector));
   
           ip = &idt[vector];

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: sepherosa_gmail.com, adrian, delphij, royger, decui_microsoft.com, 
honzhan_microsoft.com, howard0su_gmail.com
Cc: freebsd-virtualization-list
diff --git a/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c b/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
--- a/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
+++ b/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
@@ -382,8 +382,12 @@
 #ifdef HYPERV
 extern inthand_t IDTVEC(rsvd), IDTVEC(hv_vmbus_callback);
 
+#define VMBUS_IDT_START	IDT_DTRACE_RET 
+#define VMBUS_IDT_END	APIC_TIMER_INT
+
 /**
  * @brief Find a free IDT slot and setup the interrupt handler.
+ * range: (VMBUS_IDT_START, VMBUS_IDT_END)
  */
 static int
 vmbus_vector_alloc(void)
@@ -397,8 +401,8 @@
 	 * as vmbus channel callback vector. We install 'hv_vmbus_callback'
 	 * handler at that vector and use it to interrupt vcpus.
 	 */
-	vector = APIC_SPURIOUS_INT;
-	while (--vector >= APIC_IPI_INTS) {
+	vector = VMBUS_IDT_END;
+	while (--vector > VMBUS_IDT_START) {
 		ip = &idt[vector];
 		func = ((long)ip->gd_hioffset << 16 | ip->gd_looffset);
 		if (func == (uintptr_t)&IDTVEC(rsvd)) {
@@ -428,7 +432,7 @@
 	if (vector == 0)
 		return;
 
-        KASSERT(vector >= APIC_IPI_INTS && vector < APIC_SPURIOUS_INT,
+        KASSERT(vector > VMBUS_IDT_START && vector < VMBUS_IDT_END,
             ("invalid vector %d", vector));
 
         ip = &idt[vector];

_______________________________________________
freebsd-virtualization@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-virtualization
To unsubscribe, send any mail to 
"freebsd-virtualization-unsubscr...@freebsd.org"

Reply via email to