source: mainline/arch/ia32/src/asm.S@ 8e3f47b3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8e3f47b3 was 8e3f47b3, checked in by Sergey Bondari <bondari@…>, 20 years ago

ia-32 memcmp inline

  • Property mode set to 100644
File size: 4.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 memsetb
41.global memsetw
42
43## Turn paging on
44#
45# Enable paging and write-back caching in CR0.
46#
47paging_on:
48 movl %cr0,%edx
49 orl $(1<<31),%edx # paging on
50 andl $~((1<<30)|(1<<29)),%edx # clear Cache Disable and not Write Though
51 movl %edx,%cr0
52 jmp 0f
530:
54 ret
55
56
57## Enable local APIC
58#
59# Enable local APIC in MSR.
60#
61enable_l_apic_in_msr:
62 push %eax
63
64 movl $0x1b, %ecx
65 rdmsr
66 orl $(1<<11),%eax
67 orl $(0xfee00000),%eax
68 wrmsr
69
70 pop %eax
71 ret
72
73
74## Declare interrupt handlers
75#
76# Declare interrupt handlers for n interrupt
77# vectors starting at vector i.
78#
79# The handlers setup data segment registers
80# and call trap_dispatcher().
81#
82.macro handler i n
83 push %ebp
84 movl %esp,%ebp
85 pusha
86
87 push %ds
88 push %es
89
90 # we must fill the data segment registers
91 movw $16,%ax
92 movw %ax,%ds
93 movw %ax,%es
94
95 movl $(\i),%edi
96 pushl %ebp
97 addl $4,(%esp)
98 pushl %edi
99 call trap_dispatcher
100 addl $8,%esp
101
102 pop %es
103 pop %ds
104
105
106# CLNT
107 pushfl
108 pop %eax
109 and $0xFFFFBFFF,%eax
110 push %eax
111 popfl
112
113
114
115# Test if this is interrupt with error word or not
116 mov $\i,%cl
117 movl $1,%eax
118 test $0xe0,%cl
119 jnz 0f
120 and $0x1f,%cl
121 shl %cl,%eax
122 and $ERROR_WORD_INTERRUPT_LIST,%eax
123 jz 0f
124
125
126# Return with error word
127 popa
128 pop %ebp
129 add $4,%esp # Skip error word
130 iret
131
1320:
133# Return with no error word
134 popa
135 pop %ebp
136 iret
137
138 .if (\n-\i)-1
139 handler "(\i+1)",\n
140 .endif
141.endm
142
143# keep in sync with pm.h !!!
144IDT_ITEMS=64
145interrupt_handlers:
146h_start:
147 handler 0 64
148# handler 64 128
149# handler 128 192
150# handler 192 256
151h_end:
152
153
154## Fill memory with bytes
155#
156# Fill a given number of bytes (2nd argument)
157# at memory defined by 1st argument with the
158# byte value defined by 3rd argument.
159#
160DST=12
161CNT=16
162X=20
163memsetb:
164 push %eax
165 push %edi
166
167 movl CNT(%esp),%ecx
168 movl DST(%esp),%edi
169 movl X(%esp),%eax
170
171 rep stosb %al,%es:(%edi)
172
173 pop %edi
174 pop %eax
175 ret
176
177
178## Fill memory with words
179#
180# Fill a given number of words (2nd argument)
181# at memory defined by 1st argument with the
182# word value defined by 3rd argument.
183#
184DST=12
185CNT=16
186X=20
187memsetw:
188 push %eax
189 push %edi
190
191 movl CNT(%esp),%ecx
192 movl DST(%esp),%edi
193 movl X(%esp),%eax
194
195 rep stosw %ax,%es:(%edi)
196
197 pop %edi
198 pop %eax
199
200 ret
201
202
203# THIS IS USERSPACE CODE
204.global utext
205utext:
206 xor %ax,%ax
207 mov %ax,%ds
208 mov %ax,%es
209 mov %ax,%fs
210 mov %ax,%gs
2110:
212 int $48
213 jmp 0b
214 # not reached
215utext_end:
216
217.data
218.global utext_size
219utext_size:
220 .long utext_end - utext
221
222.global interrupt_handler_size
223
224interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
Note: See TracBrowser for help on using the repository browser.