source: mainline/arch/ia32/src/asm.S@ 5eb1379

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5eb1379 was 9756131, checked in by Jakub Jermar <jakub@…>, 20 years ago

Get rid of memcopy().
All we now have is memcpy() and _memcpy().
memcpy() is defined to be builtin.
Where not applicable, architectures must implement memcpy() code or call slowish _memcopy().

  • Property mode set to 100644
File size: 6.1 KB
Line 
1#
2# Copyright (C) 2001-2004 Jakub Jermar
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29## very low and hardware-level functions
30
31# Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error word
32# and 1 means interrupt with error word
33#define ERROR_WORD_INTERRUPT_LIST 0x00027D00
34
35.text
36
37.global paging_on
38.global enable_l_apic_in_msr
39.global interrupt_handlers
40.global inb
41.global inw
42.global inl
43.global outb
44.global outw
45.global outl
46.global memcpy
47.global memsetb
48.global memsetw
49.global memcmp
50
51
52## Turn paging on
53#
54# Enable paging and write-back caching in CR0.
55#
56paging_on:
57 pushl %eax
58 movl %cr0,%eax
59 orl $(1<<31),%eax # paging on
60 andl $~((1<<30)|(1<<29)),%eax # clear Cache Disable and not Write Though
61 movl %eax,%cr0
62 jmp 0f
630:
64 popl %eax
65 ret
66
67
68## Enable local APIC
69#
70# Enable local APIC in MSR.
71#
72enable_l_apic_in_msr:
73 pusha
74
75 movl $0x1b, %ecx
76 rdmsr
77 orl $(1<<11),%eax
78 orl $(0xfee00000),%eax
79 wrmsr
80
81 popa
82 ret
83
84
85## Declare interrupt handlers
86#
87# Declare interrupt handlers for n interrupt
88# vectors starting at vector i.
89#
90# The handlers setup data segment registers
91# and call trap_dispatcher().
92#
93.macro handler i n
94 push %ebp
95 movl %esp,%ebp
96 pusha
97
98 push %ds
99 push %es
100
101 # we must fill the data segment registers
102 movw $16,%ax
103 movw %ax,%ds
104 movw %ax,%es
105
106 movl $(\i),%edi
107 pushl %ebp
108 addl $4,(%esp)
109 pushl %edi
110 call trap_dispatcher
111 addl $8,%esp
112
113 pop %es
114 pop %ds
115
116
117# CLNT
118 pushfl;
119 pop %eax;
120 and $0xFFFFBFFF,%eax;
121 push %eax;
122 popfl;
123
124
125
126# Test if this is interrupt with error word or not
127 mov $\i,%cl;
128 movl $1,%eax;
129 test $0xe0,%cl;
130 jnz 0f;
131 and $0x1f,%cl;
132 shl %cl,%eax;
133 and $ERROR_WORD_INTERRUPT_LIST,%eax;
134 jz 0f;
135
136
137# Return with error word
138 popa;
139 pop %ebp;
140 add $4,%esp; # Skip error word
141 iret;
142
1430:
144# Return with no error word
145 popa
146 pop %ebp
147 iret
148
149 .if (\n-\i)-1
150 handler "(\i+1)",\n
151 .endif
152.endm
153
154# keep in sync with pm.h !!!
155IDT_ITEMS=64
156interrupt_handlers:
157h_start:
158 handler 0 64
159# handler 64 128
160# handler 128 192
161# handler 192 256
162h_end:
163
164
165## I/O input (byte)
166#
167# Get a byte from I/O port and store it AL.
168#
169inb:
170 push %edx
171 xorl %eax,%eax
172 movl 8(%esp),%edx
173 inb %dx,%al
174 pop %edx
175 ret
176
177
178## I/O input (word)
179#
180# Get a word from I/O port and store it AX.
181#
182inw:
183 push %edx
184 xorl %eax,%eax
185 movl 8(%esp),%edx
186 inw %dx,%ax
187 pop %edx
188 ret
189
190
191## I/O input (dword)
192#
193# Get a dword from I/O port and store it EAX.
194#
195inl:
196 push %edx
197 xorl %eax,%eax
198 movl 8(%esp),%edx
199 inl %dx,%eax
200 pop %edx
201 ret
202
203
204## I/O output (byte)
205#
206# Send a byte to I/O port.
207#
208outb:
209 push %ebp
210 movl %esp,%ebp
211 pusha
212
213 movl 8(%ebp),%edx
214 movl 12(%ebp),%eax
215 outb %al,%dx
216
217 popa
218 pop %ebp
219 ret
220
221
222## I/O output (word)
223#
224# Send a word to I/O port.
225#
226outw:
227 push %ebp
228 movl %esp,%ebp
229 pusha
230
231 movl 8(%ebp),%edx
232 movl 12(%ebp),%eax
233 outw %ax,%dx
234
235 popa
236 pop %ebp
237 ret
238
239
240## I/O output (dword)
241#
242# Send a dword to I/O port.
243#
244outl:
245 push %ebp
246 movl %esp,%ebp
247 pusha
248
249 movl 8(%ebp),%edx
250 movl 12(%ebp),%eax
251 outl %eax,%dx
252
253 popa
254 pop %ebp
255 ret
256
257
258## Copy memory
259#
260# Copy a given number of bytes (3rd argument)
261# from the memory location defined by 2nd argument
262# to the memory location defined by 1st argument.
263# The memory areas cannot overlap.
264#
265SRC=12
266DST=8
267CNT=16
268memcpy:
269 push %ebp
270 movl %esp,%ebp
271 pusha
272
273 cld
274 movl CNT(%ebp),%ecx
275 movl DST(%ebp),%edi
276 movl SRC(%ebp),%esi
277
278 rep movsb %ds:(%esi),%es:(%edi)
279
280 popa
281 pop %ebp
282 ret
283
284
285## Fill memory with bytes
286#
287# Fill a given number of bytes (2nd argument)
288# at memory defined by 1st argument with the
289# byte value defined by 3rd argument.
290#
291DST=8
292CNT=12
293X=16
294memsetb:
295 push %ebp
296 movl %esp,%ebp
297 pusha
298
299 cld
300 movl CNT(%ebp),%ecx
301 movl DST(%ebp),%edi
302 movl X(%ebp),%eax
303
304 rep stosb %al,%es:(%edi)
305
306 popa
307 pop %ebp
308 ret
309
310
311## Fill memory with words
312#
313# Fill a given number of words (2nd argument)
314# at memory defined by 1st argument with the
315# word value defined by 3rd argument.
316#
317DST=8
318CNT=12
319X=16
320memsetw:
321 push %ebp
322 movl %esp,%ebp
323 pusha
324
325 cld
326 movl CNT(%ebp),%ecx
327 movl DST(%ebp),%edi
328 movl X(%ebp),%eax
329
330 rep stosw %ax,%es:(%edi)
331
332 popa
333 pop %ebp
334 ret
335
336
337## Compare memory regions for equality
338#
339# Compare a given number of bytes (3rd argument)
340# at memory locations defined by 1st and 2nd argument
341# for equality. If the bytes are equal, EAX contains
342# 0.
343#
344SRC=12
345DST=16
346CNT=20
347memcmp:
348 push %ebp
349 subl $4,%esp
350 movl %esp,%ebp
351
352 pusha
353
354 cld
355 movl CNT(%ebp),%ecx
356 movl DST(%ebp),%edi
357 movl SRC(%ebp),%esi
358
359 repe cmpsb %es:(%edi),%ds:(%esi)
360 movl %ecx,(%ebp)
361
362 popa
363
364 movl (%ebp),%eax # return value => %eax (zero on success)
365 addl $4,%esp
366 pop %ebp
367
368 ret
369
370
371# THIS IS USERSPACE CODE
372.global utext
373utext:
374 xor %ax,%ax;
375 mov %ax,%ds;
376 mov %ax,%es;
377 mov %ax,%fs;
378 mov %ax,%gs;
3790:
380 int $48
381 jmp 0b
382 # not reached
383utext_end:
384
385.data
386.global utext_size
387utext_size:
388 .long utext_end - utext
389
390
391#.section K_DATA_START
392.global interrupt_handler_size
393
394interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
Note: See TracBrowser for help on using the repository browser.