xref: /openbmc/linux/arch/x86/include/asm/apm.h (revision 6f6060a5)
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