blob: 239aaa9cfa47df0e41996a1dfc53aa3844a53835 [file] [log] [blame]
wdenk591dda52002-11-18 00:14:45 +00001/*
2 * (C) Copyright 2002
Albert ARIBAUD60fbc8d2011-08-04 18:45:45 +02003 * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
wdenk57b2d802003-06-27 21:31:46 +00004 *
wdenk591dda52002-11-18 00:14:45 +00005 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24/*
25 * Based on msbios.c from rolo 1.6:
26 *----------------------------------------------------------------------
27 * (C) Copyright 2000
28 * Sysgo Real-Time Solutions GmbH
29 * Klein-Winternheim, Germany
30 *----------------------------------------------------------------------
31 */
32
wdenkabda5ca2003-05-31 18:35:21 +000033#include "bios.h"
34
wdenk591dda52002-11-18 00:14:45 +000035/*
36 * During it's initialization phase, before switching to protected
37 * mode, the Linux Kernel makes a few BIOS calls. This won't work
38 * if the board does not have a BIOS.
39 *
40 * This is a very minimalisic BIOS that supplies just enough
41 * functionality to keep the Linux Kernel happy. It is NOT
42 * a general purpose replacement for a real BIOS !!
43 */
44
wdenk591dda52002-11-18 00:14:45 +000045.section .bios, "ax"
46.code16
47.org 0
wdenk57b2d802003-06-27 21:31:46 +000048 /* a call to f000:0 should warmboot */
wdenkabda5ca2003-05-31 18:35:21 +000049 jmp realmode_reset
wdenk57b2d802003-06-27 21:31:46 +000050
wdenk591dda52002-11-18 00:14:45 +000051.globl rm_int00
Graeme Russ1aafcc92009-11-24 20:04:19 +110052.hidden rm_int00
53.type rm_int00, @function
wdenk591dda52002-11-18 00:14:45 +000054rm_int00:
55 pushw $0
56 jmp any_interrupt16
57.globl rm_int01
Graeme Russ1aafcc92009-11-24 20:04:19 +110058.hidden rm_int01
59.type rm_int01, @function
wdenk591dda52002-11-18 00:14:45 +000060rm_int01:
61 pushw $1
62 jmp any_interrupt16
63.globl rm_int02
Graeme Russ1aafcc92009-11-24 20:04:19 +110064.hidden rm_int02
65.type rm_int02, @function
wdenk591dda52002-11-18 00:14:45 +000066rm_int02:
67 pushw $2
68 jmp any_interrupt16
69.globl rm_int03
Graeme Russ1aafcc92009-11-24 20:04:19 +110070.hidden rm_int03
71.type rm_int03, @function
wdenk591dda52002-11-18 00:14:45 +000072rm_int03:
73 pushw $3
74 jmp any_interrupt16
75.globl rm_int04
Graeme Russ1aafcc92009-11-24 20:04:19 +110076.hidden rm_int04
77.type rm_int04, @function
wdenk591dda52002-11-18 00:14:45 +000078rm_int04:
79 pushw $4
80 jmp any_interrupt16
81.globl rm_int05
Graeme Russ1aafcc92009-11-24 20:04:19 +110082.hidden rm_int05
83.type rm_int05, @function
wdenk591dda52002-11-18 00:14:45 +000084rm_int05:
85 pushw $5
86 jmp any_interrupt16
87.globl rm_int06
Graeme Russ1aafcc92009-11-24 20:04:19 +110088.hidden rm_int06
89.type rm_int06, @function
wdenk591dda52002-11-18 00:14:45 +000090rm_int06:
91 pushw $6
92 jmp any_interrupt16
93.globl rm_int07
Graeme Russ1aafcc92009-11-24 20:04:19 +110094.hidden rm_int07
95.type rm_int07, @function
wdenk591dda52002-11-18 00:14:45 +000096rm_int07:
97 pushw $7
98 jmp any_interrupt16
99.globl rm_int08
Graeme Russ1aafcc92009-11-24 20:04:19 +1100100.hidden rm_int08
101.type rm_int08, @function
wdenk591dda52002-11-18 00:14:45 +0000102rm_int08:
103 pushw $8
104 jmp any_interrupt16
105.globl rm_int09
Graeme Russ1aafcc92009-11-24 20:04:19 +1100106.hidden rm_int09
107.type rm_int09, @function
wdenk591dda52002-11-18 00:14:45 +0000108rm_int09:
109 pushw $9
110 jmp any_interrupt16
111.globl rm_int0a
Graeme Russ1aafcc92009-11-24 20:04:19 +1100112.hidden rm_int0a
113.type rm_int0a, @function
wdenk591dda52002-11-18 00:14:45 +0000114rm_int0a:
115 pushw $10
116 jmp any_interrupt16
117.globl rm_int0b
Graeme Russ1aafcc92009-11-24 20:04:19 +1100118.hidden rm_int0b
119.type rm_int0b, @function
wdenk591dda52002-11-18 00:14:45 +0000120rm_int0b:
121 pushw $11
122 jmp any_interrupt16
123.globl rm_int0c
Graeme Russ1aafcc92009-11-24 20:04:19 +1100124.hidden rm_int0c
125.type rm_int0c, @function
wdenk591dda52002-11-18 00:14:45 +0000126rm_int0c:
127 pushw $12
128 jmp any_interrupt16
129.globl rm_int0d
Graeme Russ1aafcc92009-11-24 20:04:19 +1100130.hidden rm_int0d
131.type rm_int0d, @function
wdenk591dda52002-11-18 00:14:45 +0000132rm_int0d:
133 pushw $13
134 jmp any_interrupt16
135.globl rm_int0e
Graeme Russ1aafcc92009-11-24 20:04:19 +1100136.hidden rm_int0e
137.type rm_int0e, @function
wdenk591dda52002-11-18 00:14:45 +0000138rm_int0e:
139 pushw $14
140 jmp any_interrupt16
141.globl rm_int0f
Graeme Russ1aafcc92009-11-24 20:04:19 +1100142.hidden rm_int0f
143.type rm_int0f, @function
wdenk591dda52002-11-18 00:14:45 +0000144rm_int0f:
145 pushw $15
146 jmp any_interrupt16
147.globl rm_int10
Graeme Russ1aafcc92009-11-24 20:04:19 +1100148.hidden rm_int10
149.type rm_int10, @function
wdenk591dda52002-11-18 00:14:45 +0000150rm_int10:
151 pushw $16
152 jmp any_interrupt16
153.globl rm_int11
Graeme Russ1aafcc92009-11-24 20:04:19 +1100154.hidden rm_int11
155.type rm_int11, @function
wdenk591dda52002-11-18 00:14:45 +0000156rm_int11:
157 pushw $17
158 jmp any_interrupt16
159.globl rm_int12
Graeme Russ1aafcc92009-11-24 20:04:19 +1100160.hidden rm_int12
161.type rm_int12, @function
wdenk591dda52002-11-18 00:14:45 +0000162rm_int12:
163 pushw $18
164 jmp any_interrupt16
165.globl rm_int13
Graeme Russ1aafcc92009-11-24 20:04:19 +1100166.hidden rm_int13
167.type rm_int13, @function
wdenk591dda52002-11-18 00:14:45 +0000168rm_int13:
169 pushw $19
170 jmp any_interrupt16
171.globl rm_int14
Graeme Russ1aafcc92009-11-24 20:04:19 +1100172.hidden rm_int14
173.type rm_int14, @function
wdenk591dda52002-11-18 00:14:45 +0000174rm_int14:
175 pushw $20
176 jmp any_interrupt16
177.globl rm_int15
Graeme Russ1aafcc92009-11-24 20:04:19 +1100178.hidden rm_int15
179.type rm_int15, @function
wdenk591dda52002-11-18 00:14:45 +0000180rm_int15:
181 pushw $21
182 jmp any_interrupt16
183.globl rm_int16
Graeme Russ1aafcc92009-11-24 20:04:19 +1100184.hidden rm_int16
185.type rm_int16, @function
wdenk591dda52002-11-18 00:14:45 +0000186rm_int16:
187 pushw $22
188 jmp any_interrupt16
189.globl rm_int17
Graeme Russ1aafcc92009-11-24 20:04:19 +1100190.hidden rm_int17
191.type rm_int17, @function
wdenk591dda52002-11-18 00:14:45 +0000192rm_int17:
193 pushw $23
194 jmp any_interrupt16
195.globl rm_int18
Graeme Russ1aafcc92009-11-24 20:04:19 +1100196.hidden rm_int18
197.type rm_int18, @function
wdenk591dda52002-11-18 00:14:45 +0000198rm_int18:
199 pushw $24
200 jmp any_interrupt16
201.globl rm_int19
Graeme Russ1aafcc92009-11-24 20:04:19 +1100202.hidden rm_int19
203.type rm_int19, @function
wdenk591dda52002-11-18 00:14:45 +0000204rm_int19:
205 pushw $25
206 jmp any_interrupt16
207.globl rm_int1a
Graeme Russ1aafcc92009-11-24 20:04:19 +1100208.hidden rm_int1a
209.type rm_int1a, @function
wdenk591dda52002-11-18 00:14:45 +0000210rm_int1a:
211 pushw $26
212 jmp any_interrupt16
213.globl rm_int1b
Graeme Russ1aafcc92009-11-24 20:04:19 +1100214.hidden rm_int1b
215.type rm_int1b, @function
wdenk591dda52002-11-18 00:14:45 +0000216rm_int1b:
217 pushw $27
218 jmp any_interrupt16
219.globl rm_int1c
Graeme Russ1aafcc92009-11-24 20:04:19 +1100220.hidden rm_int1c
221.type rm_int1c, @function
wdenk591dda52002-11-18 00:14:45 +0000222rm_int1c:
223 pushw $28
224 jmp any_interrupt16
225.globl rm_int1d
Graeme Russ1aafcc92009-11-24 20:04:19 +1100226.hidden rm_int1d
227.type rm_int1d, @function
wdenk591dda52002-11-18 00:14:45 +0000228rm_int1d:
229 pushw $29
230 jmp any_interrupt16
231.globl rm_int1e
Graeme Russ1aafcc92009-11-24 20:04:19 +1100232.hidden rm_int1e
233.type rm_int1e, @function
wdenk591dda52002-11-18 00:14:45 +0000234rm_int1e:
235 pushw $30
236 jmp any_interrupt16
237.globl rm_int1f
Graeme Russ1aafcc92009-11-24 20:04:19 +1100238.hidden rm_int1f
239.type rm_int1f, @function
wdenk591dda52002-11-18 00:14:45 +0000240rm_int1f:
241 pushw $31
242 jmp any_interrupt16
243.globl rm_def_int
Graeme Russ1aafcc92009-11-24 20:04:19 +1100244.hidden rm_def_int
245.type rm_def_int, @function
wdenk591dda52002-11-18 00:14:45 +0000246rm_def_int:
247 iret
248
wdenk591dda52002-11-18 00:14:45 +0000249 /*
Graeme Russ6dda1312011-12-19 20:00:40 +1100250 * All interrupt jumptable entries jump to here after pushing the
251 * interrupt vector number onto the stack.
wdenk591dda52002-11-18 00:14:45 +0000252 */
253any_interrupt16:
wdenk57b2d802003-06-27 21:31:46 +0000254 MAKE_BIOS_STACK
wdenk591dda52002-11-18 00:14:45 +0000255
256gs movw OFFS_VECTOR(%bp), %ax
257 cmpw $0x10, %ax
wdenk57b2d802003-06-27 21:31:46 +0000258 je Lint_10h
wdenk591dda52002-11-18 00:14:45 +0000259 cmpw $0x11, %ax
260 je Lint_11h
wdenkabda5ca2003-05-31 18:35:21 +0000261 cmpw $0x12, %ax
262 je Lint_12h
wdenk591dda52002-11-18 00:14:45 +0000263 cmpw $0x13, %ax
264 je Lint_13h
265 cmpw $0x15, %ax
266 je Lint_15h
267 cmpw $0x16, %ax
268 je Lint_16h
wdenkabda5ca2003-05-31 18:35:21 +0000269 cmpw $0x1a, %ax
270 je Lint_1ah
wdenk591dda52002-11-18 00:14:45 +0000271 movw $0xffff, %ax
272 jmp Lout
Graeme Russ6dda1312011-12-19 20:00:40 +1100273Lint_10h:
274 /* VGA BIOS services */
wdenk591dda52002-11-18 00:14:45 +0000275 call bios_10h
276 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000277Lint_11h:
wdenk591dda52002-11-18 00:14:45 +0000278 call bios_11h
279 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000280Lint_12h:
wdenkabda5ca2003-05-31 18:35:21 +0000281 call bios_12h
282 jmp Lout
Graeme Russ6dda1312011-12-19 20:00:40 +1100283Lint_13h:
284 /* BIOS disk services */
wdenk591dda52002-11-18 00:14:45 +0000285 call bios_13h
286 jmp Lout
Graeme Russ6dda1312011-12-19 20:00:40 +1100287Lint_15h:
288 /* Misc. BIOS services */
wdenk591dda52002-11-18 00:14:45 +0000289 call bios_15h
290 jmp Lout
Graeme Russ6dda1312011-12-19 20:00:40 +1100291Lint_16h:
292 /* keyboard services */
wdenk591dda52002-11-18 00:14:45 +0000293 call bios_16h
294 jmp Lout
Graeme Russ6dda1312011-12-19 20:00:40 +1100295Lint_1ah:
296 /* PCI bios */
wdenkabda5ca2003-05-31 18:35:21 +0000297 call bios_1ah
298 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000299Lout:
wdenk591dda52002-11-18 00:14:45 +0000300 cmpw $0, %ax
301 je Lhandeled
wdenk57b2d802003-06-27 21:31:46 +0000302
Graeme Russ6dda1312011-12-19 20:00:40 +1100303 /*
304 * Insert code for unhandeled INTs here.
wdenk591dda52002-11-18 00:14:45 +0000305 *
Graeme Russ6dda1312011-12-19 20:00:40 +1100306 * ROLO prints a message to the console we could do that but then
307 * we're in 16bit mode so we'll have to get back into 32bit mode
308 * to use the console I/O routines (if we do this we should make
309 * int 0x10 and int 0x16 work as well)
wdenk591dda52002-11-18 00:14:45 +0000310 */
311Lhandeled:
wdenkabda5ca2003-05-31 18:35:21 +0000312 RESTORE_CALLERS_STACK
wdenk591dda52002-11-18 00:14:45 +0000313
Graeme Russ6dda1312011-12-19 20:00:40 +1100314 /* dump vector number */
315 addw $2,%sp
316
317 /* return from interrupt */
318 iret
wdenk591dda52002-11-18 00:14:45 +0000319
320/*
321 ************************************************************
Wolfgang Denka1be4762008-05-20 16:00:29 +0200322 * BIOS interrupt 10h -- VGA services
wdenk591dda52002-11-18 00:14:45 +0000323 ************************************************************
324 */
325bios_10h:
326gs movw OFFS_AX(%bp), %ax
327 shrw $8, %ax
328 cmpw $0x3, %ax
329 je Lcur_pos
330 cmpw $0xf, %ax
331 je Lvid_state
332 cmpw $0x12, %ax
333 je Lvid_cfg
334 movw $0xffff, %ax
335 ret
Graeme Russ6dda1312011-12-19 20:00:40 +1100336Lcur_pos:
337 /* Read Cursor Position and Size */
wdenk591dda52002-11-18 00:14:45 +0000338gs movw $0, OFFS_CX(%bp)
339gs movw $0, OFFS_DX(%bp)
340 xorw %ax, %ax
341 ret
Graeme Russ6dda1312011-12-19 20:00:40 +1100342Lvid_state:
343 /* Get Video State - 80 columns, 80x25, 16 colors */
344gs movw $(80 << 8|0x03), OFFS_AX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000345gs movw $0, OFFS_BX(%bp)
346 xorw %ax, %ax
347 ret
Graeme Russ6dda1312011-12-19 20:00:40 +1100348Lvid_cfg:
349 /* Video Subsystem Configuration (EGA/VGA) - indicate CGA/MDA/HGA */
350gs movw $0x10, OFFS_BX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000351 xorw %ax, %ax
352 ret
353
wdenk591dda52002-11-18 00:14:45 +0000354/*
355 ************************************************************
356 * BIOS interrupt 11h -- Equipment determination
357 ************************************************************
358 */
359
360bios_11h:
wdenkabda5ca2003-05-31 18:35:21 +0000361cs movw bios_equipment, %ax
wdenk57b2d802003-06-27 21:31:46 +0000362gs movw %ax, OFFS_AX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000363 xorw %ax, %ax
364 ret
365
wdenk591dda52002-11-18 00:14:45 +0000366/*
367 ************************************************************
Wolfgang Denka1be4762008-05-20 16:00:29 +0200368 * BIOS interrupt 12h -- Get Memory Size
wdenkabda5ca2003-05-31 18:35:21 +0000369 ************************************************************
370 */
371bios_12h:
372cs movw ram_in_64kb_chunks, %ax
373 cmpw $0xa, %ax
374 ja b12_more_than_640k
375 shlw $6, %ax
376 jmp b12_return
377b12_more_than_640k:
378 movw $0x280, %ax
379b12_return:
Graeme Russ6dda1312011-12-19 20:00:40 +1100380 /* return number of kilobytes in ax */
381gs movw %ax, OFFS_AX(%bp)
wdenkabda5ca2003-05-31 18:35:21 +0000382
383gs movw OFFS_FLAGS(%bp), %ax
Graeme Russ6dda1312011-12-19 20:00:40 +1100384
385 /* clear carry -- function succeeded */
386 andw $0xfffe, %ax
wdenkabda5ca2003-05-31 18:35:21 +0000387gs movw %ax, OFFS_FLAGS(%bp)
388
389 xorw %ax, %ax
390 ret
391
wdenkabda5ca2003-05-31 18:35:21 +0000392/*
393 ************************************************************
wdenk591dda52002-11-18 00:14:45 +0000394 * BIOS interrupt 13h -- Disk services
395 ************************************************************
396 */
397bios_13h:
398gs movw OFFS_AX(%bp), %ax
399 shrw $8, %ax
400 cmpw $0x15, %ax
401 je Lfunc_15h
402 movw $0xffff, %ax
403 ret
wdenk57b2d802003-06-27 21:31:46 +0000404Lfunc_15h:
wdenk591dda52002-11-18 00:14:45 +0000405gs movw OFFS_AX(%bp), %ax
Graeme Russ6dda1312011-12-19 20:00:40 +1100406
407 /* return AH=0->drive not present */
408 andw $0x00ff, %ax
wdenk591dda52002-11-18 00:14:45 +0000409gs movw %ax, OFFS_AX(%bp)
410 xorw %ax, %ax
411 ret
wdenk57b2d802003-06-27 21:31:46 +0000412
wdenk591dda52002-11-18 00:14:45 +0000413/*
414 ***********************************************************
415 * BIOS interrupt 15h -- Miscellaneous services
416 ***********************************************************
417 */
418bios_15h:
419gs movw OFFS_AX(%bp), %ax
420 shrw $8, %ax
421 cmpw $0xc0, %ax
422 je Lfunc_c0h
423 cmpw $0xe8, %ax
424 je Lfunc_e8h
425 cmpw $0x88, %ax
426 je Lfunc_88h
427 movw $0xffff, %ax
428 ret
429
Graeme Russ6dda1312011-12-19 20:00:40 +1100430Lfunc_c0h:
431 /* Return System Configuration Parameters (PS2 only) */
wdenk591dda52002-11-18 00:14:45 +0000432gs movw OFFS_FLAGS(%bp), %ax
Graeme Russ6dda1312011-12-19 20:00:40 +1100433
434 /* return carry -- function not supported */
435 orw $1, %ax
wdenk591dda52002-11-18 00:14:45 +0000436gs movw %ax, OFFS_FLAGS(%bp)
437 xorw %ax, %ax
438 ret
wdenk57b2d802003-06-27 21:31:46 +0000439
wdenk591dda52002-11-18 00:14:45 +0000440Lfunc_e8h:
441gs movw OFFS_AX(%bp), %ax
442 andw $0xff, %ax
443 cmpw $1, %ax
444 je Lfunc_e801h
445gs movw OFFS_FLAGS(%bp), %ax
Graeme Russ6dda1312011-12-19 20:00:40 +1100446
447 /* return carry -- function not supported */
448 orw $1, %ax
wdenk591dda52002-11-18 00:14:45 +0000449gs movw %ax, OFFS_FLAGS(%bp)
450 xorw %ax, %ax
451 ret
wdenk57b2d802003-06-27 21:31:46 +0000452
Graeme Russ6dda1312011-12-19 20:00:40 +1100453Lfunc_e801h:
454 /* Get memory size for >64M Configurations */
wdenkabda5ca2003-05-31 18:35:21 +0000455cs movw ram_in_64kb_chunks, %ax
456 cmpw $0x100, %ax
457 ja e801_more_than_16mb
Graeme Russ6dda1312011-12-19 20:00:40 +1100458
459 /* multiply by 64 */
460 shlw $6, %ax
wdenk57b2d802003-06-27 21:31:46 +0000461
Graeme Russ6dda1312011-12-19 20:00:40 +1100462 /* 1st meg does not count */
463 subw $0x400, %ax
464
465 /* return memory size between 1M and 16M in 1kb chunks in AX and CX */
466gs movw %ax, OFFS_AX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000467gs movw %ax, OFFS_CX(%bp)
Graeme Russ6dda1312011-12-19 20:00:40 +1100468
469 /* set BX and DX to 0*/
470gs movw $0, OFFS_BX(%bp)
wdenk57b2d802003-06-27 21:31:46 +0000471gs movw $0, OFFS_DX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000472gs movw OFFS_FLAGS(%bp), %ax
Graeme Russ6dda1312011-12-19 20:00:40 +1100473
474 /* clear carry -- function succeeded */
475 andw $0xfffe, %ax
wdenk591dda52002-11-18 00:14:45 +0000476gs movw %ax, OFFS_FLAGS(%bp)
477 xorw %ax, %ax
478 ret
wdenk57b2d802003-06-27 21:31:46 +0000479
wdenkabda5ca2003-05-31 18:35:21 +0000480e801_more_than_16mb:
Graeme Russ6dda1312011-12-19 20:00:40 +1100481 /* subtract 16MB */
482 subw $0x100, %ax
wdenk57b2d802003-06-27 21:31:46 +0000483
Graeme Russ6dda1312011-12-19 20:00:40 +1100484 /* return 0x3c00 (16MB-1MB) in AX and CX */
485gs movw $0x3c00, OFFS_AX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000486gs movw $0x3c00, OFFS_CX(%bp)
Graeme Russ6dda1312011-12-19 20:00:40 +1100487
488 /* set BX and DX to number of 64kb chunks above 16MB */
489gs movw %ax, OFFS_BX(%bp)
wdenk57b2d802003-06-27 21:31:46 +0000490gs movw %ax, OFFS_DX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000491
492gs movw OFFS_FLAGS(%bp), %ax
Graeme Russ6dda1312011-12-19 20:00:40 +1100493
494 /* clear carry -- function succeeded */
495 andw $0xfffe, %ax
wdenk591dda52002-11-18 00:14:45 +0000496gs movw %ax, OFFS_FLAGS(%bp)
497 xorw %ax, %ax
498 ret
499
500Lfunc_88h:
wdenkabda5ca2003-05-31 18:35:21 +0000501cs movw ram_in_64kb_chunks, %ax
502 cmpw $0x100, %ax
503 jna b88_not_more_than16
504 movw $0x100, %ax
505b88_not_more_than16:
wdenk591dda52002-11-18 00:14:45 +0000506 shlw $6, %ax
wdenk57b2d802003-06-27 21:31:46 +0000507
Graeme Russ6dda1312011-12-19 20:00:40 +1100508 /* 1st meg does not count */
509 subw $0x400, %ax
510
511 /* return number of kilobytes between 16MB and 16MB in ax */
512gs movw %ax, OFFS_AX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000513
514gs movw OFFS_FLAGS(%bp), %ax
Graeme Russ6dda1312011-12-19 20:00:40 +1100515
516 /* clear carry -- function succeeded */
517 andw $0xfffe, %ax
wdenk591dda52002-11-18 00:14:45 +0000518gs movw %ax, OFFS_FLAGS(%bp)
519
520 xorw %ax, %ax
521 ret
522
wdenk591dda52002-11-18 00:14:45 +0000523/*
524 ************************************************************
525 * BIOS interrupt 16h -- keyboard services
526 ************************************************************
527 */
528bios_16h:
529gs movw OFFS_AX(%bp), %ax
530 shrw $8, %ax
531 cmpw $0x03, %ax
532 je Lfunc_03h
533 movw $0xffff, %ax
534 ret
535Lfunc_03h:
Graeme Russ6dda1312011-12-19 20:00:40 +1100536 /* do nothing -- function not supported */
537 xorw %ax, %ax
wdenk591dda52002-11-18 00:14:45 +0000538 ret
539
wdenkabda5ca2003-05-31 18:35:21 +0000540/*
541 ************************************************************
542 * BIOS interrupt 1ah -- PCI bios
543 ************************************************************
544 */
545bios_1ah:
546gs movw OFFS_AX(%bp), %ax
547 cmpb $0xb1, %ah
548 je Lfunc_b1h
549 movw $0xffff, %ax
550 ret
551Lfunc_b1h:
552 call realmode_pci_bios
Graeme Russ6dda1312011-12-19 20:00:40 +1100553
554 /* do nothing -- function not supported */
555 xorw %ax, %ax
wdenkabda5ca2003-05-31 18:35:21 +0000556 ret
557
wdenk591dda52002-11-18 00:14:45 +0000558
559.globl ram_in_64kb_chunks
Graeme Russ1aafcc92009-11-24 20:04:19 +1100560.hidden ram_in_64kb_chunks
561.type ram_in_64kb_chunks, @function
wdenk591dda52002-11-18 00:14:45 +0000562ram_in_64kb_chunks:
Wolfgang Denka1be4762008-05-20 16:00:29 +0200563 .word 0
wdenk591dda52002-11-18 00:14:45 +0000564
565.globl bios_equipment
Graeme Russ1aafcc92009-11-24 20:04:19 +1100566.hidden bios_equipment
567.type bios_equipment, @function
wdenk591dda52002-11-18 00:14:45 +0000568bios_equipment:
Wolfgang Denka1be4762008-05-20 16:00:29 +0200569 .word 0