bios_disk.S revision 1.8.8.1 1 /* $NetBSD: bios_disk.S,v 1.8.8.1 2002/10/18 02:38:09 nathanw Exp $ */
2
3 /*
4 * Ported to boot 386BSD by Julian Elischer (julian (at) tfs.com) Sept 1992
5 *
6 * Mach Operating System
7 * Copyright (c) 1992, 1991 Carnegie Mellon University
8 * All Rights Reserved.
9 *
10 * Permission to use, copy, modify and distribute this software and its
11 * documentation is hereby granted, provided that both the copyright
12 * notice and this permission notice appear in all copies of the
13 * software, derivative works or modified versions, and any portions
14 * thereof, and that both notices appear in supporting documentation.
15 *
16 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
18 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19 *
20 * Carnegie Mellon requests users of this software to return to
21 *
22 * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
23 * School of Computer Science
24 * Carnegie Mellon University
25 * Pittsburgh PA 15213-3890
26 *
27 * any improvements or extensions that they make and grant Carnegie Mellon
28 * the rights to redistribute these changes.
29 */
30
31 /*
32 Copyright 1988, 1989, 1990, 1991, 1992
33 by Intel Corporation, Santa Clara, California.
34
35 All Rights Reserved
36
37 Permission to use, copy, modify, and distribute this software and
38 its documentation for any purpose and without fee is hereby
39 granted, provided that the above copyright notice appears in all
40 copies and that both the copyright notice and this permission notice
41 appear in supporting documentation, and that the name of Intel
42 not be used in advertising or publicity pertaining to distribution
43 of the software without specific, written prior permission.
44
45 INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
46 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
47 IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
48 CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
49 LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
50 NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
51 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
52 */
53
54 /* extracted from netbsd:sys/arch/i386/boot/bios.S */
55
56 #include <machine/asm.h>
57
58 #define addr32 .byte 0x67
59 #define data32 .byte 0x66
60
61 /*
62 # BIOS call "INT 0x13 Function 0x0" to reset the disk subsystem
63 # Call with %ah = 0x0
64 # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
65 # Return:
66 # %al = 0x0 on success; err code on failure
67 */
68 ENTRY(biosdiskreset)
69 pushl %ebp
70 movl %esp, %ebp
71 pushl %ebx
72 push %edx
73 push %edi
74
75 movb 8(%ebp), %dl # device
76
77 call _C_LABEL(prot_to_real) # enter real mode
78
79 movb $0x0, %ah # subfunction
80 int $0x13
81 setc %bl
82 movb %ah, %bh # save error code
83
84 data32
85 call _C_LABEL(real_to_prot) # back to protected mode
86
87 xorl %eax, %eax
88 movw %bx, %ax # return value in %ax
89
90 pop %edi
91 pop %edx
92 popl %ebx
93 popl %ebp
94 ret
95
96 /*
97 # BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
98 # Call with %ah = 0x2
99 # %al = number of sectors
100 # %ch = cylinder
101 # %cl = sector
102 # %dh = head
103 # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
104 # %es:%bx = segment:offset of buffer
105 # Return:
106 # %al = 0x0 on success; err code on failure
107 #
108 # Note: On failure, you must reset the disk with biosdiskreset() before
109 # sending another command.
110 */
111 ENTRY(biosread)
112 pushl %ebp
113 movl %esp, %ebp
114 pushl %ebx
115 push %ecx
116 push %edx
117 push %esi
118 push %edi
119
120 movb 16(%ebp), %dh
121 movw 12(%ebp), %cx
122 xchgb %ch, %cl # cylinder; the highest 2 bits of cyl is in %cl
123 rorb $2, %cl
124 movb 20(%ebp), %al
125 orb %al, %cl
126 incb %cl # sector; sec starts from 1, not 0
127 movb 8(%ebp), %dl # device
128 movl 28(%ebp), %ebx # offset
129 # prot_to_real will set %es to BOOTSEG
130
131 call _C_LABEL(prot_to_real) # enter real mode
132
133 movb $0x2, %ah # subfunction
134 addr32
135 movb 24(%ebp), %al # number of sectors
136 int $0x13
137 setc %bl
138 movb %ah, %bh # save error code
139
140 data32
141 call _C_LABEL(real_to_prot) # back to protected mode
142
143 xorl %eax, %eax
144 movw %bx, %ax # return value in %ax
145
146 pop %edi
147 pop %esi
148 pop %edx
149 pop %ecx
150 popl %ebx
151 popl %ebp
152 ret
153
154 /*
155 #
156 # get_diskinfo(): return a word that represents the
157 # max number of sectors, heads and cylinders for this device
158 #
159 */
160
161 ENTRY(get_diskinfo)
162 pushl %ebp
163 movl %esp, %ebp
164 push %es
165 pushl %ebx
166 push %ecx
167 push %edx
168 push %esi
169 push %edi
170
171 movb 8(%ebp), %dl # diskinfo(drive #)
172
173 call _C_LABEL(prot_to_real) # enter real mode
174
175 movb $0x08, %ah # ask for disk info
176 int $0x13
177 jnc ok
178
179 /*
180 * Urk. Call failed. It is not supported for floppies by old BIOS's.
181 * Guess it's a 15-sector floppy. Initialize all the registers for
182 * documentation, although we only need head and sector counts.
183 */
184 # subb %ah, %ah # %ax = 0
185 # movb %ah, %bh # %bh = 0
186 # movb $2, %bl # %bl bits 0-3 = drive type, 2 = 1.2M
187 movb $79, %ch # max track
188 movb $15, %cl # max sector
189 movb $1, %dh # max head
190 # movb $1, %dl # # floppy drives installed
191 # es:di = parameter table
192 # carry = 0
193
194 ok:
195 data32
196 call _C_LABEL(real_to_prot) # back to protected mode
197
198 /* form a longword representing all this gunk */
199 shll $8, %ecx
200 movb %dh, %cl
201
202 movl %ecx, %eax
203
204 pop %edi
205 pop %esi
206 pop %edx
207 pop %ecx
208 popl %ebx
209 pop %es
210 popl %ebp
211 ret
212
213 /*
214 # int13_extension: check for availibility of int13 extensions.
215 */
216
217 ENTRY(int13_extension)
218 pushl %ebp
219 movl %esp, %ebp
220 pushl %ebx
221 pushl %ecx
222 pushl %edx
223 pushl %esi
224 pushl %edi
225
226 movb 8(%ebp), %dl # drive #
227 movw $0x55aa, %bx
228
229 call _C_LABEL(prot_to_real) # enter real mode
230
231 movb $0x41, %ah # ask for disk info
232 int $0x13
233 setnc %dl
234
235 data32
236 CALL _C_LABEL(real_to_prot) # switch back
237
238 xorl %eax, %eax
239 movb %dl, %al # return value in %ax
240
241 cmpw $0xaa55, %bx
242 sete %dl
243 andb %dl, %al
244
245 andb %cl, %al
246
247 popl %edi
248 popl %esi
249 popl %edx
250 popl %ecx
251 popl %ebx
252 popl %ebp
253 ret
254
255 /*
256 # BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
257 # Call with %ah = 0x42
258 # %ds:%si = parameter block
259 # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
260 # Return:
261 # %al = 0x0 on success; err code on failure
262 */
263 ENTRY(biosextread)
264 pushl %ebp
265 movl %esp, %ebp
266 pushl %ebx
267 push %ecx
268 push %edx
269 push %esi
270 push %edi
271
272 movb 8(%ebp), %dl # device
273 movl 12(%ebp), %esi # parameter block
274
275 call _C_LABEL(prot_to_real) # enter real mode
276
277 movb $0x42, %ah # subfunction
278 int $0x13
279 setc %bl
280 movb %ah, %bh # save error code
281
282 data32
283 call _C_LABEL(real_to_prot) # back to protected mode
284
285 xorl %eax, %eax
286 movw %bx, %ax # return value in %ax
287
288 pop %edi
289 pop %esi
290 pop %edx
291 pop %ecx
292 popl %ebx
293 popl %ebp
294 ret
295
296 ENTRY(int13_getextinfo)
297 pushl %ebp
298 movl %esp, %ebp
299 pushl %ebx
300 push %ecx
301 push %edx
302 push %esi
303 push %edi
304
305 movb 8(%ebp), %dl # device
306 movl 12(%ebp), %esi # parameter block
307 movl $0x01a, (%esi) # length (v 1.x)
308
309 call _C_LABEL(prot_to_real) # enter real mode
310
311 movb $0x48, %ah # subfunction
312 int $0x13
313 setc %bl
314
315 data32
316 call _C_LABEL(real_to_prot) # back to protected mode
317
318 xorl %eax, %eax
319 movb %bl, %al # return value in %ax
320
321 pop %edi
322 pop %esi
323 pop %edx
324 pop %ecx
325 popl %ebx
326 popl %ebp
327 ret
328