[BACK]Return to db_magic.s CVS log [TXT][DIR] Up to [local] / sys / arch / i386 / i386

Annotation of sys/arch/i386/i386/db_magic.s, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: db_magic.s,v 1.2 2003/04/17 03:42:14 drahn Exp $      */
                      2:
                      3: /*
                      4:  * Mach Operating System
                      5:  * Copyright (c) 1995 Carnegie Mellon University
                      6:  * All Rights Reserved.
                      7:  *
                      8:  * Permission to use, copy, modify and distribute this software and its
                      9:  * documentation is hereby granted, provided that both the copyright
                     10:  * notice and this permission notice appear in all copies of the
                     11:  * software, derivative works or modified versions, and any portions
                     12:  * thereof, and that both notices appear in supporting documentation.
                     13:  *
                     14:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     15:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     16:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     17:  *
                     18:  * Carnegie Mellon requests users of this software to return to
                     19:  *
                     20:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     21:  *  School of Computer Science
                     22:  *  Carnegie Mellon University
                     23:  *  Pittsburgh PA 15213-3890
                     24:  *
                     25:  * any improvements or extensions that they make and grant Carnegie Mellon
                     26:  * the rights to redistribute these changes.
                     27:  */
                     28:
                     29: #include <machine/asm.h>
                     30: #define S_ARG0         4(%esp)
                     31: #define S_ARG1         8(%esp)
                     32: #define S_ARG2        12(%esp)
                     33: #define S_ARG3        16(%esp)
                     34: #define B_ARG0         8(%ebp)
                     35: #define B_ARG1        12(%ebp)
                     36: #define B_ARG2        16(%ebp)
                     37: #define B_ARG3        20(%ebp)
                     38: /*
                     39:  * void outb(unsigned char *io_port,
                     40:  *         unsigned char byte)
                     41:  *
                     42:  * Output a byte to an IO port.
                     43:  */
                     44: ENTRY(outb)
                     45:       movl    S_ARG0,%edx             /* IO port address */
                     46:       movl    S_ARG1,%eax             /* data to output */
                     47:       outb    %al,%dx                 /* send it out */
                     48:       ret
                     49: /*
                     50:  * unsigned char inb(unsigned char *io_port)
                     51:  *
                     52:  * Input a byte from an IO port.
                     53:  */
                     54: ENTRY(inb)
                     55:       movl    S_ARG0,%edx             /* IO port address */
                     56:       xor     %eax,%eax               /* clear high bits of register */
                     57:       inb     %dx,%al                 /* get the byte */
                     58:       ret
                     59: /*
                     60:  * void outw(unsigned short *io_port,
                     61:  *         unsigned short word)
                     62:  *
                     63:  * Output a word to an IO port.
                     64:  */
                     65: ENTRY(outw)
                     66:       movl    S_ARG0,%edx             /* IO port address */
                     67:       movl    S_ARG1,%eax             /* data to output */
                     68:       outw    %ax,%dx                 /* send it out */
                     69:       ret
                     70: /*
                     71:  * unsigned short inw(unsigned short *io_port)
                     72:  *
                     73:  * Input a word from an IO port.
                     74:  */
                     75: ENTRY(inw)
                     76:       movl    S_ARG0,%edx             /* IO port address */
                     77:       xor     %eax,%eax               /* clear high bits of register */
                     78:       inw     %dx,%ax                 /* get the word */
                     79:       ret
                     80: /*
                     81:  * void outl(unsigned int *io_port,
                     82:  *         unsigned int byte)
                     83:  *
                     84:  * Output an int to an IO port.
                     85:  */
                     86: ENTRY(outl)
                     87:       movl    S_ARG0,%edx             /* IO port address */
                     88:       movl    S_ARG1,%eax             /* data to output */
                     89:       outl    %eax,%dx                /* send it out */
                     90:       ret
                     91: /*
                     92:  * unsigned int inl(unsigned int *io_port)
                     93:  *
                     94:  * Input an int from an IO port.
                     95:  */
                     96: ENTRY(inl)
                     97:       movl    S_ARG0,%edx             /* IO port address */
                     98:       inl     %dx,%eax                /* get the int */
                     99:       ret
                    100: ENTRY(dr6)
                    101:       movl    %db6, %eax
                    102:       ret
                    103: /*    dr<i>(address, type, len, persistence)
                    104:  *    type:
                    105:  *       00   execution (use len 00)
                    106:  *       01   data write
                    107:  *       11   data read/write
                    108:  *    len:
                    109:  *       00   one byte
                    110:  *       01   two bytes
                    111:  *       11   four bytes
                    112:  */
                    113: ENTRY(dr0)
                    114:       movl    S_ARG0, %eax
                    115:       movl    %eax,_C_LABEL(dr_addr)
                    116:       movl    %eax, %db0
                    117:       movl    $0, %ecx
                    118:       jmp     0f
                    119: ENTRY(dr1)
                    120:       movl    S_ARG0, %eax
                    121:       movl    %eax,_C_LABEL(dr_addr)+1*4
                    122:       movl    %eax, %db1
                    123:       movl    $2, %ecx
                    124:       jmp     0f
                    125: ENTRY(dr2)
                    126:       movl    S_ARG0, %eax
                    127:       movl    %eax,_C_LABEL(dr_addr)+2*4
                    128:       movl    %eax, %db2
                    129:       movl    $4, %ecx
                    130:       jmp     0f
                    131: ENTRY(dr3)
                    132:       movl    S_ARG0, %eax
                    133:       movl    %eax,_C_LABEL(dr_addr)+3*4
                    134:       movl    %eax, %db3
                    135:       movl    $6, %ecx
                    136: 0:
                    137:       pushl   %ebp
                    138:       movl    %esp, %ebp
                    139:       movl    %db7, %edx
                    140:       movl    %edx,_C_LABEL(dr_addr)+4*4
                    141:       andl    dr_msk(,%ecx,2),%edx    /* clear out new entry */
                    142:       movl    %edx,_C_LABEL(dr_addr)+5*4
                    143:       movzbl  B_ARG3, %eax
                    144:       andb    $3, %al
                    145:       shll    %cl, %eax
                    146:       orl     %eax, %edx
                    147:       movzbl  B_ARG1, %eax
                    148:       andb    $3, %al
                    149:       add     $0x10, %ecx
                    150:       shll    %cl, %eax
                    151:       orl     %eax, %edx
                    152:       movzbl  B_ARG2, %eax
                    153:       andb    $3, %al
                    154:       add     $0x2, %ecx
                    155:       shll    %cl, %eax
                    156:       orl     %eax, %edx
                    157:       movl    %edx, %db7
                    158:       movl    %edx,_C_LABEL(dr_addr)+7*4
                    159:       movl    %edx, %eax
                    160:       leave
                    161:       ret
                    162:       .data
                    163: dr_msk:
                    164:       .long   ~0x000f0003
                    165:       .long   ~0x00f0000c
                    166:       .long   ~0x0f000030
                    167:       .long   ~0xf00000c0
                    168: ENTRY(dr_addr)
                    169:       .long   0,0,0,0
                    170:       .long   0,0,0,0
                    171:       .text
                    172:

CVSweb