1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21164dd00SIngo Molnar /*
31164dd00SIngo Molnar * Machine specific APM BIOS functions for generic.
41164dd00SIngo Molnar * Split out from apm.c by Osamu Tomita <tomita@cinet.co.jp>
51164dd00SIngo Molnar */
61164dd00SIngo Molnar
71164dd00SIngo Molnar #ifndef _ASM_X86_MACH_DEFAULT_APM_H
81164dd00SIngo Molnar #define _ASM_X86_MACH_DEFAULT_APM_H
91164dd00SIngo Molnar
101164dd00SIngo Molnar #ifdef APM_ZERO_SEGS
111164dd00SIngo Molnar # define APM_DO_ZERO_SEGS \
121164dd00SIngo Molnar "pushl %%ds\n\t" \
131164dd00SIngo Molnar "pushl %%es\n\t" \
141164dd00SIngo Molnar "xorl %%edx, %%edx\n\t" \
151164dd00SIngo Molnar "mov %%dx, %%ds\n\t" \
161164dd00SIngo Molnar "mov %%dx, %%es\n\t" \
171164dd00SIngo Molnar "mov %%dx, %%fs\n\t" \
181164dd00SIngo Molnar "mov %%dx, %%gs\n\t"
191164dd00SIngo Molnar # define APM_DO_POP_SEGS \
201164dd00SIngo Molnar "popl %%es\n\t" \
211164dd00SIngo Molnar "popl %%ds\n\t"
221164dd00SIngo Molnar #else
231164dd00SIngo Molnar # define APM_DO_ZERO_SEGS
241164dd00SIngo Molnar # define APM_DO_POP_SEGS
251164dd00SIngo Molnar #endif
261164dd00SIngo Molnar
apm_bios_call_asm(u32 func,u32 ebx_in,u32 ecx_in,u32 * eax,u32 * ebx,u32 * ecx,u32 * edx,u32 * esi)271164dd00SIngo Molnar static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in,
281164dd00SIngo Molnar u32 *eax, u32 *ebx, u32 *ecx,
291164dd00SIngo Molnar u32 *edx, u32 *esi)
301164dd00SIngo Molnar {
311164dd00SIngo Molnar /*
321164dd00SIngo Molnar * N.B. We do NOT need a cld after the BIOS call
331164dd00SIngo Molnar * because we always save and restore the flags.
341164dd00SIngo Molnar */
351164dd00SIngo Molnar __asm__ __volatile__(APM_DO_ZERO_SEGS
361164dd00SIngo Molnar "pushl %%edi\n\t"
371164dd00SIngo Molnar "pushl %%ebp\n\t"
381164dd00SIngo Molnar "lcall *%%cs:apm_bios_entry\n\t"
391164dd00SIngo Molnar "setc %%al\n\t"
401164dd00SIngo Molnar "popl %%ebp\n\t"
411164dd00SIngo Molnar "popl %%edi\n\t"
421164dd00SIngo Molnar APM_DO_POP_SEGS
431164dd00SIngo Molnar : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx),
441164dd00SIngo Molnar "=S" (*esi)
451164dd00SIngo Molnar : "a" (func), "b" (ebx_in), "c" (ecx_in)
461164dd00SIngo Molnar : "memory", "cc");
471164dd00SIngo Molnar }
481164dd00SIngo Molnar
apm_bios_call_simple_asm(u32 func,u32 ebx_in,u32 ecx_in,u32 * eax)49117780eeSH. Peter Anvin static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in,
501164dd00SIngo Molnar u32 ecx_in, u32 *eax)
511164dd00SIngo Molnar {
521164dd00SIngo Molnar int cx, dx, si;
53117780eeSH. Peter Anvin bool error;
541164dd00SIngo Molnar
551164dd00SIngo Molnar /*
561164dd00SIngo Molnar * N.B. We do NOT need a cld after the BIOS call
571164dd00SIngo Molnar * because we always save and restore the flags.
581164dd00SIngo Molnar */
591164dd00SIngo Molnar __asm__ __volatile__(APM_DO_ZERO_SEGS
601164dd00SIngo Molnar "pushl %%edi\n\t"
611164dd00SIngo Molnar "pushl %%ebp\n\t"
621164dd00SIngo Molnar "lcall *%%cs:apm_bios_entry\n\t"
631164dd00SIngo Molnar "setc %%bl\n\t"
641164dd00SIngo Molnar "popl %%ebp\n\t"
651164dd00SIngo Molnar "popl %%edi\n\t"
661164dd00SIngo Molnar APM_DO_POP_SEGS
671164dd00SIngo Molnar : "=a" (*eax), "=b" (error), "=c" (cx), "=d" (dx),
681164dd00SIngo Molnar "=S" (si)
691164dd00SIngo Molnar : "a" (func), "b" (ebx_in), "c" (ecx_in)
701164dd00SIngo Molnar : "memory", "cc");
711164dd00SIngo Molnar return error;
721164dd00SIngo Molnar }
731164dd00SIngo Molnar
741164dd00SIngo Molnar #endif /* _ASM_X86_MACH_DEFAULT_APM_H */
75