2023-02-17 15:27:36 +00:00
|
|
|
//
|
|
|
|
// Created by nigel on 17/02/23.
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "processor.h"
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t processor::cap_page;
|
|
|
|
uint32_t processor::cap_page1;
|
|
|
|
uint32_t processor::cap_page7 ;
|
|
|
|
|
|
|
|
void processor::initialize()
|
|
|
|
{
|
|
|
|
|
|
|
|
asm volatile ("movl $0x80000001, %%eax;"
|
|
|
|
"CPUID;"
|
|
|
|
"movl %%edx, %0"
|
|
|
|
:: "m"(cap_page));
|
|
|
|
|
|
|
|
asm volatile ("movl $0x01, %%eax; "
|
|
|
|
"CPUID;"
|
|
|
|
"movl %%edx, %0"
|
|
|
|
:: "m"(cap_page1));
|
|
|
|
|
|
|
|
asm volatile ("movl $0x07, %%eax;"
|
|
|
|
"movl $0x0, %%ecx;"
|
|
|
|
"CPUID;"
|
|
|
|
"movl %%edx, %0"
|
|
|
|
:: "m"(cap_page7));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool processor::hasAMXExtension()
|
|
|
|
{
|
|
|
|
return (cap_page7 & AMX_TYPE::AMX_BF16) || (cap_page7 & AMX_TYPE::AMX_TILE) || (cap_page7 & AMX_TYPE::AMX_INT8);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PSE: page-size extensions for 32-bit paging.
|
|
|
|
* If CPUID.01H:EDX.PSE [bit 3] = 1, CR4.PSE may be set to 1, enabling support for 4-MByte pages with 32-bit paging
|
|
|
|
*/
|
|
|
|
bool processor::has32bitPagingSupport() {
|
|
|
|
// is the PSE bit set
|
|
|
|
return cap_page1 & (0x1 << 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PAE: physical-address extension.
|
|
|
|
* If CPUID.01H:EDX.PAE [bit 6] = 1, CR4.PAE may be set to 1, enabling PAE paging (this setting is also required
|
|
|
|
* for 4-level paging and 5-level paging).
|
|
|
|
*/
|
|
|
|
bool processor::hasPAEExtension(){
|
|
|
|
return cap_page1 & (0x1 << 6);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PGE: global-page support.
|
|
|
|
* If CPUID.01H:EDX.PGE [bit 13] = 1, CR4.PGE may be set to 1, enabling the global-page feature (see Section
|
|
|
|
* 4.10.2.4).
|
|
|
|
*/
|
|
|
|
bool processor::hasPageSupport(){
|
|
|
|
return cap_page1 & (0x1 << 13);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Page1GB: 1-GByte pages.
|
|
|
|
* If CPUID.80000001H:EDX.Page1GB [bit 26] = 1, 1-GByte pages may be supported with 4-level paging and 5-
|
|
|
|
* level paging (see Section 4.5).
|
|
|
|
*/
|
|
|
|
bool processor::gigabytePages() {
|
|
|
|
return cap_page & (0x1 << 26);
|
2023-02-17 21:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void processor::enable_protectedMode()
|
|
|
|
{
|
|
|
|
// Set the protected bit of control register 0
|
|
|
|
// this will put the CPU into protected mode
|
|
|
|
// NOTE: This should really be an assembly procedure
|
|
|
|
// We cant directly write to control register 0
|
|
|
|
// therefor we copy the value of control register 0 into eax
|
|
|
|
// once we are done manipulating the value we write the value in
|
|
|
|
// eax back to control register 0
|
|
|
|
|
|
|
|
asm volatile("mov %cr0, %eax ");
|
|
|
|
asm volatile("or $1, %eax");
|
|
|
|
asm volatile("mov %eax, %cr0");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t processor::GetEFLAGS()
|
|
|
|
{
|
|
|
|
uint32_t EFLAGS = 0;
|
|
|
|
asm volatile ("pushfl;" "movl 4(%%esp), %%edx" : "=d"(EFLAGS));
|
|
|
|
return EFLAGS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t processor::GetCR0()
|
|
|
|
{
|
|
|
|
uint32_t cr0_value;
|
|
|
|
asm volatile ("movl %%cr0, %%edx" : "=d"(cr0_value));
|
|
|
|
return cr0_value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t processor::GetCR2(){
|
|
|
|
uint32_t cr2_value;
|
|
|
|
__asm__ volatile("movl %%cr2, %%edx": "=d"(cr2_value));
|
|
|
|
return cr2_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t processor::GetCR3(){
|
|
|
|
uint32_t cr3_value;
|
|
|
|
__asm__ volatile("movl %%cr3, %%edx": "=d"(cr3_value));
|
|
|
|
return cr3_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t processor::GetCR4(){
|
|
|
|
uint32_t cr4_value;
|
|
|
|
__asm__ volatile("movl %%cr4, %%edx": "=d"(cr4_value));
|
|
|
|
return cr4_value;
|
2023-02-17 15:27:36 +00:00
|
|
|
}
|