blob: feca3118a73b4e3c033c77ce50b4f69d1224cb99 [file] [log] [blame]
H. Peter Anvin1965aae2008-10-22 22:26:29 -07001#ifndef _ASM_X86_TRAMPOLINE_H
2#define _ASM_X86_TRAMPOLINE_H
Pavel Macheke44b7b72008-04-10 23:28:10 +02003
4#ifndef __ASSEMBLY__
5
H. Peter Anvind1ee4332011-02-14 15:42:46 -08006#include <linux/types.h>
7#include <asm/io.h>
8
Pavel Macheke44b7b72008-04-10 23:28:10 +02009/*
H. Peter Anvind1ee4332011-02-14 15:42:46 -080010 * Trampoline 80x86 program as an array. These are in the init rodata
11 * segment, but that's okay, because we only care about the relative
12 * addresses of the symbols.
Pavel Macheke44b7b72008-04-10 23:28:10 +020013 */
H. Peter Anvind1ee4332011-02-14 15:42:46 -080014extern const unsigned char x86_trampoline_start [];
15extern const unsigned char x86_trampoline_end [];
16extern unsigned char *x86_trampoline_base;
Pavel Macheke44b7b72008-04-10 23:28:10 +020017
18extern unsigned long init_rsp;
19extern unsigned long initial_code;
Tejun Heof32ff532009-01-13 20:41:35 +090020extern unsigned long initial_gs;
Pavel Macheke44b7b72008-04-10 23:28:10 +020021
H. Peter Anvind1ee4332011-02-14 15:42:46 -080022extern void __init setup_trampolines(void);
Rafael J. Wysocki3e1e9002008-12-08 00:50:22 +010023
H. Peter Anvind1ee4332011-02-14 15:42:46 -080024extern const unsigned char trampoline_data[];
25extern const unsigned char trampoline_status[];
26
27#define TRAMPOLINE_SYM(x) \
28 ((void *)(x86_trampoline_base + \
29 ((const unsigned char *)(x) - x86_trampoline_start)))
30
31/* Address of the SMP trampoline */
32static inline unsigned long trampoline_address(void)
33{
34 return virt_to_phys(TRAMPOLINE_SYM(trampoline_data));
35}
Pavel Macheke44b7b72008-04-10 23:28:10 +020036
37#endif /* __ASSEMBLY__ */
38
H. Peter Anvin1965aae2008-10-22 22:26:29 -070039#endif /* _ASM_X86_TRAMPOLINE_H */