📄 bios.s
字号:
/* * (C) Copyright 2002 * Daniel Engstr鰉, Omicron Ceti AB, daniel@omicron.se * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA *//* * Based on msbios.c from rolo 1.6: *---------------------------------------------------------------------- * (C) Copyright 2000 * Sysgo Real-Time Solutions GmbH * Klein-Winternheim, Germany *---------------------------------------------------------------------- */#include "bios.h"/* * During it's initialization phase, before switching to protected * mode, the Linux Kernel makes a few BIOS calls. This won't work * if the board does not have a BIOS. * * This is a very minimalisic BIOS that supplies just enough * functionality to keep the Linux Kernel happy. It is NOT * a general purpose replacement for a real BIOS !! */.section .bios, "ax".code16.org 0 /* a call to f000:0 should warmboot */ jmp realmode_reset.globl rm_int00rm_int00: pushw $0 jmp any_interrupt16.globl rm_int01rm_int01: pushw $1 jmp any_interrupt16.globl rm_int02rm_int02: pushw $2 jmp any_interrupt16.globl rm_int03rm_int03: pushw $3 jmp any_interrupt16.globl rm_int04rm_int04: pushw $4 jmp any_interrupt16.globl rm_int05rm_int05: pushw $5 jmp any_interrupt16.globl rm_int06rm_int06: pushw $6 jmp any_interrupt16.globl rm_int07rm_int07: pushw $7 jmp any_interrupt16.globl rm_int08rm_int08: pushw $8 jmp any_interrupt16.globl rm_int09rm_int09: pushw $9 jmp any_interrupt16.globl rm_int0arm_int0a: pushw $10 jmp any_interrupt16.globl rm_int0brm_int0b: pushw $11 jmp any_interrupt16.globl rm_int0crm_int0c: pushw $12 jmp any_interrupt16.globl rm_int0drm_int0d: pushw $13 jmp any_interrupt16.globl rm_int0erm_int0e: pushw $14 jmp any_interrupt16.globl rm_int0frm_int0f: pushw $15 jmp any_interrupt16.globl rm_int10rm_int10: pushw $16 jmp any_interrupt16.globl rm_int11rm_int11: pushw $17 jmp any_interrupt16.globl rm_int12rm_int12: pushw $18 jmp any_interrupt16.globl rm_int13rm_int13: pushw $19 jmp any_interrupt16.globl rm_int14rm_int14: pushw $20 jmp any_interrupt16.globl rm_int15rm_int15: pushw $21 jmp any_interrupt16.globl rm_int16rm_int16: pushw $22 jmp any_interrupt16.globl rm_int17rm_int17: pushw $23 jmp any_interrupt16.globl rm_int18rm_int18: pushw $24 jmp any_interrupt16.globl rm_int19rm_int19: pushw $25 jmp any_interrupt16.globl rm_int1arm_int1a: pushw $26 jmp any_interrupt16.globl rm_int1brm_int1b: pushw $27 jmp any_interrupt16.globl rm_int1crm_int1c: pushw $28 jmp any_interrupt16.globl rm_int1drm_int1d: pushw $29 jmp any_interrupt16.globl rm_int1erm_int1e: pushw $30 jmp any_interrupt16.globl rm_int1frm_int1f: pushw $31 jmp any_interrupt16.globl rm_def_intrm_def_int: iret /* * All interrupt jumptable entries jump to here * after pushing the interrupt vector number onto the * stack. */any_interrupt16: MAKE_BIOS_STACKgs movw OFFS_VECTOR(%bp), %ax cmpw $0x10, %ax je Lint_10h cmpw $0x11, %ax je Lint_11h cmpw $0x12, %ax je Lint_12h cmpw $0x13, %ax je Lint_13h cmpw $0x15, %ax je Lint_15h cmpw $0x16, %ax je Lint_16h cmpw $0x1a, %ax je Lint_1ah movw $0xffff, %ax jmp LoutLint_10h: /* VGA BIOS services */ call bios_10h jmp LoutLint_11h: call bios_11h jmp LoutLint_12h: call bios_12h jmp LoutLint_13h: /* BIOS disk services */ call bios_13h jmp LoutLint_15h: /* Misc. BIOS services */ call bios_15h jmp LoutLint_16h: /* keyboard services */ call bios_16h jmp LoutLint_1ah: /* PCI bios */ call bios_1ah jmp LoutLout: cmpw $0, %ax je Lhandeled /* Insert code for unhandeled INTs here. * * ROLO prints a message to the console * (we could do that but then we're in 16bit mode * so we'll have to get back into 32bit mode * to use the console I/O routines (if we do this * we shuls make int 0x10 and int 0x16 work as well)) */Lhandeled: RESTORE_CALLERS_STACK addw $2,%sp /* dump vector number */ iret /* return from interrupt *//* ************************************************************ * BIOS interrupt 10h -- VGA services ************************************************************ */bios_10h:gs movw OFFS_AX(%bp), %ax shrw $8, %ax cmpw $0x3, %ax je Lcur_pos cmpw $0xf, %ax je Lvid_state cmpw $0x12, %ax je Lvid_cfg movw $0xffff, %ax retLcur_pos: /* Read Cursor Position and Size */gs movw $0, OFFS_CX(%bp)gs movw $0, OFFS_DX(%bp) xorw %ax, %ax retLvid_state: /* Get Video State */gs movw $(80 << 8|0x03), OFFS_AX(%bp) /* 80 columns, 80x25, 16 colors */gs movw $0, OFFS_BX(%bp) xorw %ax, %ax retLvid_cfg: /* Video Subsystem Configuration (EGA/VGA) */gs movw $0x10, OFFS_BX(%bp) /* indicate CGA/MDA/HGA */ xorw %ax, %ax ret/* ************************************************************ * BIOS interrupt 11h -- Equipment determination ************************************************************ */bios_11h:cs movw bios_equipment, %axgs movw %ax, OFFS_AX(%bp) xorw %ax, %ax ret/* ************************************************************ * BIOS interrupt 12h -- Get Memory Size ************************************************************ */bios_12h:cs movw ram_in_64kb_chunks, %ax cmpw $0xa, %ax ja b12_more_than_640k shlw $6, %ax jmp b12_returnb12_more_than_640k: movw $0x280, %axb12_return:gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes in ax */gs movw OFFS_FLAGS(%bp), %ax andw $0xfffe, %ax /* clear carry -- function succeeded */gs movw %ax, OFFS_FLAGS(%bp) xorw %ax, %ax ret/* ************************************************************ * BIOS interrupt 13h -- Disk services ************************************************************ */bios_13h:gs movw OFFS_AX(%bp), %ax shrw $8, %ax cmpw $0x15, %ax je Lfunc_15h movw $0xffff, %ax retLfunc_15h:gs movw OFFS_AX(%bp), %ax andw $0xff, %ax /* return AH=0->drive not present */gs movw %ax, OFFS_AX(%bp) xorw %ax, %ax ret/* *********************************************************** * BIOS interrupt 15h -- Miscellaneous services *********************************************************** */bios_15h:gs movw OFFS_AX(%bp), %ax shrw $8, %ax cmpw $0xc0, %ax je Lfunc_c0h cmpw $0xe8, %ax je Lfunc_e8h cmpw $0x88, %ax je Lfunc_88h movw $0xffff, %ax retLfunc_c0h: /* Return System Configuration Parameters (PS2 only) */gs movw OFFS_FLAGS(%bp), %ax orw $1, %ax /* return carry -- function not supported */gs movw %ax, OFFS_FLAGS(%bp) xorw %ax, %ax retLfunc_e8h:gs movw OFFS_AX(%bp), %ax andw $0xff, %ax cmpw $1, %ax je Lfunc_e801hgs movw OFFS_FLAGS(%bp), %ax orw $1, %ax /* return carry -- function not supported */gs movw %ax, OFFS_FLAGS(%bp) xorw %ax, %ax retLfunc_e801h: /* Get memory size for >64M Configurations */cs movw ram_in_64kb_chunks, %ax cmpw $0x100, %ax ja e801_more_than_16mb shlw $6, %ax /* multiply by 64 */ subw $0x400, %ax /* 1st meg does not count */gs movw %ax, OFFS_AX(%bp) /* return memory size between 1M and 16M in 1kb chunks in AX and CX */gs movw %ax, OFFS_CX(%bp)gs movw $0, OFFS_BX(%bp) /* set BX and DX to 0*/gs movw $0, OFFS_DX(%bp)gs movw OFFS_FLAGS(%bp), %ax andw $0xfffe, %ax /* clear carry -- function succeeded */gs movw %ax, OFFS_FLAGS(%bp) xorw %ax, %ax rete801_more_than_16mb: subw $0x100, %ax /* subtract 16MB */gs movw $0x3c00, OFFS_AX(%bp) /* return 0x3c00 (16MB-1MB) in AX and CX */gs movw $0x3c00, OFFS_CX(%bp)gs movw %ax, OFFS_BX(%bp) /* set BX and DX to number of 64kb chunks above 16MB */gs movw %ax, OFFS_DX(%bp)gs movw OFFS_FLAGS(%bp), %ax andw $0xfffe, %ax /* clear carry -- function succeeded */gs movw %ax, OFFS_FLAGS(%bp) xorw %ax, %ax retLfunc_88h:cs movw ram_in_64kb_chunks, %ax cmpw $0x100, %ax jna b88_not_more_than16 movw $0x100, %axb88_not_more_than16: shlw $6, %ax subw $0x400, %ax /* 1st meg does not count */gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes between 16MB and 16MB in ax */gs movw OFFS_FLAGS(%bp), %ax andw $0xfffe, %ax /* clear carry -- function succeeded */gs movw %ax, OFFS_FLAGS(%bp) xorw %ax, %ax ret/* ************************************************************ * BIOS interrupt 16h -- keyboard services ************************************************************ */bios_16h:gs movw OFFS_AX(%bp), %ax shrw $8, %ax cmpw $0x03, %ax je Lfunc_03h movw $0xffff, %ax retLfunc_03h: xorw %ax, %ax /* do nothing -- function not supported */ ret/* ************************************************************ * BIOS interrupt 1ah -- PCI bios ************************************************************ */bios_1ah:gs movw OFFS_AX(%bp), %ax cmpb $0xb1, %ah je Lfunc_b1h movw $0xffff, %ax retLfunc_b1h: call realmode_pci_bios xorw %ax, %ax /* do nothing -- function not supported */ ret.globl ram_in_64kb_chunksram_in_64kb_chunks: .word 0.globl bios_equipmentbios_equipment: .word 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -