bios_disk.S revision 1.8 1 /* $NetBSD: bios_disk.S,v 1.8 2000/05/21 16:59:28 perry 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 0x2" to read sectors from disk into memory
63 # Call with %ah = 0x2
64 # %al = number of sectors
65 # %ch = cylinder
66 # %cl = sector
67 # %dh = head
68 # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
69 # %es:%bx = segment:offset of buffer
70 # Return:
71 # %al = 0x0 on success; err code on failure
72 */
73 ENTRY(biosread)
74 pushl %ebp
75 movl %esp, %ebp
76 pushl %ebx
77 push %ecx
78 push %edx
79 push %esi
80 push %edi
81
82 movb 16(%ebp), %dh
83 movw 12(%ebp), %cx
84 xchgb %ch, %cl # cylinder; the highest 2 bits of cyl is in %cl
85 rorb $2, %cl
86 movb 20(%ebp), %al
87 orb %al, %cl
88 incb %cl # sector; sec starts from 1, not 0
89 movb 8(%ebp), %dl # device
90 movl 28(%ebp), %ebx # offset
91 # prot_to_real will set %es to BOOTSEG
92
93 call _C_LABEL(prot_to_real) # enter real mode
94
95 movb $0x2, %ah # subfunction
96 addr32
97 movb 24(%ebp), %al # number of sectors
98 int $0x13
99 setc %bl
100 movb %ah, %bh # save error code
101
102 data32
103 call _C_LABEL(real_to_prot) # back to protected mode
104
105 xorl %eax, %eax
106 movw %bx, %ax # return value in %ax
107
108 pop %edi
109 pop %esi
110 pop %edx
111 pop %ecx
112 popl %ebx
113 popl %ebp
114 ret
115
116 /*
117 #
118 # get_diskinfo(): return a word that represents the
119 # max number of sectors, heads and cylinders for this device
120 #
121 */
122
123 ENTRY(get_diskinfo)
124 pushl %ebp
125 movl %esp, %ebp
126 push %es
127 pushl %ebx
128 push %ecx
129 push %edx
130 push %esi
131 push %edi
132
133 movb 8(%ebp), %dl # diskinfo(drive #)
134
135 call _C_LABEL(prot_to_real) # enter real mode
136
137 movb $0x08, %ah # ask for disk info
138 int $0x13
139 jnc ok
140
141 /*
142 * Urk. Call failed. It is not supported for floppies by old BIOS's.
143 * Guess it's a 15-sector floppy. Initialize all the registers for
144 * documentation, although we only need head and sector counts.
145 */
146 # subb %ah, %ah # %ax = 0
147 # movb %ah, %bh # %bh = 0
148 # movb $2, %bl # %bl bits 0-3 = drive type, 2 = 1.2M
149 movb $79, %ch # max track
150 movb $15, %cl # max sector
151 movb $1, %dh # max head
152 # movb $1, %dl # # floppy drives installed
153 # es:di = parameter table
154 # carry = 0
155
156 ok:
157 data32
158 call _C_LABEL(real_to_prot) # back to protected mode
159
160 /* form a longword representing all this gunk */
161 shll $8, %ecx
162 movb %dh, %cl
163
164 movl %ecx, %eax
165
166 pop %edi
167 pop %esi
168 pop %edx
169 pop %ecx
170 popl %ebx
171 pop %es
172 popl %ebp
173 ret
174
175 /*
176 # int13_extension: check for availibility of int13 extensions.
177 */
178
179 ENTRY(int13_extension)
180 pushl %ebp
181 movl %esp, %ebp
182 pushl %ebx
183 pushl %ecx
184 pushl %edx
185 pushl %esi
186 pushl %edi
187
188 movb 8(%ebp), %dl # drive #
189 movw $0x55aa, %bx
190
191 call _C_LABEL(prot_to_real) # enter real mode
192
193 movb $0x41, %ah # ask for disk info
194 int $0x13
195 setnc %dl
196
197 data32
198 CALL _C_LABEL(real_to_prot) # switch back
199
200 xorl %eax, %eax
201 movb %dl, %al # return value in %ax
202
203 cmpw $0xaa55, %bx
204 sete %dl
205 andb %dl, %al
206
207 andb %cl, %al
208
209 popl %edi
210 popl %esi
211 popl %edx
212 popl %ecx
213 popl %ebx
214 popl %ebp
215 ret
216
217 /*
218 # BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
219 # Call with %ah = 0x42
220 # %ds:%si = parameter block
221 # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
222 # Return:
223 # %al = 0x0 on success; err code on failure
224 */
225 ENTRY(biosextread)
226 pushl %ebp
227 movl %esp, %ebp
228 pushl %ebx
229 push %ecx
230 push %edx
231 push %esi
232 push %edi
233
234 movb 8(%ebp), %dl # device
235 movl 12(%ebp), %esi # parameter block
236
237 call _C_LABEL(prot_to_real) # enter real mode
238
239 movb $0x42, %ah # subfunction
240 int $0x13
241 setc %bl
242 movb %ah, %bh # save error code
243
244 data32
245 call _C_LABEL(real_to_prot) # back to protected mode
246
247 xorl %eax, %eax
248 movw %bx, %ax # return value in %ax
249
250 pop %edi
251 pop %esi
252 pop %edx
253 pop %ecx
254 popl %ebx
255 popl %ebp
256 ret
257
258 ENTRY(int13_getextinfo)
259 pushl %ebp
260 movl %esp, %ebp
261 pushl %ebx
262 push %ecx
263 push %edx
264 push %esi
265 push %edi
266
267 movb 8(%ebp), %dl # device
268 movl 12(%ebp), %esi # parameter block
269 movl $0x01a, (%esi) # length (v 1.x)
270
271 call _C_LABEL(prot_to_real) # enter real mode
272
273 movb $0x48, %ah # subfunction
274 int $0x13
275 setc %bl
276
277 data32
278 call _C_LABEL(real_to_prot) # back to protected mode
279
280 xorl %eax, %eax
281 movb %bl, %al # return value in %ax
282
283 pop %edi
284 pop %esi
285 pop %edx
286 pop %ecx
287 popl %ebx
288 popl %ebp
289 ret
290