Linux Audio

Check our new training course

Loading...
/* asm.h - x86 tool dependent headers */

/*
 * Copyright (c) 2007-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef __INCsysX86Asmh
#define __INCsysX86Asmh


#include <toolchain.h>
#include <linker/sections.h>

/* offsets from stack pointer to function arguments */

#define SP_ARG0         0
#define SP_ARG1         4
#define SP_ARG2         8
#define SP_ARG3         12
#define SP_ARG4         16
#define SP_ARG5         20
#define SP_ARG6         24
#define SP_ARG7         28
#define SP_ARG8         32

#if defined(_ASMLANGUAGE)

#if defined(CONFIG_RETPOLINE)
/*
 * For a description of how retpolines are constructed for both indirect
 * jumps and indirect calls, please refer to this documentation:
 * https://support.google.com/faqs/answer/7625886
 *
 * Since these macros are used in a few places in arch/x86/core assembly
 * routines, with different reg parameters, it's not possible to use
 * the "out of line" construction technique to share a trampoline.
 */

#define INDIRECT_JMP_IMPL(reg, id) \
		call .set_up_target ## id; \
	.speculative_trap ## id: \
		pause; \
		jmp .speculative_trap ## id; \
	.set_up_target ## id: \
		mov reg, (%esp); \
		ret

#define INDIRECT_CALL_IMPL(reg, id) \
		call .set_up_return ## id; \
	.inner_indirect_branch ## id: \
		call .set_up_target ## id; \
	.speculative_trap ## id: \
		pause; \
		jmp .speculative_trap ## id; \
	.set_up_target ## id: \
		mov reg, (%esp); \
		ret; \
	.set_up_return ## id: \
		call .inner_indirect_branch ## id


#define INDIRECT_CALL_IMPL1(reg, id)	INDIRECT_CALL_IMPL(reg, id)
#define INDIRECT_JMP_IMPL1(reg, id)	INDIRECT_JMP_IMPL(reg, id)

#define INDIRECT_CALL(reg)	INDIRECT_CALL_IMPL1(reg, __COUNTER__)
#define INDIRECT_JMP(reg)	INDIRECT_JMP_IMPL1(reg, __COUNTER__)

#else

#define INDIRECT_CALL(reg)	call *reg
#define INDIRECT_JMP(reg)	jmp *reg

#endif /* CONFIG_RETPOLINE */

#endif /* _ASMLANGUAGE */

#endif /* __INCsysX86Asmh */