Annotation of Gnu-Mach/i386/i386at/interrupt.S, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Copyright (c) 1995 Shantanu Goel
                      3:  * All Rights Reserved.
                      4:  * 
                      5:  * Permission to use, copy, modify and distribute this software and its
                      6:  * documentation is hereby granted, provided that both the copyright
                      7:  * notice and this permission notice appear in all copies of the
                      8:  * software, derivative works or modified versions, and any portions
                      9:  * thereof, and that both notices appear in supporting documentation.
                     10:  * 
                     11:  * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     12:  * CONDITION.  THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     13:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     14:  */
                     15: 
                     16: #include <mach/machine/asm.h>
                     17: 
                     18: #include "ipl.h"
                     19: #include "pic.h"
                     20: #include "i386asm.h"
                     21: 
                     22: #define READ_ISR       (OCW_TEMPLATE|READ_NEXT_RD|READ_IS_ONRD)
                     23: 
                     24: /*
                     25:  * Generic interrupt handler.
                     26:  *
                     27:  * On entry, %eax contains the irq number.
                     28:  */
                     29: ENTRY(interrupt)
                     30:        movl    %eax,%ecx               /* save irq number */
                     31:        movb    $(NON_SPEC_EOI),%al     /* non-specific EOI */
                     32:        outb    %al,$(PIC_MASTER_ICW)   /* ack interrupt to master */
                     33:        cmpl    $8,%ecx                 /* do we need to ack slave? */
                     34:        jl      1f                      /* no, skip it */
                     35:        outb    %al,$(PIC_SLAVE_ICW)
                     36: 1:
                     37:        shll    $2,%ecx                 /* irq * 4 */
                     38:        movl    EXT(intpri)(%ecx),%edx  /* get new ipl */
                     39:        call    spl                     /* set ipl */
                     40:        movl    EXT(iunit)(%ecx),%edx   /* get device unit number */
                     41:        pushl   %eax                    /* push previous ipl */
                     42:        pushl   %edx                    /* push unit number */
                     43:        call    *EXT(ivect)(%ecx)       /* call interrupt handler */
                     44:        addl    $4,%esp                 /* pop unit number */
                     45:        call    splx_cli                /* restore previous ipl */
                     46:        cli                             /* XXX no more nested interrupts */
                     47:        addl    $4,%esp                 /* pop previous ipl */
                     48:        ret                             /* return */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.