Annotation of Gnu-Mach/i386/pc/rv86/rv86_reflect_irq.S, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Copyright (c) 1995 The University of Utah and
                      3:  * the Computer Systems Laboratory at the University of Utah (CSL).
                      4:  * All rights reserved.
                      5:  *
                      6:  * Permission to use, copy, modify and distribute this software is hereby
                      7:  * granted provided that (1) source code retains these copyright, permission,
                      8:  * and disclaimer notices, and (2) redistributions including binaries
                      9:  * reproduce the notices in supporting documentation, and (3) all advertising
                     10:  * materials mentioning features or use of this software display the following
                     11:  * acknowledgement: ``This product includes software developed by the
                     12:  * Computer Systems Laboratory at the University of Utah.''
                     13:  *
                     14:  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
                     15:  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
                     16:  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     17:  *
                     18:  * CSL requests users of this software to return to [email protected] any
                     19:  * improvements that they make and grant CSL redistribution rights.
                     20:  *
                     21:  *      Author: Bryan Ford, University of Utah CSL
                     22:  */
                     23: 
                     24: #include <mach/machine/asm.h>
                     25: #include <mach/machine/eflags.h>
                     26: 
                     27: #include "trap.h"
                     28: #include "trap_asm.h"
                     29: #include "pc_asm.h"
                     30: #include "i386_asm.h"
                     31: 
                     32: /*
                     33:  * Define a set of interrupt handlers to reflect interrupts to v86 mode.
                     34:  */
                     35: 
                     36:        .text
                     37: 
                     38: #define master_base    0x08
                     39: #define slave_base     0x70
                     40: 
                     41: #define irq(pic,picnum,irqnum)                         \
                     42: ENTRY(rv86_reflect_irq##irqnum)                                ;\
                     43:        pushl   $pic##_base+picnum                      ;\
                     44:        pushl   $0x80000000+irqnum /* (for debug) */    ;\
                     45:        jmp     allintrs
                     46: 
                     47: #include "irq_list.h"
                     48: 
                     49: 
                     50: allintrs:
                     51:        pusha
                     52:        pushl   %ds
                     53:        pushl   %es
                     54:        pushl   %fs
                     55:        pushl   %gs
                     56: 
                     57:        /* Load the normal kernel segment registers.  */
                     58:        movw    %ss,%ax
                     59:        movw    %ax,%ds
                     60:        movw    %ax,%es
                     61: 
                     62:        /* See if we came from v86 mode.  */
                     63:        testl   $EFL_VM,TR_EFLAGS(%esp)
                     64:        jnz     int_from_v86
                     65: 
                     66:        movl    TR_ERR(%esp),%eax
                     67:        pushl   $dummy_rcd
                     68:        pushl   %eax
                     69:        call    EXT(rv86_real_int)
                     70:        addl    $2*4,%esp
                     71: 
                     72:        popl    %gs
                     73:        popl    %fs
                     74:        popl    %es
                     75:        popl    %ds
                     76:        popa
                     77:        addl    $2*4,%esp
                     78:        iret
                     79: 
                     80: int_from_v86:
                     81: 
                     82:        /* Save the v86 stack pointer before handling the interrupt.
                     83:           We need this in order to handle recursive reflected interrupts
                     84:           possibly interspersed with protected-mode interrupts.  */
                     85:        movl    EXT(rv86_usp),%esi
                     86:        movl    EXT(rv86_usp)+4,%edi
                     87:        movl    EXT(real_tss)+TSS_ESP0,%ebx
                     88: 
                     89:        movl    TR_ESP(%esp),%eax
                     90:        subw    $6,%ax  /* allocate a real-mode interrupt stack frame.  */
                     91:        movl    %eax,EXT(rv86_usp)
                     92:        movl    TR_SS(%esp),%eax
                     93:        movw    %ax,EXT(rv86_usp)+4
                     94: 
                     95:        movl    TR_ERR(%esp),%eax
                     96:        pushl   $dummy_rcd
                     97:        pushl   %eax
                     98:        call    EXT(rv86_real_int)
                     99:        addl    $2*4,%esp
                    100: 
                    101:        movl    %esi,EXT(rv86_usp)
                    102:        movl    %edi,EXT(rv86_usp)+4
                    103:        movl    %ebx,EXT(real_tss)+TSS_ESP0
                    104: 
                    105:        addl    $4*4,%esp
                    106:        popa
                    107:        addl    $2*4,%esp
                    108:        iret
                    109: 
                    110:        /* Dummy real_call_data structure (always all zero)
                    111:           to use when reflecting hardware interrupts.  */
                    112:        .comm   dummy_rcd,RCD_SIZE
                    113: 

unix.superglobalmegacorp.com

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