source: mainline/arch/ia32/src/asm.S@ 24bd23a

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

Optimize assembler code according to the knoweledge of IA-32 ABI.

  • Property mode set to 100644
File size: 5.8 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 movl %cr0,%edx
58 orl $(1<<31),%edx # paging on
59 andl $~((1<<30)|(1<<29)),%edx # clear Cache Disable and not Write Though
60 movl %edx,%cr0
61 jmp 0f
620:
63 ret
64
65
66## Enable local APIC
67#
68# Enable local APIC in MSR.
69#
70enable_l_apic_in_msr:
71 push %eax
72
73 movl $0x1b, %ecx
74 rdmsr
75 orl $(1<<11),%eax
76 orl $(0xfee00000),%eax
77 wrmsr
78
79 pop %eax
80 ret
81
82
83## Declare interrupt handlers
84#
85# Declare interrupt handlers for n interrupt
86# vectors starting at vector i.
87#
88# The handlers setup data segment registers
89# and call trap_dispatcher().
90#
91.macro handler i n
92 push %ebp
93 movl %esp,%ebp
94 pusha
95
96 push %ds
97 push %es
98
99 # we must fill the data segment registers
100 movw $16,%ax
101 movw %ax,%ds
102 movw %ax,%es
103
104 movl $(\i),%edi
105 pushl %ebp
106 addl $4,(%esp)
107 pushl %edi
108 call trap_dispatcher
109 addl $8,%esp
110
111 pop %es
112 pop %ds
113
114
115# CLNT
116 pushfl
117 pop %eax
118 and $0xFFFFBFFF,%eax
119 push %eax
120 popfl
121
122
123
124# Test if this is interrupt with error word or not
125 mov $\i,%cl
126 movl $1,%eax
127 test $0xe0,%cl
128 jnz 0f
129 and $0x1f,%cl
130 shl %cl,%eax
131 and $ERROR_WORD_INTERRUPT_LIST,%eax
132 jz 0f
133
134
135# Return with error word
136 popa
137 pop %ebp
138 add $4,%esp # Skip error word
139 iret
140
1410:
142# Return with no error word
143 popa
144 pop %ebp
145 iret
146
147 .if (\n-\i)-1
148 handler "(\i+1)",\n
149 .endif
150.endm
151
152# keep in sync with pm.h !!!
153IDT_ITEMS=64
154interrupt_handlers:
155h_start:
156 handler 0 64
157# handler 64 128
158# handler 128 192
159# handler 192 256
160h_end:
161
162
163## I/O input (byte)
164#
165# Get a byte from I/O port and store it AL.
166#
167inb:
168 xorl %eax,%eax
169 movl 4(%esp),%edx
170 inb %dx,%al
171 ret
172
173
174## I/O input (word)
175#
176# Get a word from I/O port and store it AX.
177#
178inw:
179 xorl %eax,%eax
180 movl 4(%esp),%edx
181 inw %dx,%ax
182 ret
183
184
185## I/O input (dword)
186#
187# Get a dword from I/O port and store it EAX.
188#
189inl:
190 xorl %eax,%eax
191 movl 4(%esp),%edx
192 inl %dx,%eax
193 ret
194
195
196## I/O output (byte)
197#
198# Send a byte to I/O port.
199#
200outb:
201 push %eax
202
203 movl 8(%esp),%edx
204 movl 12(%esp),%eax
205 outb %al,%dx
206
207 pop %eax
208 ret
209
210
211## I/O output (word)
212#
213# Send a word to I/O port.
214#
215outw:
216 push %eax
217
218 movl 8(%esp),%edx
219 movl 12(%esp),%eax
220 outw %ax,%dx
221
222 pop %eax
223 ret
224
225
226## I/O output (dword)
227#
228# Send a dword to I/O port.
229#
230outl:
231 push %eax
232
233 movl 8(%esp),%edx
234 movl 12(%esp),%eax
235 outl %eax,%dx
236
237 pop %eax
238 ret
239
240
241## Copy memory
242#
243# Copy a given number of bytes (3rd argument)
244# from the memory location defined by 2nd argument
245# to the memory location defined by 1st argument.
246# The memory areas cannot overlap.
247#
248SRC=16
249DST=12
250CNT=20
251memcpy:
252 push %esi
253 push %edi
254
255 movl CNT(%esp),%ecx
256 movl DST(%esp),%edi
257 movl SRC(%esp),%esi
258
259 rep movsb %ds:(%esi),%es:(%edi)
260
261 pop %edi
262 pop %esi
263 ret
264
265
266## Fill memory with bytes
267#
268# Fill a given number of bytes (2nd argument)
269# at memory defined by 1st argument with the
270# byte value defined by 3rd argument.
271#
272DST=12
273CNT=16
274X=20
275memsetb:
276 push %eax
277 push %edi
278
279 movl CNT(%esp),%ecx
280 movl DST(%esp),%edi
281 movl X(%esp),%eax
282
283 rep stosb %al,%es:(%edi)
284
285 pop %edi
286 pop %eax
287 ret
288
289
290## Fill memory with words
291#
292# Fill a given number of words (2nd argument)
293# at memory defined by 1st argument with the
294# word value defined by 3rd argument.
295#
296DST=12
297CNT=16
298X=20
299memsetw:
300 push %eax
301 push %edi
302
303 movl CNT(%esp),%ecx
304 movl DST(%esp),%edi
305 movl X(%esp),%eax
306
307 rep stosw %ax,%es:(%edi)
308
309 pop %edi
310 pop %eax
311
312 ret
313
314
315## Compare memory regions for equality
316#
317# Compare a given number of bytes (3rd argument)
318# at memory locations defined by 1st and 2nd argument
319# for equality. If the bytes are equal, EAX contains
320# 0.
321#
322SRC=12
323DST=16
324CNT=20
325memcmp:
326 push %esi
327 push %edi
328
329 movl CNT(%esp),%ecx
330 movl DST(%esp),%edi
331 movl SRC(%esp),%esi
332
333 repe cmpsb %es:(%edi),%ds:(%esi)
334 movl %ecx,%eax # %ecx contains the return value (zero on success)
335
336 pop %edi
337 pop %esi
338
339 ret
340
341
342# THIS IS USERSPACE CODE
343.global utext
344utext:
345 xor %ax,%ax
346 mov %ax,%ds
347 mov %ax,%es
348 mov %ax,%fs
349 mov %ax,%gs
3500:
351 int $48
352 jmp 0b
353 # not reached
354utext_end:
355
356.data
357.global utext_size
358utext_size:
359 .long utext_end - utext
360
361
362#.section K_DATA_START
363.global interrupt_handler_size
364
365interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
Note: See TracBrowser for help on using the repository browser.