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