# check control registers
         stctl  %c0,%c15,0(%r15)
-       oi     2(%r15),0x20             # enable sigp external interrupts
+       oi     2(%r15),0x40             # enable sigp emergency signal
        oi     0(%r15),0x10             # switch on low address protection
         lctl   %c0,%c15,0(%r15)
 
 
 
 # check control registers
         stctg  %c0,%c15,0(%r15)
-       oi     6(%r15),0x20             # enable sigp external interrupts
+       oi     6(%r15),0x40             # enable sigp emergency signal
        oi     4(%r15),0x10             # switch on low address proctection
         lctlg  %c0,%c15,0(%r15)
 
 
 #include <asm/irq.h>
 
 /*
- * Simple hash strategy: index = code & 0xff;
  * ext_int_hash[index] is the start of the list for all external interrupts
  * that hash to this index. With the current set of external interrupts 
  * (0x1202 external call, 0x1004 cpu timer, 0x2401 hwc console, 0x4000
  */
 ext_int_info_t *ext_int_hash[256] = { 0, };
 
+static inline int ext_hash(__u16 code)
+{
+       return (code + (code >> 9)) & 0xff;
+}
+
 int register_external_interrupt(__u16 code, ext_int_handler_t handler)
 {
         ext_int_info_t *p;
                 return -ENOMEM;
         p->code = code;
         p->handler = handler;
-        index = code & 0xff;
+       index = ext_hash(code);
         p->next = ext_int_hash[index];
         ext_int_hash[index] = p;
         return 0;
                 return -EINVAL;
         p->code = code;
         p->handler = handler;
-        index = code & 0xff;
+       index = ext_hash(code);
         p->next = ext_int_hash[index];
         ext_int_hash[index] = p;
         return 0;
         ext_int_info_t *p, *q;
         int index;
 
-        index = code & 0xff;
+       index = ext_hash(code);
         q = NULL;
         p = ext_int_hash[index];
         while (p != NULL) {
 
        if (p == NULL || p->code != code || p->handler != handler)
                return -EINVAL;
-       index = code & 0xff;
+       index = ext_hash(code);
        q = ext_int_hash[index];
        if (p != q) {
                while (q != NULL) {
                 */
                account_ticks(regs);
        kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++;
-        index = code & 0xff;
+        index = ext_hash(code);
        for (p = ext_int_hash[index]; p; p = p->next) {
                if (likely(p->code == code)) {
                        if (likely(p->handler))
 
          * Set signaling bit in lowcore of target cpu and kick it
          */
        set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast);
-       while(signal_processor(cpu, sigp_external_call) == sigp_busy)
+       while(signal_processor(cpu, sigp_emergency_signal) == sigp_busy)
                udelay(10);
 }
 
                  * Set signaling bit in lowcore of target cpu and kick it
                  */
                set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast);
-               while (signal_processor(cpu, sigp_external_call) == sigp_busy)
+               while (signal_processor(cpu, sigp_emergency_signal) == sigp_busy)
                        udelay(10);
         }
 }
        unsigned int cpu;
         int i;
 
-        /* request the 0x1202 external interrupt */
-        if (register_external_interrupt(0x1202, do_ext_call_interrupt) != 0)
-                panic("Couldn't request external interrupt 0x1202");
+        /* request the 0x1201 emergency signal external interrupt */
+        if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0)
+                panic("Couldn't request external interrupt 0x1201");
         smp_check_cpus(max_cpus);
         memset(lowcore_ptr,0,sizeof(lowcore_ptr));  
         /*