1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * The actual FRED entry points. 4 */ 5 6 #include <linux/export.h> 7 8 #include <asm/asm.h> 9 #include <asm/fred.h> 10 #include <asm/segment.h> 11 12 #include "calling.h" 13 14 .code64 15 .section .noinstr.text, "ax" 16 17 .macro FRED_ENTER 18 UNWIND_HINT_END_OF_STACK 19 ENDBR 20 PUSH_AND_CLEAR_REGS 21 movq %rsp, %rdi /* %rdi -> pt_ 22 .endm 23 24 .macro FRED_EXIT 25 UNWIND_HINT_REGS 26 POP_REGS 27 .endm 28 29 /* 30 * The new RIP value that FRED event delivery 31 * IA32_FRED_CONFIG & ~FFFH for events that oc 32 * Thus the FRED ring 3 entry point must be 4K 33 */ 34 .align 4096 35 36 SYM_CODE_START_NOALIGN(asm_fred_entrypoint_use 37 FRED_ENTER 38 call fred_entry_from_user 39 SYM_INNER_LABEL(asm_fred_exit_user, SYM_L_GLOB 40 FRED_EXIT 41 1: ERETU 42 43 _ASM_EXTABLE_TYPE(1b, asm_fred_entrypo 44 SYM_CODE_END(asm_fred_entrypoint_user) 45 46 /* 47 * The new RIP value that FRED event delivery 48 * (IA32_FRED_CONFIG & ~FFFH) + 256 for events 49 * ring 0, i.e., asm_fred_entrypoint_user + 25 50 */ 51 .org asm_fred_entrypoint_user + 256, 0 52 SYM_CODE_START_NOALIGN(asm_fred_entrypoint_ker 53 FRED_ENTER 54 call fred_entry_from_kernel 55 FRED_EXIT 56 ERETS 57 SYM_CODE_END(asm_fred_entrypoint_kernel) 58 59 #if IS_ENABLED(CONFIG_KVM_INTEL) 60 SYM_FUNC_START(asm_fred_entry_from_kvm) 61 push %rbp 62 mov %rsp, %rbp 63 64 UNWIND_HINT_SAVE 65 66 /* 67 * Both IRQ and NMI from VMX can be ha 68 * because there is no need to protect 69 * stack leading to this helper is eff 70 * (relatively speaking). Do the same 71 * need to check current stack level f 72 * 73 * Emulate the FRED-defined redzone an 74 */ 75 sub $(FRED_CONFIG_REDZONE_AMOUNT << 6) 76 and $FRED_STACK_FRAME_RSP_MASK, %rsp 77 78 /* 79 * Start to push a FRED stack frame, w 80 * 81 * +--------+-----------------+ 82 * | Bytes | Usage | 83 * +--------+-----------------+ 84 * | 63:56 | Reserved | 85 * | 55:48 | Event Data | 86 * | 47:40 | SS + Event Info | 87 * | 39:32 | RSP | 88 * | 31:24 | RFLAGS | 89 * | 23:16 | CS + Aux Info | 90 * | 15:8 | RIP | 91 * | 7:0 | Error Code | 92 * +--------+-----------------+ 93 */ 94 push $0 /* Res 95 push $0 /* Eve 96 push %rdi /* fre 97 push %rbp 98 pushf 99 mov $__KERNEL_CS, %rax 100 push %rax 101 102 /* 103 * Unlike the IDT event delivery, FRED 104 * after pushing the return RIP, thus 105 * used here to push the return RIP, o 106 * push an error code before invoking 107 * 108 * Use LEA to get the return RIP and p 109 */ 110 lea 1f(%rip), %rax 111 push %rax 112 push $0 113 114 PUSH_AND_CLEAR_REGS clear_bp=0 unwind_ 115 movq %rsp, %rdi 116 call __fred_entry_from_kvm 117 POP_REGS 118 ERETS 119 1: 120 /* 121 * Objtool doesn't understand what ERE 122 * yes, we'll reach here and with what 123 * isn't strictly needed, but it's the 124 */ 125 UNWIND_HINT_RESTORE 126 pop %rbp 127 RET 128 129 SYM_FUNC_END(asm_fred_entry_from_kvm) 130 EXPORT_SYMBOL_GPL(asm_fred_entry_from_kvm); 131 #endif
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.