blob: abf5e271c24fcaed9960f65c157b4d2c734b1d95 [file] [log] [blame] [raw]
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* This is stolen from arch/i386/boot/setup.S in Linux 2.2.17 */
/*
! setup.S Copyright (C) 1991, 1992 Linus Torvalds
*/
ENTRY(get_apm_info)
pushl %ebp
pushl %ebx
pushl %edi
pushl %esi
call EXT_C(prot_to_real)
.code16
/* APM BIOS installation check */
movw $0x5300, %ax
xorw %bx, %bx
int $0x15
/* error -> no APM BIOS */
jc done_apm_bios
/* check for "PM" signature */
cmpw $0x504d, %bx
/* no signature -> no APM BIOS */
jne done_apm_bios
/* Is 32 bit supported? */
andw $0x0002, %cx
/* no ... */
je done_apm_bios
/* Disconnect first just in case */
movw $0x5304, %ax
xorw %bx, %bx
/* ignore return code */
int $0x15
/* 32 bit connect */
movw $0x5303, %ax
xorl %ebx, %ebx
/* paranoia */
xorw %cx, %cx
xorw %dx, %dx
xorl %esi, %esi
xorw %di, %di
int $0x15
/* error */
jc no_32_apm_bios
/* BIOS code segment */
movw %ax, ABS(EXT_C(apm_bios_info)) + 2
/* BIOS entry point offset */
movl %ebx, ABS(EXT_C(apm_bios_info)) + 4
/* BIOS 16 bit code segment */
movw %cx, ABS(EXT_C(apm_bios_info)) + 8
/* BIOS data segment */
movw %dx, ABS(EXT_C(apm_bios_info)) + 10
/* BIOS code segment length */
movl %esi, ABS(EXT_C(apm_bios_info)) + 14
/* BIOS data segment length */
movw %di, ABS(EXT_C(apm_bios_info)) + 18
/*
* Redo the installation check as the 32 bit connect
* modifies the flags returned on some BIOSs
*/
/* APM BIOS installation check */
movw $0x5300, %ax
xorw %bx, %bx
/* paranoia */
xorw %cx, %cx
int $0x15
/* error -> should not happen, tidy up */
jc done_apm_bios
/* check for "PM" signature */
cmpw $0x504d, %bx
/* no signature -> should not happen, tidy up */
jne done_apm_bios
/* record the APM BIOS version */
movw %ax, ABS(EXT_C(apm_bios_info))
/* and flags */
movw %cx, ABS(EXT_C(apm_bios_info)) + 12
jmp done_apm_bios
no_32_apm_bios:
/* remove 32 bit support bit */
andw $0xfffd, ABS(EXT_C(apm_bios_info)) + 12
done_apm_bios:
/* Some paranoia here: Always Disconnect from APM */
movw $0x5304, %ax
xorw %bx, %bx
/* ignore return code */
int $0x15
DATA32 call EXT_C(real_to_prot)
.code32
popl %esi
popl %edi
popl %ebx
popl %ebp
ret