PatchworkOS
Loading...
Searching...
No Matches
simd.c
Go to the documentation of this file.
1#include <kernel/cpu/cpu.h>
2#include <kernel/cpu/simd.h>
3#include <kernel/cpu/smp.h>
4#include <kernel/log/log.h>
5#include <kernel/mem/pmm.h>
6
7#include <kernel/defs.h>
8
9#include <stdint.h>
10#include <string.h>
11#include <sys/cpuid.h>
12
13static uint8_t initCtx[PAGE_SIZE] ALIGNED(64);
14
15static void simd_xsave_init(void)
16{
18
19 uint64_t xcr0 = 0;
20
22
25
28
29 if (info.featuresEcx & CPUID_ECX_AVX)
30 {
31 xcr0 = xcr0 | XCR0_AVX_ENABLE;
32
33 if (extInfo.featuresEbx & CPUID_EBX_AVX512F)
34 {
36 }
37 }
38
39 xcr0_write(0, xcr0);
40}
41
42void simd_cpu_init(void)
43{
46
48
51
54
55 if (info.featuresEcx & CPUID_ECX_OSXSAVE)
56 {
58 }
59
60 asm volatile("fninit");
61 if (info.featuresEcx & CPUID_ECX_OSXSAVE)
62 {
63 asm volatile("xsave %0" : : "m"(*initCtx), "a"(UINT64_MAX), "d"(UINT64_MAX) : "memory");
64 }
65 else
66 {
67 asm volatile("fxsave (%0)" : : "r"(initCtx));
68 }
69
70 LOG_INFO("cpu%d simd ", smp_self_unsafe()->id);
71 if (info.featuresEcx & CPUID_ECX_OSXSAVE)
72 {
73 LOG_INFO("xsave ");
74 }
75 if (info.featuresEcx & CPUID_ECX_AVX)
76 {
77 LOG_INFO("avx ");
78 }
79 if (extInfo.featuresEbx & CPUID_EBX_AVX512F)
80 {
81 LOG_INFO("avx512 ");
82 }
83 LOG_INFO("enabled\n");
84}
85
87{
88 ctx->buffer = pmm_alloc();
89 if (ctx->buffer == NULL)
90 {
91 return ERR;
92 }
93
94 memcpy(ctx->buffer, initCtx, PAGE_SIZE);
95
96 return 0;
97}
98
100{
101 pmm_free(ctx->buffer);
102}
103
105{
108
109 if (info.featuresEcx & CPUID_ECX_OSXSAVE)
110 {
111 asm volatile("xsave %0" : : "m"(*ctx->buffer), "a"(UINT64_MAX), "d"(UINT64_MAX) : "memory");
112 }
113 else
114 {
115 asm volatile("fxsave (%0)" : : "r"(ctx->buffer));
116 }
117}
118
120{
123
124 if (info.featuresEcx & CPUID_ECX_OSXSAVE)
125 {
126 asm volatile("xrstor %0" : : "m"(*ctx->buffer), "a"(UINT64_MAX), "d"(UINT64_MAX) : "memory");
127 }
128 else
129 {
130 asm volatile("fxrstor (%0)" : : "r"(ctx->buffer));
131 }
132}
void simd_ctx_save(simd_ctx_t *ctx)
Definition simd.c:104
void simd_ctx_load(simd_ctx_t *ctx)
Definition simd.c:119
uint64_t simd_ctx_init(simd_ctx_t *ctx)
Definition simd.c:86
void simd_cpu_init(void)
Definition simd.c:42
void simd_ctx_deinit(simd_ctx_t *ctx)
Definition simd.c:99
static cpu_t * smp_self_unsafe(void)
Returns a pointer to the cpu_t structure of the current CPU.
Definition smp.h:90
#define ALIGNED(alignment)
GCC aligned attribute.
Definition defs.h:22
#define LOG_INFO(format,...)
Definition log.h:87
void pmm_free(void *address)
Frees a single physical page.
Definition pmm.c:211
void * pmm_alloc(void)
Allocates a single physical page.
Definition pmm.c:162
static void cpuid_feature_info(cpuid_feature_info_t *info)
Wrapper to get CPU feature information.
Definition cpuid.h:204
static void cpuid_extended_feature_info(cpuid_extended_feature_info_t *info)
Wrapper to get CPU extended feature information.
Definition cpuid.h:228
@ CPUID_ECX_AVX
Definition cpuid.h:74
@ CPUID_ECX_OSXSAVE
Definition cpuid.h:73
@ CPUID_EBX_AVX512F
Definition cpuid.h:145
#define PAGE_SIZE
Memory page size.
Definition proc.h:140
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
static fb_info_t info
Definition gop.c:41
#define CR4_XSAVE_ENABLE
Definition regs.h:54
#define XCR0_AVX512_ENABLE
Definition regs.h:8
#define CR0_NUMERIC_ERROR_ENABLE
Definition regs.h:44
#define XCR0_ZMM16_32_ENABLE
Definition regs.h:10
#define XCR0_AVX_ENABLE
Definition regs.h:7
#define XCR0_XSAVE_SAVE_SSE
Definition regs.h:6
#define CR4_FXSR_ENABLE
Definition regs.h:52
#define CR0_EMULATION
Definition regs.h:41
#define XCR0_ZMM0_15_ENABLE
Definition regs.h:9
#define CR4_SIMD_EXCEPTION
Definition regs.h:53
static void cr4_write(uint64_t value)
Definition regs.h:97
#define CR0_MONITOR_CO_PROCESSOR
Definition regs.h:40
static void cr0_write(uint64_t value)
Definition regs.h:133
static void xcr0_write(uint32_t xcr, uint64_t value)
Definition regs.h:56
static uint64_t cr0_read()
Definition regs.h:126
static uint64_t cr4_read()
Definition regs.h:90
#define XCR0_XSAVE_SAVE_X87
Definition regs.h:5
static void simd_xsave_init(void)
Definition simd.c:15
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
#define UINT64_MAX
Definition stdint.h:74
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
_PUBLIC void * memcpy(void *_RESTRICT s1, const void *_RESTRICT s2, size_t n)
Definition memcpy.c:4
CPU extended feature information structure.
Definition cpuid.h:219
cpuid_ebx_features_t featuresEbx
Definition cpuid.h:220
CPU feature information structure.
Definition cpuid.h:192
uint8_t * buffer
Definition simd.h:23