Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
boot
apm.c
Go to the documentation of this file.
1
/* -*- linux-c -*- ------------------------------------------------------- *
2
*
3
* Copyright (C) 1991, 1992 Linus Torvalds
4
* Copyright 2007 rPath, Inc. - All Rights Reserved
5
* Copyright 2009 Intel Corporation; author H. Peter Anvin
6
*
7
* Original APM BIOS checking by Stephen Rothwell, May 1994
8
* (
[email protected]
)
9
*
10
* This file is part of the Linux kernel, and is made available under
11
* the terms of the GNU General Public License version 2.
12
*
13
* ----------------------------------------------------------------------- */
14
15
/*
16
* Get APM BIOS information
17
*/
18
19
#include "
boot.h
"
20
21
int
query_apm_bios
(
void
)
22
{
23
struct
biosregs
ireg, oreg;
24
25
/* APM BIOS installation check */
26
initregs
(&ireg);
27
ireg.
ah
= 0x53;
28
intcall
(0x15, &ireg, &oreg);
29
30
if
(oreg.
flags
&
X86_EFLAGS_CF
)
31
return
-1;
/* No APM BIOS */
32
33
if
(oreg.
bx
!= 0x504d)
/* "PM" signature */
34
return
-1;
35
36
if
(!(oreg.
cx
& 0x02))
/* 32 bits supported? */
37
return
-1;
38
39
/* Disconnect first, just in case */
40
ireg.
al
= 0x04;
41
intcall
(0x15, &ireg,
NULL
);
42
43
/* 32-bit connect */
44
ireg.
al
= 0x03;
45
intcall
(0x15, &ireg, &oreg);
46
47
boot_params
.
apm_bios_info
.cseg = oreg.
ax
;
48
boot_params
.
apm_bios_info
.offset = oreg.
ebx
;
49
boot_params
.
apm_bios_info
.cseg_16 = oreg.
cx
;
50
boot_params
.
apm_bios_info
.dseg = oreg.
dx
;
51
boot_params
.
apm_bios_info
.cseg_len = oreg.
si
;
52
boot_params
.
apm_bios_info
.cseg_16_len = oreg.
hsi
;
53
boot_params
.
apm_bios_info
.dseg_len = oreg.
di
;
54
55
if
(oreg.
flags
&
X86_EFLAGS_CF
)
56
return
-1;
57
58
/* Redo the installation check as the 32-bit connect;
59
some BIOSes return different flags this way... */
60
61
ireg.
al
= 0x00;
62
intcall
(0x15, &ireg, &oreg);
63
64
if
((oreg.
eflags
&
X86_EFLAGS_CF
) || oreg.
bx
!= 0x504d) {
65
/* Failure with 32-bit connect, try to disconect and ignore */
66
ireg.
al
= 0x04;
67
intcall
(0x15, &ireg,
NULL
);
68
return
-1;
69
}
70
71
boot_params
.
apm_bios_info
.version = oreg.
ax
;
72
boot_params
.
apm_bios_info
.flags = oreg.
cx
;
73
return
0;
74
}
75
Generated on Thu Jan 10 2013 13:19:43 for Linux Kernel by
1.8.2