Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
084ee1c6 JS |
2 | #ifndef _ARCH_X86_REALMODE_H |
3 | #define _ARCH_X86_REALMODE_H | |
4 | ||
46d010e0 TL |
5 | /* |
6 | * Flag bit definitions for use with the flags field of the trampoline header | |
7 | * in the CONFIG_X86_64 variant. | |
8 | */ | |
9 | #define TH_FLAGS_SME_ACTIVE_BIT 0 | |
10 | #define TH_FLAGS_SME_ACTIVE BIT(TH_FLAGS_SME_ACTIVE_BIT) | |
11 | ||
12 | #ifndef __ASSEMBLY__ | |
13 | ||
084ee1c6 JS |
14 | #include <linux/types.h> |
15 | #include <asm/io.h> | |
16 | ||
957a227d | 17 | /* This must match data at realmode/rm/header.S */ |
084ee1c6 JS |
18 | struct real_mode_header { |
19 | u32 text_start; | |
20 | u32 ro_end; | |
48927bbb | 21 | /* SMP trampoline */ |
f37240f1 | 22 | u32 trampoline_start; |
f37240f1 JS |
23 | u32 trampoline_header; |
24 | #ifdef CONFIG_X86_64 | |
25 | u32 trampoline_pgd; | |
5a8c9aeb | 26 | #endif |
f37240f1 | 27 | /* ACPI S3 wakeup */ |
c9b77ccb JS |
28 | #ifdef CONFIG_ACPI_SLEEP |
29 | u32 wakeup_start; | |
30 | u32 wakeup_header; | |
f37240f1 JS |
31 | #endif |
32 | /* APM/BIOS reboot */ | |
f37240f1 | 33 | u32 machine_real_restart_asm; |
65051397 PA |
34 | #ifdef CONFIG_X86_64 |
35 | u32 machine_real_restart_seg; | |
f37240f1 | 36 | #endif |
cda846f1 | 37 | }; |
f37240f1 | 38 | |
957a227d | 39 | /* This must match data at realmode/rm/trampoline_{32,64}.S */ |
f37240f1 JS |
40 | struct trampoline_header { |
41 | #ifdef CONFIG_X86_32 | |
42 | u32 start; | |
cda846f1 | 43 | u16 gdt_pad; |
f37240f1 JS |
44 | u16 gdt_limit; |
45 | u32 gdt_base; | |
46 | #else | |
47 | u64 start; | |
638d957b | 48 | u64 efer; |
cda846f1 | 49 | u32 cr4; |
46d010e0 | 50 | u32 flags; |
c9b77ccb | 51 | #endif |
cda846f1 | 52 | }; |
084ee1c6 | 53 | |
b429dbf6 JS |
54 | extern struct real_mode_header *real_mode_header; |
55 | extern unsigned char real_mode_blob_end[]; | |
084ee1c6 | 56 | |
084ee1c6 JS |
57 | extern unsigned long initial_code; |
58 | extern unsigned long initial_gs; | |
b32f96c7 | 59 | extern unsigned long initial_stack; |
084ee1c6 JS |
60 | |
61 | extern unsigned char real_mode_blob[]; | |
62 | extern unsigned char real_mode_relocs[]; | |
63 | ||
48927bbb JS |
64 | #ifdef CONFIG_X86_32 |
65 | extern unsigned char startup_32_smp[]; | |
66 | extern unsigned char boot_gdt[]; | |
67 | #else | |
68 | extern unsigned char secondary_startup_64[]; | |
69 | #endif | |
70 | ||
5ff3e2c3 AL |
71 | static inline size_t real_mode_size_needed(void) |
72 | { | |
73 | if (real_mode_header) | |
74 | return 0; /* already allocated. */ | |
75 | ||
76 | return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE); | |
77 | } | |
78 | ||
f560bd19 MC |
79 | static inline void set_real_mode_mem(phys_addr_t mem) |
80 | { | |
81 | real_mode_header = (struct real_mode_header *) __va(mem); | |
82 | } | |
83 | ||
4f7b9226 | 84 | void reserve_real_mode(void); |
084ee1c6 | 85 | |
46d010e0 TL |
86 | #endif /* __ASSEMBLY__ */ |
87 | ||
084ee1c6 | 88 | #endif /* _ARCH_X86_REALMODE_H */ |