source: mainline/arch/ia32/src/asm.S@ a55f97f

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

Typing error fixed

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