Index: kernel/arch/ppc64/src/drivers/pic.c
===================================================================
--- kernel/arch/ppc64/src/drivers/pic.c	(revision 19de05f6a81e28fafc795b1e06e10bd9fea57103)
+++ kernel/arch/ppc64/src/drivers/pic.c	(revision 19de05f6a81e28fafc795b1e06e10bd9fea57103)
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2006 Ondrej Palkovsky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup ppc64
+ * @{
+ */
+/** @file
+ */
+
+
+#include <arch/asm.h>
+#include <arch/drivers/pic.h>
+#include <byteorder.h>
+#include <bitops.h>
+
+static volatile uint32_t *pic;
+
+void pic_init(uintptr_t base, size_t size)
+{
+	pic = (uint32_t *) hw_map(base, size);
+}
+
+
+
+void pic_enable_interrupt(int intnum)
+{
+	if (intnum < 32) {
+		pic[PIC_MASK_LOW] = pic[PIC_MASK_LOW] | (1 << intnum);
+	} else {
+		pic[PIC_MASK_HIGH] = pic[PIC_MASK_HIGH] | (1 << (intnum - 32));
+	}
+	
+}
+
+void pic_disable_interrupt(int intnum)
+{
+	if (intnum < 32) {
+		pic[PIC_MASK_LOW] = pic[PIC_MASK_LOW] & (~(1 << intnum));
+	} else {
+		pic[PIC_MASK_HIGH] = pic[PIC_MASK_HIGH] & (~(1 << (intnum - 32)));
+	}
+}
+
+void pic_ack_interrupt(int intnum)
+{
+	if (intnum < 32) 
+		pic[PIC_ACK_LOW] = 1 << intnum;
+	else 
+		pic[PIC_ACK_HIGH] = 1 << (intnum - 32);
+}
+
+/** Return number of pending interrupt */
+int pic_get_pending(void)
+{
+	int pending;
+
+	pending = pic[PIC_PENDING_LOW];
+	if (pending)
+		return fnzb32(pending);
+	
+	pending = pic[PIC_PENDING_HIGH];
+	if (pending)
+		return fnzb32(pending) + 32;
+	
+	return -1;
+}
+
+/** @}
+ */
Index: kernel/arch/ppc64/src/interrupt.c
===================================================================
--- kernel/arch/ppc64/src/interrupt.c	(revision 26678e5a1f0f0a6dda91a9e89a03aa3ca86e447c)
+++ kernel/arch/ppc64/src/interrupt.c	(revision 19de05f6a81e28fafc795b1e06e10bd9fea57103)
@@ -33,4 +33,5 @@
  */
 
+#include <ddi/irq.h>
 #include <interrupt.h>
 #include <arch/interrupt.h>
@@ -39,4 +40,7 @@
 #include <time/clock.h>
 #include <ipc/sysipc.h>
+#include <arch/drivers/pic.h>
+#include <arch/mm/tlb.h>
+#include <print.h>
 
 
@@ -48,4 +52,30 @@
 		: "r" (1000)
 	);
+}
+
+
+/** Handler of external interrupts */
+static void exception_external(int n, istate_t *istate)
+{
+	int inum;
+	
+	while ((inum = pic_get_pending()) != -1) {
+		irq_t *irq = irq_dispatch_and_lock(inum);
+		if (irq) {
+			/*
+			 * The IRQ handler was found.
+			 */
+			irq->handler(irq, irq->arg);
+			spinlock_unlock(&irq->lock);
+		} else {
+			/*
+			 * Spurious interrupt.
+			 */
+#ifdef CONFIG_DEBUG
+			printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum);
+#endif
+		}
+		pic_ack_interrupt(inum);
+	}
 }
 
@@ -61,13 +91,6 @@
 void interrupt_init(void)
 {
+	exc_register(VECTOR_EXTERNAL, "external", exception_external);
 	exc_register(VECTOR_DECREMENTER, "timer", exception_decrementer);
-}
-
-
-/* Reregister irq to be IPC-ready */
-void irq_ipc_bind_arch(unative_t irq)
-{
-	panic("not implemented\n");
-	/* TODO */
 }
 
