haiku/headers/private/kernel/arch/x86/arch_altcodepatch.h
Jérôme Duval 9495126984 kernel/x86_64: AVX support
xsave or xsavec are supported.
breaks vregs compatibility.
change the thread structure object cache alignment to 64
the xsave fpu_state size isn't defined, it is for instance 832 here, thus I picked 1024.

Change-Id: I4a0cab0bc42c1d37f24dcafb8259f8ff24a330d2
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2849
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
2020-06-03 06:16:48 +00:00

75 lines
1.9 KiB
C

/*
* Copyright 2018, Jérôme Duval, jerome.duval@gmail.com.
* Distributed under the terms of the MIT License.
*/
#ifndef _KERNEL_ARCH_x86_ALTCODEPATCH_H
#define _KERNEL_ARCH_x86_ALTCODEPATCH_H
#include <arch/x86/arch_kernel.h>
#define ASM_NOP1 .byte 0x90
#define ASM_NOP2 .byte 0x66, 0x90
#define ASM_NOP3 .byte 0x0f, 0x1f, 0x00
#define ASM_NOP4 .byte 0x0f, 0x1f, 0x40, 0x00
#define ASM_NOP5 .byte 0x0f, 0x1f, 0x44, 0x00, 0x00
#define ASM_NOP6 .byte 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00
#define ASM_NOP7 .byte 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00
#define ASM_NOP8 .byte 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00
#define ASM_NOP9 .byte 0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00
#define ALTCODEPATCH_TAG_STAC 1
#define ALTCODEPATCH_TAG_CLAC 2
#define ALTCODEPATCH_TAG_XSAVE 3
#define ALTCODEPATCH_TAG_XRSTOR 4
#ifdef _ASSEMBLER
#define CODEPATCH_START 990:
#define CODEPATCH_END(tag) 991: \
.pushsection .altcodepatch, "a" ; \
.long (990b - KERNEL_LOAD_BASE) ; \
.short (991b - 990b) ; \
.short tag ; \
.popsection
#define ASM_STAC CODEPATCH_START \
ASM_NOP3 ; \
CODEPATCH_END(ALTCODEPATCH_TAG_STAC)
#define ASM_CLAC CODEPATCH_START \
ASM_NOP3 ; \
CODEPATCH_END(ALTCODEPATCH_TAG_CLAC)
#else
#define _STRINGIFY(x...) #x
#define STRINGIFY(x...) _STRINGIFY(x)
#define CODEPATCH_START "990: \n"
#define CODEPATCH_END(tag) "991: \n" \
".pushsection .altcodepatch, \"a\" \n" \
".long (990b - " STRINGIFY(KERNEL_LOAD_BASE) ") \n" \
".short (991b - 990b) \n" \
".short " STRINGIFY(tag) " \n" \
".popsection"
#define ASM_STAC CODEPATCH_START \
STRINGIFY(ASM_NOP3) "\n" \
CODEPATCH_END(ALTCODEPATCH_TAG_STAC)
#define ASM_CLAC CODEPATCH_START \
STRINGIFY(ASM_NOP3) "\n"\
CODEPATCH_END(ALTCODEPATCH_TAG_CLAC)
void arch_altcodepatch_replace(uint16 tag, void* newcodepatch, size_t length);
#endif
#endif /* _KERNEL_ARCH_x86_ALTCODEPATCH_H */