Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/boot/apm.c
10817 views
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
76
77