Subversion Repositories HelenOS-historic

Rev

Rev 316 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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