Добавлена инициализация SSE
This commit is contained in:
parent
229e3b4281
commit
3a4fc413c4
@ -14,22 +14,6 @@
|
|||||||
|
|
||||||
static bool acpi_msrs_support = false;
|
static bool acpi_msrs_support = false;
|
||||||
static bool mmx_support = false;
|
static bool mmx_support = false;
|
||||||
static bool sse2_support = false;
|
|
||||||
static bool avx_support = false;
|
|
||||||
static bool rdrnd_support = false;
|
|
||||||
|
|
||||||
static void sse_init( ) {
|
|
||||||
uint64_t _cr0 = 0;
|
|
||||||
asm volatile("mov %0, %%cr0" : "=r"(_cr0) : : "memory");
|
|
||||||
_cr0 &= ~(1 << 2);
|
|
||||||
_cr0 |= (1 << 1);
|
|
||||||
asm volatile("mov %%cr0, %0" : : "r"(_cr0) : "memory");
|
|
||||||
|
|
||||||
uint64_t _cr4 = 0;
|
|
||||||
asm volatile("mov %0, %%cr4" : "=r"(_cr4) : : "memory");
|
|
||||||
_cr4 |= (3 << 9);
|
|
||||||
asm volatile("mov %%cr4, %0" : : "r"(_cr4) : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx,
|
static void cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx,
|
||||||
uint32_t *edx) {
|
uint32_t *edx) {
|
||||||
@ -46,7 +30,7 @@ static void msr_set(uint32_t msr, uint32_t lo, uint32_t hi) {
|
|||||||
asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr));
|
asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t get_cpu_temperature( ) {
|
static int64_t get_cpu_temperature_intel( ) {
|
||||||
uint32_t lo, hi;
|
uint32_t lo, hi;
|
||||||
|
|
||||||
// Чтение температуры из MSR
|
// Чтение температуры из MSR
|
||||||
@ -55,9 +39,10 @@ static uint64_t get_cpu_temperature( ) {
|
|||||||
uint64_t temp = ((uint64_t)hi << 32) | (uint64_t)lo;
|
uint64_t temp = ((uint64_t)hi << 32) | (uint64_t)lo;
|
||||||
|
|
||||||
// Преобразование значения температуры
|
// Преобразование значения температуры
|
||||||
uint64_t temperature = (temp >> 16) / 256;
|
int64_t temperature = (temp >> 16) / 256;
|
||||||
|
|
||||||
return temperature;
|
if (temperature == 0) { return 0; }
|
||||||
|
return ((temperature - 32) * 5 / 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void l2_cache( ) {
|
static void l2_cache( ) {
|
||||||
@ -124,102 +109,47 @@ void cpu_init( ) {
|
|||||||
uint32_t eax, ebx, ecx, edx;
|
uint32_t eax, ebx, ecx, edx;
|
||||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||||
|
|
||||||
if ((edx >> 0) & 1) { LOG("FPU(x87) поддерживается!\n"); }
|
if ((edx >> 0) & 1) {
|
||||||
|
asm volatile("finit");
|
||||||
|
LOG("FPU(x87) поддерживается!\n");
|
||||||
|
}
|
||||||
|
|
||||||
if ((edx >> 22) & 1) {
|
if ((edx >> 22) & 1) {
|
||||||
acpi_msrs_support = true;
|
acpi_msrs_support = true;
|
||||||
LOG("Встроенный терморегулятор MSRS для ACPI\n");
|
LOG("Встроенный терморегулятор MSRS для ACPI\n");
|
||||||
LOG("Температура: %u (в QEMU/KVM всегда 0)\n", get_cpu_temperature( ));
|
LOG("Температура: %d (в QEMU/KVM всегда 0)\n",
|
||||||
}
|
get_cpu_temperature_intel( ));
|
||||||
|
|
||||||
if ((edx >> 23) & 1) {
|
|
||||||
mmx_support = true;
|
|
||||||
LOG("MMX поддерживается!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((edx >> 25) & 1) {
|
|
||||||
sse2_support = true;
|
|
||||||
LOG("SSE2 поддерживается!\n");
|
|
||||||
// sse_init( );
|
|
||||||
}
|
|
||||||
|
|
||||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
|
||||||
if ((edx >> 29) & 1) {
|
|
||||||
LOG("Термоконтроллер автоматически ограничивает температуру\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ecx >> 28) & 1) {
|
|
||||||
avx_support = true;
|
|
||||||
LOG("AVX поддерживается!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ecx >> 26) & 1) { LOG("XSAVE поддерживается!\n"); }
|
|
||||||
|
|
||||||
if ((ecx >> 30) & 1) {
|
|
||||||
rdrnd_support = true;
|
|
||||||
LOG("RDRND поддерживается!\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
|
cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
|
||||||
|
|
||||||
LOG("Максимально поддерживаемая функция CPUID = 0x%x (%u)\n", eax, eax);
|
LOG("Максимально поддерживаемая функция CPUID = 0x%x (%u)\n", eax, eax);
|
||||||
|
|
||||||
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
|
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
|
||||||
|
|
||||||
if ((edx >> 5) & 1) { LOG("Регистры MSR подерживаются!\n"); }
|
if ((edx >> 5) & 1) { LOG("Регистры MSR подерживаются!\n"); }
|
||||||
|
|
||||||
if ((edx >> 6) & 1) {
|
|
||||||
LOG("Расширение физического адреса поддерживается!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((edx >> 7) & 1) {
|
|
||||||
LOG("Исключение проверки компьютера (MCE) поддерживается!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((edx >> 9) & 1) {
|
if ((edx >> 9) & 1) {
|
||||||
LOG("Усовершенствованный программируемый контроллер прерываний "
|
LOG("Усовершенствованный программируемый контроллер прерываний "
|
||||||
"поддерживается!\n");
|
"поддерживается!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((edx >> 10) & 1) {
|
if ((edx >> 10) & 1) {
|
||||||
fb_printf(
|
LOG("SYSCALL/SYSRET(для AMD семейства 5 линейки 7) подерживаются!\n");
|
||||||
"SYSCALL/SYSRET(для AMD семейства 5 линейки 7) подерживаются!\n");
|
|
||||||
}
|
}
|
||||||
if ((edx >> 11) & 1) { LOG("SYSCALL/SYSRET подерживаются!\n"); }
|
if ((edx >> 11) & 1) { LOG("SYSCALL/SYSRET подерживаются!\n"); }
|
||||||
|
|
||||||
// if ((edx >> 26) & 1) { LOG("Гигабайтные страницы
|
|
||||||
// подерживаются!\n"); }
|
|
||||||
|
|
||||||
if ((edx >> 29) & 1) { LOG("AMD64 поддерживается!\n"); }
|
if ((edx >> 29) & 1) { LOG("AMD64 поддерживается!\n"); }
|
||||||
// if ((edx >> 30) & 1) { LOG("\"3DNow!\" поддерживается!\n"); }
|
|
||||||
// if ((edx >> 31) & 1) { LOG("\"Extended 3DNow!\"
|
|
||||||
// поддерживается!\n"); }
|
|
||||||
if ((ecx >> 6) & 1) { LOG("SSE4a поддерживается!\n"); }
|
|
||||||
if ((ecx >> 7) & 1) { LOG("Смещенный режим SSE поддерживается!\n"); }
|
|
||||||
|
|
||||||
cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
|
cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
|
||||||
if ((ebx >> 0) & 1) {
|
|
||||||
LOG("Восстановление после переполнения MCA поддерживается!\n");
|
|
||||||
}
|
|
||||||
if ((ebx >> 1) & 1) {
|
|
||||||
LOG("Возможность локализации и восстановления неисправимых "
|
|
||||||
"программных ошибок поддерживается!\n");
|
|
||||||
}
|
|
||||||
if ((edx >> 0) & 1) { LOG("Датчик температуры поддерживается!\n"); }
|
if ((edx >> 0) & 1) { LOG("Датчик температуры поддерживается!\n"); }
|
||||||
if ((edx >> 3) & 1) { LOG("Терморегулятор поддерживается!\n"); }
|
|
||||||
if ((edx >> 4) & 1) {
|
if ((edx >> 4) & 1) {
|
||||||
LOG("Аппаратный терморегулятор (HTC) поддерживается!\n");
|
LOG("Аппаратный терморегулятор (HTC) поддерживается!\n");
|
||||||
}
|
}
|
||||||
if ((edx >> 5) & 1) {
|
if ((edx >> 5) & 1) {
|
||||||
LOG("Программный терморегулятор (STC) поддерживается!\n");
|
LOG("Программный терморегулятор (STC) поддерживается!\n");
|
||||||
}
|
}
|
||||||
if ((edx >> 6) & 1) {
|
|
||||||
LOG("Управление множителем 100 МГц поддерживается!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// LOG("0x80000007[ECX] = 0x%x (%u)\n", ecx, ecx);
|
|
||||||
|
|
||||||
cpuid(0xC0000000, &eax, &ebx, &ecx, &edx);
|
|
||||||
if (eax > 0xC0000000) { LOG("0xC0000000 [EAX] = 0x%x (%u)\n", eax, eax); }
|
|
||||||
|
|
||||||
brandname( );
|
brandname( );
|
||||||
l2_cache( );
|
l2_cache( );
|
||||||
|
6
modules/simd/build.sh
Normal file
6
modules/simd/build.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#/bin/sh
|
||||||
|
echo "Название: SIMD"
|
||||||
|
echo "Лицензия: Публичное достояние"
|
||||||
|
gcc -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib main.c -o simd.o
|
||||||
|
gcc -Wl,--entry=init -fPIC -shared -nostdlib simd.o -o simd.ko
|
||||||
|
echo "Сборка завершена, файл: simd.ko"
|
34
modules/simd/main.c
Normal file
34
modules/simd/main.c
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include <system.h>
|
||||||
|
|
||||||
|
static char fxsave_region[512] __attribute__((aligned(16)));
|
||||||
|
|
||||||
|
static inline void cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx,
|
||||||
|
uint32_t *ecx, uint32_t *edx) {
|
||||||
|
asm volatile("cpuid"
|
||||||
|
: "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
|
||||||
|
: "a"(leaf));
|
||||||
|
}
|
||||||
|
|
||||||
|
module_info_t init(env_t *env) {
|
||||||
|
init_env(env);
|
||||||
|
|
||||||
|
uint32_t eax, ebx, ecx, edx;
|
||||||
|
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||||
|
|
||||||
|
if ((edx >> 23) & 1) { env->fb_printf("MMX поддерживается!\n"); }
|
||||||
|
|
||||||
|
if ((edx >> 25) & 1) {
|
||||||
|
env->fb_printf("SSE2 поддерживается!\n");
|
||||||
|
env->fb_printf("Адрес региона fxsave 0x%x\n", &fxsave_region);
|
||||||
|
asm volatile(" fxsave %0 " ::"m"(fxsave_region));
|
||||||
|
uint32_t sse_version = (ecx >> 25) & 0x7;
|
||||||
|
env->fb_printf("SSE%u включен\n", sse_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ecx >> 28) & 1) { env->fb_printf("AVX поддерживается!\n"); }
|
||||||
|
|
||||||
|
return (module_info_t){ .name = (char *)"SIMD",
|
||||||
|
.message = (char *)"SIMD инструкции",
|
||||||
|
.err_code = 404,
|
||||||
|
.func_count = 1 };
|
||||||
|
}
|
@ -133,7 +133,7 @@ def create_hdd(IMAGE_NAME):
|
|||||||
os.system("mformat -i {}.hdd@@1M".format(IMAGE_NAME))
|
os.system("mformat -i {}.hdd@@1M".format(IMAGE_NAME))
|
||||||
os.system("mmd -i {}.hdd@@1M ::/mod ::/EFI ::/EFI/BOOT ::/user".format(IMAGE_NAME))
|
os.system("mmd -i {}.hdd@@1M ::/mod ::/EFI ::/EFI/BOOT ::/user".format(IMAGE_NAME))
|
||||||
os.system("mcopy -i {}.hdd@@1M kernel.elf configs/limine.cfg limine/limine-bios.sys ::/".format(IMAGE_NAME))
|
os.system("mcopy -i {}.hdd@@1M kernel.elf configs/limine.cfg limine/limine-bios.sys ::/".format(IMAGE_NAME))
|
||||||
os.system("mcopy -i {}.hdd@@1M modules/music/music.ko modules/helloworld/hello.ko ::/mod".format(IMAGE_NAME))
|
os.system("mcopy -i {}.hdd@@1M modules/music/music.ko modules/simd/simd.ko modules/helloworld/hello.ko ::/mod".format(IMAGE_NAME))
|
||||||
os.system("mcopy -i {}.hdd@@1M limine/BOOTX64.EFI limine/BOOTIA32.EFI ::/EFI/BOOT".format(IMAGE_NAME))
|
os.system("mcopy -i {}.hdd@@1M limine/BOOTX64.EFI limine/BOOTIA32.EFI ::/EFI/BOOT".format(IMAGE_NAME))
|
||||||
os.system("mcopy -i {}.hdd@@1M boot.tga ::/".format(IMAGE_NAME))
|
os.system("mcopy -i {}.hdd@@1M boot.tga ::/".format(IMAGE_NAME))
|
||||||
os.system("./limine/limine bios-install {}.hdd".format(IMAGE_NAME))
|
os.system("./limine/limine bios-install {}.hdd".format(IMAGE_NAME))
|
||||||
@ -149,6 +149,7 @@ def create_iso(IMAGE_NAME):
|
|||||||
os.system("mkdir -p iso_root/mod")
|
os.system("mkdir -p iso_root/mod")
|
||||||
os.system("cp -v modules/helloworld/hello.ko iso_root/mod/")
|
os.system("cp -v modules/helloworld/hello.ko iso_root/mod/")
|
||||||
os.system("cp -v modules/music/music.ko iso_root/mod/")
|
os.system("cp -v modules/music/music.ko iso_root/mod/")
|
||||||
|
os.system("cp -v modules/simd/simd.ko iso_root/mod/")
|
||||||
os.system("cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
|
os.system("cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
|
||||||
os.system("cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/")
|
os.system("cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/")
|
||||||
os.system("xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {}.iso".format(IMAGE_NAME))
|
os.system("xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {}.iso".format(IMAGE_NAME))
|
||||||
|
Loading…
Reference in New Issue
Block a user