Subversion Repositories HelenOS-historic

Rev

Rev 137 | Rev 142 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
132 vana 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
 
137 vana 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
132 vana 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
#
58
paging_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
65
0:
66
	popl %eax
67
	ret
68
 
69
 
70
## Enable local APIC
71
#
72
# Enable local APIC in MSR.
73
#
74
enable_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
 
137 vana 118
 
141 vana 119
# CLNT
120
  pushfl;
121
	pop %eax;
122
	and $0xFFFFBFFF;
123
	push %eax;
124
	popfl;
125
 
126
 
127
 
137 vana 128
# Test if this is interrupt with error word or not
132 vana 129
	mov $\i,%cl;
130
	movl $1,%eax;
131
	test $0xe0,%cl;
132
	jnz 0f;
136 vana 133
	and $0x1f,%cl;
132 vana 134
	shl %cl,%eax;
135
	and $ERROR_WORD_INTERRUPT_LIST,%eax;
136 vana 136
	jz 0f;
132 vana 137
 
137 vana 138
 
139
# Return with error word
132 vana 140
	popa;
141
	pop %ebp;
137 vana 142
	add $4,%esp;    # Skip error word
132 vana 143
	iret;
144
 
145
0:
137 vana 146
# Return with no error word
132 vana 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 !!!
157
IDT_ITEMS=64
158
interrupt_handlers:
159
h_start:
160
	handler 0 64
161
#	handler 64 128	
162
#	handler 128 192
163
#	handler 192 256
164
h_end:
165
 
166
 
167
## I/O input (byte)
168
#
169
# Get a byte from I/O port and store it AL.
170
#
171
inb:
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
#
184
inw:
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
#
197
inl:
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
#
210
outb:
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
#
228
outw:
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
#
246
outl:
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
#
267
SRC=8
268
DST=12
269
CNT=16
270
memcopy:
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
#
293
DST=8
294
CNT=12
295
X=16
296
memsetb:
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
#
319
DST=8
320
CNT=12
321
X=16
322
memsetw:
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
#
346
SRC=12
347
DST=16
348
CNT=20
349
memcmp:
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
375
utext:
136 vana 376
	xor %ax,%ax;
377
	mov %ax,%ds;
378
	mov %ax,%es;
379
	mov %ax,%fs;
380
	mov %ax,%gs;
132 vana 381
0:
382
#	movl $0xdeadbeaf, %eax
136 vana 383
  int $48
384
	cli;
385
	sti;
132 vana 386
	jmp 0b
387
	# not reached
388
utext_end:
389
 
390
.data
391
.global utext_size
392
utext_size:
393
	.long utext_end - utext 
394
 
395
 
396
#.section K_DATA_START
397
.global interrupt_handler_size
398
 
399
interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS