WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-merge

[Xen-merge] io_apic.c, part 2

To: xen-merge <xen-merge@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-merge] io_apic.c, part 2
From: "Martin J. Bligh" <mbligh@xxxxxxxxxx>
Date: Mon, 08 Aug 2005 08:44:45 -0700
Delivery-date: Mon, 08 Aug 2005 15:42:52 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-merge-request@lists.xensource.com?subject=help>
List-id: xen-merge <xen-merge.lists.xensource.com>
List-post: <mailto:xen-merge@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-merge>, <mailto:xen-merge-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-merge>, <mailto:xen-merge-request@lists.xensource.com?subject=unsubscribe>
Reply-to: "Martin J. Bligh" <mbligh@xxxxxxxxxx>
Sender: xen-merge-bounces@xxxxxxxxxxxxxxxxxxx
This does something slightly more intelligent, but nothing magic.
BTW, both halves are completely untested ;-)

M.

diff -aurpN -X /home/fletch/.diff.exclude 
xen-io_apic1/arch/i386/kernel/io_apic.c xen-io_apic.c/arch/i386/kernel/io_apic.c
--- xen-io_apic1/arch/i386/kernel/io_apic.c     2005-08-08 08:39:01.000000000 
-0700
+++ xen-io_apic.c/arch/i386/kernel/io_apic.c    2005-08-07 17:07:32.000000000 
-0700
@@ -1139,7 +1139,7 @@ static inline int IO_APIC_irq_trigger(in
 }
 
 /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
-u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
+u8 irq_vector[NR_IRQ_VECTORS] = DEFINE_IRQ_VECTOR;
 
 int assign_irq_vector(int irq)
 {
@@ -1148,17 +1148,8 @@ int assign_irq_vector(int irq)
        BUG_ON(irq >= NR_IRQ_VECTORS);
        if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0)
                return IO_APIC_VECTOR(irq);
-next:
-       current_vector += 8;
-       if (current_vector == SYSCALL_VECTOR)
-               goto next;
-
-       if (current_vector >= FIRST_SYSTEM_VECTOR) {
-               offset++;
-               if (!(offset%8))
-                       return -ENOSPC;
-               current_vector = FIRST_DEVICE_VECTOR + offset;
-       }
+
+       __assign_irq_vector(&current_vector);
 
        vector_irq[current_vector] = irq;
        if (irq != AUTO_ASSIGN)
@@ -1255,7 +1246,7 @@ static void __init setup_IO_APIC_irqs(vo
                else
                        add_pin_to_irq(irq, apic, pin);
 
-               if (!apic && !IO_APIC_IRQ(irq))
+               if (skip_setup_IO_APIC_irq(apic, irq))
                        continue;
 
                if (IO_APIC_IRQ(irq)) {
@@ -2074,7 +2065,7 @@ static inline void init_IO_APIC_traps(vo
                                make_8259A_irq(irq);
                        else
                                /* Strange. Oh, well.. */
-                               irq_desc[irq].handler = &no_irq_type;
+                               set_no_irq_handler(irq);
                }
        }
 }
diff -aurpN -X /home/fletch/.diff.exclude 
xen-io_apic1/include/asm-i386/mach-default/mach_io_apic.h 
xen-io_apic.c/include/asm-i386/mach-default/mach_io_apic.h
--- xen-io_apic1/include/asm-i386/mach-default/mach_io_apic.h   1969-12-31 
16:00:00.000000000 -0800
+++ xen-io_apic.c/include/asm-i386/mach-default/mach_io_apic.h  2005-08-07 
17:19:08.000000000 -0700
@@ -0,0 +1,33 @@
+#ifndef __ASM_MACH_IO_APIC_H
+#define __ASM_MACH_IO_APIC_H
+
+#define DEFINE_IRQ_VECTOR { FIRST_DEVICE_VECTOR , 0 }
+
+static inline void __assign_irq_vector(static int *current_vector)
+{
+       static int offset = 0;
+
+next:
+       *current_vector += 8;
+       if (*current_vector == SYSCALL_VECTOR)
+               goto next;
+
+       if (*current_vector >= FIRST_SYSTEM_VECTOR) {
+               offset++;
+               if (!(offset%8))
+                       return -ENOSPC;
+               *current_vector = FIRST_DEVICE_VECTOR + offset;
+       }
+}
+
+
+static inline skip_setup_IO_APIC_irq(int apic, int irq)
+{
+       return ((apic == 0) && !IO_APIC_IRQ(irq));
+}
+
+static inline int void set_no_irq_handler (int irq)
+{
+       irq_desc[irq].handler = &no_irq_type;
+}
+
diff -aurpN -X /home/fletch/.diff.exclude 
xen-io_apic1/include/asm-i386/mach-xen/mach_io_apic.h 
xen-io_apic.c/include/asm-i386/mach-xen/mach_io_apic.h
--- xen-io_apic1/include/asm-i386/mach-xen/mach_io_apic.h       1969-12-31 
16:00:00.000000000 -0800
+++ xen-io_apic.c/include/asm-i386/mach-xen/mach_io_apic.h      2005-08-07 
17:15:40.000000000 -0700
@@ -0,0 +1,63 @@
+#ifndef __ASM_MACH_IO_APIC_H
+#define __ASM_MACH_IO_APIC_H
+
+#include <xen-public/xen.h>
+#include <xen-public/physdev.h>
+
+/* Fake i8259 */
+#define make_8259A_irq(_irq)     (io_apic_irqs &= ~(1UL<<(_irq)))
+#define disable_8259A_irq(_irq)  ((void)0)
+#define i8259A_irq_pending(_irq) (0)
+
+unsigned long io_apic_irqs;
+
+static inline unsigned int xen_io_apic_read(unsigned int apic, unsigned int 
reg)
+{
+       physdev_op_t op;
+       int ret;
+
+       op.cmd = PHYSDEVOP_APIC_READ;
+       op.u.apic_op.apic = mp_ioapics[apic].mpc_apicid;
+       op.u.apic_op.offset = reg;
+       ret = HYPERVISOR_physdev_op(&op);
+       if (ret)
+               return ret;
+       return op.u.apic_op.value;
+}
+
+static inline void xen_io_apic_write(unsigned int apic, unsigned int reg, 
unsigned int value)
+{
+       physdev_op_t op;
+
+       op.cmd = PHYSDEVOP_APIC_WRITE;
+       op.u.apic_op.apic = mp_ioapics[apic].mpc_apicid;
+       op.u.apic_op.offset = reg;
+       op.u.apic_op.value = value;
+       HYPERVISOR_physdev_op(&op);
+}
+
+#define io_apic_read(a,r)    xen_io_apic_read(a,r)
+#define io_apic_write(a,r,v) xen_io_apic_write(a,r,v)
+
+#define DEFINE_IRQ_VECTOR { 0 }
+
+static inline int __assign_irq_vector(static int *current_vector)
+{
+       physdev_op_t op;
+
+       op.cmd = PHYSDEVOP_ASSIGN_VECTOR;
+       op.u.irq_op.irq = irq;
+       if (HYPERVISOR_physdev_op(&op))
+               return -ENOSPC;
+       *current_vector = op.u.irq_op.vector;
+}
+
+static inline skip_setup_IO_APIC_irq(int apic, int irq)
+{
+       return (!IO_APIC_IRQ(irq));
+}
+
+static inline int void set_no_irq_handler (int irq)
+{
+}
+


_______________________________________________
Xen-merge mailing list
Xen-merge@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-merge

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-merge] io_apic.c, part 2, Martin J. Bligh <=