1 /* 2 * Copyright 2018, Jérôme Duval, jerome.duval@gmail.com. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _KERNEL_ARCH_x86_ALTCODEPATCH_H 6 #define _KERNEL_ARCH_x86_ALTCODEPATCH_H 7 8 9 #include <arch/x86/arch_kernel.h> 10 11 12 #define ASM_NOP1 .byte 0x90 13 #define ASM_NOP2 .byte 0x66, 0x90 14 #define ASM_NOP3 .byte 0x0f, 0x1f, 0x00 15 #define ASM_NOP4 .byte 0x0f, 0x1f, 0x40, 0x00 16 #define ASM_NOP5 .byte 0x0f, 0x1f, 0x44, 0x00, 0x00 17 #define ASM_NOP6 .byte 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 18 #define ASM_NOP7 .byte 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 19 #define ASM_NOP8 .byte 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 20 #define ASM_NOP9 .byte 0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 21 22 23 #define ALTCODEPATCH_TAG_STAC 1 24 #define ALTCODEPATCH_TAG_CLAC 2 25 #define ALTCODEPATCH_TAG_XSAVE 3 26 #define ALTCODEPATCH_TAG_XRSTOR 4 27 28 29 #ifdef _ASSEMBLER 30 31 #define CODEPATCH_START 990: 32 #define CODEPATCH_END(tag) 991: \ 33 .pushsection .altcodepatch, "a" ; \ 34 .long (990b - KERNEL_LOAD_BASE) ; \ 35 .short (991b - 990b) ; \ 36 .short tag ; \ 37 .popsection 38 39 #define ASM_STAC CODEPATCH_START \ 40 ASM_NOP3 ; \ 41 CODEPATCH_END(ALTCODEPATCH_TAG_STAC) 42 43 #define ASM_CLAC CODEPATCH_START \ 44 ASM_NOP3 ; \ 45 CODEPATCH_END(ALTCODEPATCH_TAG_CLAC) 46 47 #else 48 49 #define _STRINGIFY(x...) #x 50 #define STRINGIFY(x...) _STRINGIFY(x) 51 52 #define CODEPATCH_START "990: \n" 53 #define CODEPATCH_END(tag) "991: \n" \ 54 ".pushsection .altcodepatch, \"a\" \n" \ 55 ".long (990b - " STRINGIFY(KERNEL_LOAD_BASE) ") \n" \ 56 ".short (991b - 990b) \n" \ 57 ".short " STRINGIFY(tag) " \n" \ 58 ".popsection" 59 60 #define ASM_STAC CODEPATCH_START \ 61 STRINGIFY(ASM_NOP3) "\n" \ 62 CODEPATCH_END(ALTCODEPATCH_TAG_STAC) 63 64 #define ASM_CLAC CODEPATCH_START \ 65 STRINGIFY(ASM_NOP3) "\n"\ 66 CODEPATCH_END(ALTCODEPATCH_TAG_CLAC) 67 68 69 void arch_altcodepatch_replace(uint16 tag, void* newcodepatch, size_t length); 70 71 72 #endif 73 74 #endif /* _KERNEL_ARCH_x86_ALTCODEPATCH_H */ 75