Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
apm.h
Go to the documentation of this file.
1 /*
2  * Machine specific APM BIOS functions for generic.
3  * Split out from apm.c by Osamu Tomita <[email protected]>
4  */
5 
6 #ifndef _ASM_X86_MACH_DEFAULT_APM_H
7 #define _ASM_X86_MACH_DEFAULT_APM_H
8 
9 #ifdef APM_ZERO_SEGS
10 # define APM_DO_ZERO_SEGS \
11  "pushl %%ds\n\t" \
12  "pushl %%es\n\t" \
13  "xorl %%edx, %%edx\n\t" \
14  "mov %%dx, %%ds\n\t" \
15  "mov %%dx, %%es\n\t" \
16  "mov %%dx, %%fs\n\t" \
17  "mov %%dx, %%gs\n\t"
18 # define APM_DO_POP_SEGS \
19  "popl %%es\n\t" \
20  "popl %%ds\n\t"
21 #else
22 # define APM_DO_ZERO_SEGS
23 # define APM_DO_POP_SEGS
24 #endif
25 
26 static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in,
27  u32 *eax, u32 *ebx, u32 *ecx,
28  u32 *edx, u32 *esi)
29 {
30  /*
31  * N.B. We do NOT need a cld after the BIOS call
32  * because we always save and restore the flags.
33  */
34  __asm__ __volatile__(APM_DO_ZERO_SEGS
35  "pushl %%edi\n\t"
36  "pushl %%ebp\n\t"
37  "lcall *%%cs:apm_bios_entry\n\t"
38  "setc %%al\n\t"
39  "popl %%ebp\n\t"
40  "popl %%edi\n\t"
42  : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx),
43  "=S" (*esi)
44  : "a" (func), "b" (ebx_in), "c" (ecx_in)
45  : "memory", "cc");
46 }
47 
48 static inline u8 apm_bios_call_simple_asm(u32 func, u32 ebx_in,
49  u32 ecx_in, u32 *eax)
50 {
51  int cx, dx, si;
52  u8 error;
53 
54  /*
55  * N.B. We do NOT need a cld after the BIOS call
56  * because we always save and restore the flags.
57  */
58  __asm__ __volatile__(APM_DO_ZERO_SEGS
59  "pushl %%edi\n\t"
60  "pushl %%ebp\n\t"
61  "lcall *%%cs:apm_bios_entry\n\t"
62  "setc %%bl\n\t"
63  "popl %%ebp\n\t"
64  "popl %%edi\n\t"
66  : "=a" (*eax), "=b" (error), "=c" (cx), "=d" (dx),
67  "=S" (si)
68  : "a" (func), "b" (ebx_in), "c" (ecx_in)
69  : "memory", "cc");
70  return error;
71 }
72 
73 #endif /* _ASM_X86_MACH_DEFAULT_APM_H */