Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/x86/include/asm/apm.h
26481 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* Machine specific APM BIOS functions for generic.
4
* Split out from apm.c by Osamu Tomita <[email protected]>
5
*/
6
7
#ifndef _ASM_X86_MACH_DEFAULT_APM_H
8
#define _ASM_X86_MACH_DEFAULT_APM_H
9
10
#ifdef APM_ZERO_SEGS
11
# define APM_DO_ZERO_SEGS \
12
"pushl %%ds\n\t" \
13
"pushl %%es\n\t" \
14
"xorl %%edx, %%edx\n\t" \
15
"mov %%dx, %%ds\n\t" \
16
"mov %%dx, %%es\n\t" \
17
"mov %%dx, %%fs\n\t" \
18
"mov %%dx, %%gs\n\t"
19
# define APM_DO_POP_SEGS \
20
"popl %%es\n\t" \
21
"popl %%ds\n\t"
22
#else
23
# define APM_DO_ZERO_SEGS
24
# define APM_DO_POP_SEGS
25
#endif
26
27
static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in,
28
u32 *eax, u32 *ebx, u32 *ecx,
29
u32 *edx, u32 *esi)
30
{
31
/*
32
* N.B. We do NOT need a cld after the BIOS call
33
* because we always save and restore the flags.
34
*/
35
__asm__ __volatile__(APM_DO_ZERO_SEGS
36
"pushl %%edi\n\t"
37
"pushl %%ebp\n\t"
38
"lcall *%%cs:apm_bios_entry\n\t"
39
"setc %%al\n\t"
40
"popl %%ebp\n\t"
41
"popl %%edi\n\t"
42
APM_DO_POP_SEGS
43
: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx),
44
"=S" (*esi)
45
: "a" (func), "b" (ebx_in), "c" (ecx_in)
46
: "memory", "cc");
47
}
48
49
static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in,
50
u32 ecx_in, u32 *eax)
51
{
52
int cx, dx, si;
53
bool error;
54
55
/*
56
* N.B. We do NOT need a cld after the BIOS call
57
* because we always save and restore the flags.
58
*/
59
__asm__ __volatile__(APM_DO_ZERO_SEGS
60
"pushl %%edi\n\t"
61
"pushl %%ebp\n\t"
62
"lcall *%%cs:apm_bios_entry\n\t"
63
"setc %%bl\n\t"
64
"popl %%ebp\n\t"
65
"popl %%edi\n\t"
66
APM_DO_POP_SEGS
67
: "=a" (*eax), "=b" (error), "=c" (cx), "=d" (dx),
68
"=S" (si)
69
: "a" (func), "b" (ebx_in), "c" (ecx_in)
70
: "memory", "cc");
71
return error;
72
}
73
74
#endif /* _ASM_X86_MACH_DEFAULT_APM_H */
75
76