Annotation of OSKit-Mach/i386/i386at/interrupt.S, revision 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 "i386asm.h"
        !            20: 
        !            21: #include <oskit/x86/pc/pic.h>
        !            22: 
        !            23: #define READ_ISR       (OCW_TEMPLATE|READ_NEXT_RD|READ_IS_ONRD)
        !            24: 
        !            25: /*
        !            26:  * Generic interrupt handler.
        !            27:  *
        !            28:  * On entry, %eax contains the irq number.
        !            29:  */
        !            30: ENTRY(interrupt)
        !            31:        movl    %eax,%ecx               /* save irq number */
        !            32:        movb    $(NON_SPEC_EOI),%al     /* non-specific EOI */
        !            33:        outb    %al,$(MASTER_ICW)       /* ack interrupt to master */
        !            34:        cmpl    $8,%ecx                 /* do we need to ack slave? */
        !            35:        jl      1f                      /* no, skip it */
        !            36:        outb    %al,$(SLAVES_ICW)
        !            37: 1:
        !            38:        shll    $2,%ecx                 /* irq * 4 */
        !            39:        movl    EXT(intpri)(%ecx),%edx  /* get new ipl */
        !            40:        call    spl                     /* set ipl */
        !            41:        movl    EXT(iunit)(%ecx),%edx   /* get device unit number */
        !            42:        pushl   %eax                    /* push previous ipl */
        !            43:        pushl   %edx                    /* push unit number */
        !            44:        call    *EXT(ivect)(%ecx)       /* call interrupt handler */
        !            45:        addl    $4,%esp                 /* pop unit number */
        !            46:        call    splx_cli                /* restore previous ipl */
        !            47:        cli                             /* XXX no more nested interrupts */
        !            48:        addl    $4,%esp                 /* pop previous ipl */
        !            49:        ret                             /* return */

unix.superglobalmegacorp.com

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