cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

apm.h (1768B)


      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
     27static 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
     49static 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 */