Merge branches 'work.misc' and 'work.dcache' of git://git.kernel.org/pub/scm/linux...
[sfrench/cifs-2.6.git] / arch / x86 / include / asm / apm.h
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 <tomita@cinet.co.jp>
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 */