mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-22 07:12:39 +00:00
* stage2/apm.S: Always disconnect from APM. Written by Erich Stefan Boleyn. * util/Makefile.am (noinst_DATA): Removed. (EXTRA_DIST): Likewise.
126 lines
2.9 KiB
ArmAsm
126 lines
2.9 KiB
ArmAsm
/*
|
|
* 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
|