x32 is now compiling

This commit is contained in:
Alex 2023-03-04 21:17:19 +02:00
parent aa29c8a415
commit 5c91f23527
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
57 changed files with 1217 additions and 573 deletions

View File

@ -241,12 +241,12 @@ namespace APIC
bool x2APICSupported = false; bool x2APICSupported = false;
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -257,12 +257,12 @@ namespace APIC
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));

View File

@ -158,7 +158,7 @@ int __ctzdi2(arith64_u64 a)
arith64_u64 __divmoddi4(arith64_u64 a, arith64_u64 b, arith64_u64 *c) arith64_u64 __divmoddi4(arith64_u64 a, arith64_u64 b, arith64_u64 *c)
{ {
if (b > a) // if (b > a)
{ {
if (c) if (c)
*c = a; *c = a;
@ -283,3 +283,45 @@ int __gedf2(double a, double b) { return a >= b; }
int __fixdfsi(double a) { return (int)a; } int __fixdfsi(double a) { return (int)a; }
long __fixdfdi(double a) { return (long)a; } long __fixdfdi(double a) { return (long)a; }
int __ledf2(double a, double b) { return a <= b; } int __ledf2(double a, double b) { return a <= b; }
/* FIXME: Check if these functions are implemented correctly */
typedef long long int64_t;
typedef unsigned long long uint64_t;
typedef unsigned int uint32_t;
typedef struct
{
uint64_t value;
} atomic_uint64_t;
uint64_t __atomic_load_8(const atomic_uint64_t *p)
{
uint64_t value;
__asm__ volatile("lock cmpxchg8b %1"
: "=A"(value)
: "m"(*p)
: "memory");
return value;
}
void __atomic_store_8(atomic_uint64_t *p, uint64_t value)
{
__asm__ volatile("lock cmpxchg8b %0"
: "=m"(p->value)
: "a"((uint32_t)value), "d"((uint32_t)(value >> 32)), "m"(*p)
: "memory");
}
/* FIXME: __fixsfsi is not implemented correctly(?) */
int __fixsfsi(float a) { return (int)a; }
int __ltsf2(float a, float b) { return a < b; }
int __eqsf2(float a, float b) { return a == b; }
float __divsf3(float a, float b) { return a / b; }
double __extendsfdf2(float a) { return (double)a; }
float __truncdfsf2(double a) { return (float)a; }
float __subsf3(float a, float b) { return a - b; }
float __floatsisf(int a) { return (float)a; }
int __fixunssfsi(float a) { return (int)a; }
float __mulsf3(float a, float b) { return a * b; }
float __addsf3(float a, float b) { return a + b; }

View File

@ -1,10 +1,13 @@
#include <types.h> #include <types.h>
#include <boot/protocols/multiboot2.h> #include <boot/protocols/multiboot2.h>
#include <memory.hpp>
#include <io.h> #include <io.h>
#include "../../kernel.h" #include "../../kernel.h"
BootInfo mb2binfo;
enum VideoType enum VideoType
{ {
VIDEO_TYPE_NONE = 0x00, VIDEO_TYPE_NONE = 0x00,
@ -47,72 +50,52 @@ void GetSMBIOS()
} }
} }
struct multiboot_info void ProcessMB2(unsigned long Info)
{ {
multiboot_uint32_t Size; uint8_t *VideoBuffer = (uint8_t *)0xB8F00 + 0xC0000000;
multiboot_uint32_t Reserved; int pos = 0;
struct multiboot_tag *Tag; auto InfoAddress = Info;
}; for (auto Tag = (struct multiboot_tag *)((uint8_t *)InfoAddress + 8);
;
EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic) Tag = (struct multiboot_tag *)((multiboot_uint8_t *)Tag + ((Tag->size + 7) & ~7)))
{
if (Info == NULL || Magic == NULL)
{ {
if (Magic == NULL) VideoBuffer[pos++] = '.';
error("Multiboot magic is NULL"); VideoBuffer[pos++] = 0x2;
if (Info == NULL)
error("Multiboot info is NULL");
CPU::Stop();
}
else if (Magic != MULTIBOOT2_BOOTLOADER_MAGIC)
{
error("Multiboot magic is invalid (%#x != %#x)", Magic, MULTIBOOT2_BOOTLOADER_MAGIC);
trace("Hello, World!");
CPU::Stop();
}
uint64_t div = 1193180 / 1000;
outb(0x43, 0xB6);
outb(0x42, (uint8_t)div);
outb(0x42, (uint8_t)(div >> 8));
uint8_t tmp = inb(0x61);
if (tmp != (tmp | 3))
outb(0x61, tmp | 3);
BootInfo binfo;
uint32_t Itr = 0;
for (uint32_t i = 8; i < Info->Size; i += Itr)
{
multiboot_tag *Tag = (multiboot_tag *)((uint8_t *)Info + i);
if (Tag->type == MULTIBOOT_TAG_TYPE_END) if (Tag->type == MULTIBOOT_TAG_TYPE_END)
{
debug("End of multiboot2 tags");
break; break;
}
switch (Tag->type) switch (Tag->type)
{ {
case MULTIBOOT_TAG_TYPE_CMDLINE: case MULTIBOOT_TAG_TYPE_CMDLINE:
{ {
strncpy(binfo.Kernel.CommandLine, strncpy(mb2binfo.Kernel.CommandLine,
((multiboot_tag_string *)Tag)->string, ((multiboot_tag_string *)Tag)->string,
strlen(((multiboot_tag_string *)Tag)->string)); strlen(((multiboot_tag_string *)Tag)->string));
debug("Kernel command line: %s", mb2binfo.Kernel.CommandLine);
break; break;
} }
case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME: case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME:
{ {
strncpy(binfo.Bootloader.Name, strncpy(mb2binfo.Bootloader.Name,
((multiboot_tag_string *)Tag)->string, ((multiboot_tag_string *)Tag)->string,
strlen(((multiboot_tag_string *)Tag)->string)); strlen(((multiboot_tag_string *)Tag)->string));
debug("Bootloader name: %s", mb2binfo.Bootloader.Name);
break; break;
} }
case MULTIBOOT_TAG_TYPE_MODULE: case MULTIBOOT_TAG_TYPE_MODULE:
{ {
multiboot_tag_module *module = (multiboot_tag_module *)Tag; multiboot_tag_module *module = (multiboot_tag_module *)Tag;
static int module_count = 0; static int module_count = 0;
binfo.Modules[module_count++].Address = (void *)module->mod_start; mb2binfo.Modules[module_count++].Address = (void *)module->mod_start;
binfo.Modules[module_count++].Size = module->size; mb2binfo.Modules[module_count++].Size = module->size;
strncpy(binfo.Modules[module_count++].Path, "(null)", 6); strncpy(mb2binfo.Modules[module_count++].Path, "(null)", 6);
strncpy(binfo.Modules[module_count++].CommandLine, module->cmdline, strncpy(mb2binfo.Modules[module_count++].CommandLine, module->cmdline,
strlen(module->cmdline)); strlen(module->cmdline));
debug("Module: %s", mb2binfo.Modules[module_count++].Path);
break; break;
} }
case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
@ -133,8 +116,7 @@ EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
{ {
multiboot_tag_mmap *mmap = (multiboot_tag_mmap *)Tag; multiboot_tag_mmap *mmap = (multiboot_tag_mmap *)Tag;
uint32_t EntryCount = mmap->size / sizeof(multiboot_mmap_entry); uint32_t EntryCount = mmap->size / sizeof(multiboot_mmap_entry);
mb2binfo.Memory.Entries = EntryCount;
binfo.Memory.Entries = EntryCount;
for (uint32_t i = 0; i < EntryCount; i++) for (uint32_t i = 0; i < EntryCount; i++)
{ {
if (EntryCount > MAX_MEMORY_ENTRIES) if (EntryCount > MAX_MEMORY_ENTRIES)
@ -142,42 +124,45 @@ EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
warn("Too many memory entries, skipping the rest..."); warn("Too many memory entries, skipping the rest...");
break; break;
} }
multiboot_mmap_entry entry = mmap->entries[i]; multiboot_mmap_entry entry = mmap->entries[i];
binfo.Memory.Size += entry.len; mb2binfo.Memory.Size += entry.len;
switch (entry.type) switch (entry.type)
{ {
case MULTIBOOT_MEMORY_AVAILABLE: case MULTIBOOT_MEMORY_AVAILABLE:
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
binfo.Memory.Entry[i].Length = entry.len; mb2binfo.Memory.Entry[i].Length = entry.len;
binfo.Memory.Entry[i].Type = Usable; mb2binfo.Memory.Entry[i].Type = Usable;
break; break;
case MULTIBOOT_MEMORY_RESERVED: case MULTIBOOT_MEMORY_RESERVED:
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
binfo.Memory.Entry[i].Length = entry.len; mb2binfo.Memory.Entry[i].Length = entry.len;
binfo.Memory.Entry[i].Type = Reserved; mb2binfo.Memory.Entry[i].Type = Reserved;
break; break;
case MULTIBOOT_MEMORY_ACPI_RECLAIMABLE: case MULTIBOOT_MEMORY_ACPI_RECLAIMABLE:
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
binfo.Memory.Entry[i].Length = entry.len; mb2binfo.Memory.Entry[i].Length = entry.len;
binfo.Memory.Entry[i].Type = ACPIReclaimable; mb2binfo.Memory.Entry[i].Type = ACPIReclaimable;
break; break;
case MULTIBOOT_MEMORY_NVS: case MULTIBOOT_MEMORY_NVS:
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
binfo.Memory.Entry[i].Length = entry.len; mb2binfo.Memory.Entry[i].Length = entry.len;
binfo.Memory.Entry[i].Type = ACPINVS; mb2binfo.Memory.Entry[i].Type = ACPINVS;
break; break;
case MULTIBOOT_MEMORY_BADRAM: case MULTIBOOT_MEMORY_BADRAM:
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
binfo.Memory.Entry[i].Length = entry.len; mb2binfo.Memory.Entry[i].Length = entry.len;
binfo.Memory.Entry[i].Type = BadMemory; mb2binfo.Memory.Entry[i].Type = BadMemory;
break; break;
default: default:
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
binfo.Memory.Entry[i].Length = entry.len; mb2binfo.Memory.Entry[i].Length = entry.len;
binfo.Memory.Entry[i].Type = Unknown; mb2binfo.Memory.Entry[i].Type = Unknown;
break; break;
} }
debug("Memory entry: [BaseAddress: %#x, Length: %#x, Type: %d]",
mb2binfo.Memory.Entry[i].BaseAddress,
mb2binfo.Memory.Entry[i].Length,
mb2binfo.Memory.Entry[i].Type);
} }
break; break;
} }
@ -192,14 +177,12 @@ EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
{ {
multiboot_tag_framebuffer *fb = (multiboot_tag_framebuffer *)Tag; multiboot_tag_framebuffer *fb = (multiboot_tag_framebuffer *)Tag;
static int fb_count = 0; static int fb_count = 0;
mb2binfo.Framebuffer[fb_count].BaseAddress = (void *)fb->common.framebuffer_addr;
binfo.Framebuffer[fb_count].BaseAddress = (void *)fb->common.framebuffer_addr; mb2binfo.Framebuffer[fb_count].Width = fb->common.framebuffer_width;
binfo.Framebuffer[fb_count].Width = fb->common.framebuffer_width; mb2binfo.Framebuffer[fb_count].Height = fb->common.framebuffer_height;
binfo.Framebuffer[fb_count].Height = fb->common.framebuffer_height; mb2binfo.Framebuffer[fb_count].Pitch = fb->common.framebuffer_pitch;
binfo.Framebuffer[fb_count].Pitch = fb->common.framebuffer_pitch; mb2binfo.Framebuffer[fb_count].BitsPerPixel = fb->common.framebuffer_bpp;
binfo.Framebuffer[fb_count].BitsPerPixel = fb->common.framebuffer_bpp; mb2binfo.Framebuffer[fb_count].MemoryModel = fb->common.framebuffer_type;
binfo.Framebuffer[fb_count].MemoryModel = fb->common.framebuffer_type;
switch (fb->common.framebuffer_type) switch (fb->common.framebuffer_type)
{ {
case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED: case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED:
@ -209,12 +192,12 @@ EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
} }
case MULTIBOOT_FRAMEBUFFER_TYPE_RGB: case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
{ {
binfo.Framebuffer[fb_count].RedMaskSize = fb->framebuffer_red_mask_size; mb2binfo.Framebuffer[fb_count].RedMaskSize = fb->framebuffer_red_mask_size;
binfo.Framebuffer[fb_count].RedMaskShift = fb->framebuffer_red_field_position; mb2binfo.Framebuffer[fb_count].RedMaskShift = fb->framebuffer_red_field_position;
binfo.Framebuffer[fb_count].GreenMaskSize = fb->framebuffer_green_mask_size; mb2binfo.Framebuffer[fb_count].GreenMaskSize = fb->framebuffer_green_mask_size;
binfo.Framebuffer[fb_count].GreenMaskShift = fb->framebuffer_green_field_position; mb2binfo.Framebuffer[fb_count].GreenMaskShift = fb->framebuffer_green_field_position;
binfo.Framebuffer[fb_count].BlueMaskSize = fb->framebuffer_blue_mask_size; mb2binfo.Framebuffer[fb_count].BlueMaskSize = fb->framebuffer_blue_mask_size;
binfo.Framebuffer[fb_count].BlueMaskShift = fb->framebuffer_blue_field_position; mb2binfo.Framebuffer[fb_count].BlueMaskShift = fb->framebuffer_blue_field_position;
break; break;
} }
case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT: case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT:
@ -223,12 +206,11 @@ EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
break; break;
} }
} }
debug("Framebuffer %d: %dx%d %d bpp", i, fb->common.framebuffer_width, fb->common.framebuffer_height, fb->common.framebuffer_bpp); debug("Framebuffer %d: %dx%d %d bpp", Tag, fb->common.framebuffer_width, fb->common.framebuffer_height, fb->common.framebuffer_bpp);
debug("More info:\nAddress: %p\nPitch: %lld\nMemoryModel: %d\nRedMaskSize: %d\nRedMaskShift: %d\nGreenMaskSize: %d\nGreenMaskShift: %d\nBlueMaskSize: %d\nBlueMaskShift: %d", debug("More info:\nAddress: %p\nPitch: %lld\nMemoryModel: %d\nRedMaskSize: %d\nRedMaskShift: %d\nGreenMaskSize: %d\nGreenMaskShift: %d\nBlueMaskSize: %d\nBlueMaskShift: %d",
fb->common.framebuffer_addr, fb->common.framebuffer_pitch, fb->common.framebuffer_type, fb->common.framebuffer_addr, fb->common.framebuffer_pitch, fb->common.framebuffer_type,
fb->framebuffer_red_mask_size, fb->framebuffer_red_field_position, fb->framebuffer_green_mask_size, fb->framebuffer_red_mask_size, fb->framebuffer_red_field_position, fb->framebuffer_green_mask_size,
fb->framebuffer_green_field_position, fb->framebuffer_blue_mask_size, fb->framebuffer_blue_field_position); fb->framebuffer_green_field_position, fb->framebuffer_blue_mask_size, fb->framebuffer_blue_field_position);
fb_count++; fb_count++;
break; break;
} }
@ -266,12 +248,14 @@ EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
} }
case MULTIBOOT_TAG_TYPE_ACPI_OLD: case MULTIBOOT_TAG_TYPE_ACPI_OLD:
{ {
binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_old_acpi *)Tag)->rsdp; mb2binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_old_acpi *)Tag)->rsdp;
debug("OLD ACPI RSDP: %p", mb2binfo.RSDP);
break; break;
} }
case MULTIBOOT_TAG_TYPE_ACPI_NEW: case MULTIBOOT_TAG_TYPE_ACPI_NEW:
{ {
binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_new_acpi *)Tag)->rsdp; mb2binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_new_acpi *)Tag)->rsdp;
debug("NEW ACPI RSDP: %p", mb2binfo.RSDP);
break; break;
} }
case MULTIBOOT_TAG_TYPE_NETWORK: case MULTIBOOT_TAG_TYPE_NETWORK:
@ -307,37 +291,49 @@ EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
case MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR: case MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR:
{ {
multiboot_tag_load_base_addr *load_base_addr = (multiboot_tag_load_base_addr *)Tag; multiboot_tag_load_base_addr *load_base_addr = (multiboot_tag_load_base_addr *)Tag;
binfo.Kernel.PhysicalBase = (void *)load_base_addr->load_base_addr; mb2binfo.Kernel.PhysicalBase = (void *)load_base_addr->load_base_addr;
binfo.Kernel.VirtualBase = (void *)(load_base_addr->load_base_addr + 0xC0000000); mb2binfo.Kernel.VirtualBase = (void *)(load_base_addr->load_base_addr + 0xC0000000);
debug("Kernel base: %p (physical) %p (virtual)", mb2binfo.Kernel.PhysicalBase, mb2binfo.Kernel.VirtualBase);
break;
}
default:
{
error("Unknown multiboot2 tag type: %d", Tag->type);
break; break;
} }
} }
Itr = Tag->size;
if ((Itr % 8) != 0)
Itr += (8 - Itr % 8);
} }
}
EXTERNC void x32Multiboot2Entry(unsigned long Info, unsigned int Magic)
{
if (Info == NULL || Magic == NULL)
{
if (Magic == NULL)
error("Multiboot magic is NULL");
if (Info == NULL)
error("Multiboot info is NULL");
CPU::Stop();
}
else if (Magic != MULTIBOOT2_BOOTLOADER_MAGIC)
{
error("Multiboot magic is invalid (%#x != %#x)", Magic, MULTIBOOT2_BOOTLOADER_MAGIC);
CPU::Stop();
}
uint64_t div = 1193180 / 1000;
outb(0x43, 0xB6);
outb(0x42, (uint8_t)div);
outb(0x42, (uint8_t)(div >> 8));
uint8_t tmp = inb(0x61);
if (tmp != (tmp | 3))
outb(0x61, tmp | 3);
ProcessMB2(Info);
tmp = inb(0x61) & 0xFC; tmp = inb(0x61) & 0xFC;
outb(0x61, tmp); outb(0x61, tmp);
int *vm = (int *)0xb8000;
// "Not supported yet"
vm[0] = 0x054E;
vm[1] = 0x056F;
vm[2] = 0x0574;
vm[3] = 0x0520;
vm[4] = 0x0573;
vm[5] = 0x0575;
vm[6] = 0x0570;
vm[7] = 0x0570;
vm[8] = 0x0572;
vm[9] = 0x056F;
vm[10] = 0x0574;
vm[11] = 0x0520;
vm[12] = 0x0579;
vm[13] = 0x0565;
vm[14] = 0x0574;
CPU::Stop(); CPU::Stop();
// Entry(&binfo); Entry(&mb2binfo);
} }

View File

@ -324,7 +324,7 @@ namespace APIC
private: private:
APIC *lapic; APIC *lapic;
uint64_t Ticks = 0; uint64_t Ticks = 0;
void OnInterruptReceived(CPU::x64::TrapFrame *Frame); void OnInterruptReceived(CPU::x32::TrapFrame *Frame);
public: public:
uint64_t GetTicks() { return Ticks; } uint64_t GetTicks() { return Ticks; }

View File

@ -1,4 +1,5 @@
; Inspired From: https://github.com/MQuy/mos/blob/master/src/kernel/boot.asm ; https://wiki.osdev.org/Higher_Half_x86_Bare_Bones
; https://wiki.osdev.org/Higher_Half_x86_Bare_Bones_(Backup)
section .multiboot2 section .multiboot2
align 4096 align 4096
HEADER_START: HEADER_START:
@ -7,6 +8,33 @@ HEADER_START:
dd (HEADER_END - HEADER_START) dd (HEADER_END - HEADER_START)
dd 0x100000000 - (HEADER_END - HEADER_START) - 0 - 0xE85250D6 dd 0x100000000 - (HEADER_END - HEADER_START) - 0 - 0xE85250D6
align 8 align 8
MB2_INFO_REQUEST_TAG_START:
dw 1
dw 0
dd MB2_INFO_REQUEST_TAG_END - MB2_INFO_REQUEST_TAG_START
dd 1 ; Command Line
dd 2 ; Boot Loader Name
dd 3 ; Module
dd 4 ; Basic Memory Information
dd 5 ; BIOS Boot Device
dd 6 ; Memory Map
dd 7 ; VBE
dd 8 ; Framebuffer
dd 9 ; ELF Sections
dd 10 ; APM Table
dd 11 ; EFI 32-bit System Table Pointer
dd 12 ; EFI 64-bit System Table Pointer
; dd 13 ; SMBIOS
dd 14 ; ACPI Old
dd 15 ; ACPI New
dd 16 ; Network
dd 17 ; EFI Memory Map
dd 18 ; EFI Boot Services Notifier
dd 19 ; EFI 32-bit Image Handle Pointer
dd 20 ; EFI 64-bit Image Handle Pointer
dd 21 ; Load Base Address
MB2_INFO_REQUEST_TAG_END:
align 8
MB2_TAG_START: MB2_TAG_START:
dw 0 dw 0
dw 0 dw 0
@ -25,34 +53,41 @@ section .data
align 0x1000 align 0x1000
BootPageTable: BootPageTable:
dd 0x00000083 dd 0x00000083
times ((KERNEL_PAGE_NUMBER) - 1) dd 0
dd 0x00000083 dd 0x00000083
times (1024 - KERNEL_PAGE_NUMBER - 1) dd 0 times (KERNEL_PAGE_NUMBER - 2) dd 0
dd 0x00000083
dd 0x00000083
times (1024 - KERNEL_PAGE_NUMBER - 2) dd 0
section .text section .text
_start: _start:
mov word [0xb8000], 0x074C ; L mov word [0xb8F00], 0x072E ; .
mov word [0xb8002], 0x076F ; o
mov word [0xb8004], 0x0761 ; a
mov word [0xb8006], 0x0764 ; d
mov word [0xb8008], 0x0769 ; i
mov word [0xb800a], 0x076E ; n
mov word [0xb800c], 0x0767 ; g
mov word [0xb800e], 0x072E ; .
mov word [0xb8010], 0x072E ; .
mov word [0xb8012], 0x072E ; .
mov ecx, (BootPageTable - KERNEL_VIRTUAL_BASE) mov ecx, (BootPageTable - KERNEL_VIRTUAL_BASE)
mov cr3, ecx mov cr3, ecx
mov word [0xb8F02], 0x072E ; .
mov ecx, cr4 mov ecx, cr4
or ecx, 0x00000010 ; Set PSE in CR4 or ecx, 0x00000010 ; Set PSE in CR4
mov cr4, ecx mov cr4, ecx
mov word [0xb8F04], 0x072E ; .
mov ecx, cr0 mov ecx, cr0
or ecx, 0x80000000 ; Set PG in CR0 or ecx, 0x80000000 ; Set PG in CR0
mov cr0, ecx mov cr0, ecx
mov word [0xb8F06], 0x072E ; .
lea ecx, [HigherHalfStart] lea ecx, [HigherHalfStart]
jmp ecx jmp ecx
HigherHalfStart: HigherHalfStart:
mov word [0xb8F08], 0x072E ; .
mov dword [BootPageTable], 0
invlpg [0]
mov esp, KernelStack + KERNEL_STACK_SIZE mov esp, KernelStack + KERNEL_STACK_SIZE
push eax ; Multiboot2 Magic push eax ; Multiboot2 Magic

View File

@ -14,19 +14,19 @@ namespace CPU
char *Vendor() char *Vendor()
{ {
static char Vendor[13]; static char Vendor[13];
#if defined(__amd64__) #if defined(a64)
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
x64::cpuid(0x0, &eax, &ebx, &ecx, &edx); x64::cpuid(0x0, &eax, &ebx, &ecx, &edx);
memcpy_unsafe(Vendor + 0, &ebx, 4); memcpy_unsafe(Vendor + 0, &ebx, 4);
memcpy_unsafe(Vendor + 4, &edx, 4); memcpy_unsafe(Vendor + 4, &edx, 4);
memcpy_unsafe(Vendor + 8, &ecx, 4); memcpy_unsafe(Vendor + 8, &ecx, 4);
#elif defined(__i386__) #elif defined(a32)
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
x32::cpuid(0x0, &eax, &ebx, &ecx, &edx); x32::cpuid(0x0, &eax, &ebx, &ecx, &edx);
memcpy_unsafe(Vendor + 0, &ebx, 4); memcpy_unsafe(Vendor + 0, &ebx, 4);
memcpy_unsafe(Vendor + 4, &edx, 4); memcpy_unsafe(Vendor + 4, &edx, 4);
memcpy_unsafe(Vendor + 8, &ecx, 4); memcpy_unsafe(Vendor + 8, &ecx, 4);
#elif defined(__aarch64__) #elif defined(aa64)
asmv("mrs %0, MIDR_EL1" asmv("mrs %0, MIDR_EL1"
: "=r"(Vendor[0])); : "=r"(Vendor[0]));
#endif #endif
@ -36,7 +36,7 @@ namespace CPU
char *Name() char *Name()
{ {
static char Name[49]; static char Name[49];
#if defined(__amd64__) #if defined(a64)
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
x64::cpuid(0x80000002, &eax, &ebx, &ecx, &edx); x64::cpuid(0x80000002, &eax, &ebx, &ecx, &edx);
memcpy_unsafe(Name + 0, &eax, 4); memcpy_unsafe(Name + 0, &eax, 4);
@ -53,7 +53,7 @@ namespace CPU
memcpy_unsafe(Name + 36, &ebx, 4); memcpy_unsafe(Name + 36, &ebx, 4);
memcpy_unsafe(Name + 40, &ecx, 4); memcpy_unsafe(Name + 40, &ecx, 4);
memcpy_unsafe(Name + 44, &edx, 4); memcpy_unsafe(Name + 44, &edx, 4);
#elif defined(__i386__) #elif defined(a32)
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
x32::cpuid(0x80000002, &eax, &ebx, &ecx, &edx); x32::cpuid(0x80000002, &eax, &ebx, &ecx, &edx);
memcpy_unsafe(Name + 0, &eax, 4); memcpy_unsafe(Name + 0, &eax, 4);
@ -70,7 +70,7 @@ namespace CPU
memcpy_unsafe(Name + 36, &ebx, 4); memcpy_unsafe(Name + 36, &ebx, 4);
memcpy_unsafe(Name + 40, &ecx, 4); memcpy_unsafe(Name + 40, &ecx, 4);
memcpy_unsafe(Name + 44, &edx, 4); memcpy_unsafe(Name + 44, &edx, 4);
#elif defined(__aarch64__) #elif defined(aa64)
asmv("mrs %0, MIDR_EL1" asmv("mrs %0, MIDR_EL1"
: "=r"(Name[0])); : "=r"(Name[0]));
#endif #endif
@ -80,19 +80,19 @@ namespace CPU
char *Hypervisor() char *Hypervisor()
{ {
static char Hypervisor[13]; static char Hypervisor[13];
#if defined(__amd64__) #if defined(a64)
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
x64::cpuid(0x40000000, &eax, &ebx, &ecx, &edx); x64::cpuid(0x40000000, &eax, &ebx, &ecx, &edx);
memcpy_unsafe(Hypervisor + 0, &ebx, 4); memcpy_unsafe(Hypervisor + 0, &ebx, 4);
memcpy_unsafe(Hypervisor + 4, &ecx, 4); memcpy_unsafe(Hypervisor + 4, &ecx, 4);
memcpy_unsafe(Hypervisor + 8, &edx, 4); memcpy_unsafe(Hypervisor + 8, &edx, 4);
#elif defined(__i386__) #elif defined(a32)
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
x64::cpuid(0x40000000, &eax, &ebx, &ecx, &edx); x64::cpuid(0x40000000, &eax, &ebx, &ecx, &edx);
memcpy_unsafe(Hypervisor + 0, &ebx, 4); memcpy_unsafe(Hypervisor + 0, &ebx, 4);
memcpy_unsafe(Hypervisor + 4, &ecx, 4); memcpy_unsafe(Hypervisor + 4, &ecx, 4);
memcpy_unsafe(Hypervisor + 8, &edx, 4); memcpy_unsafe(Hypervisor + 8, &edx, 4);
#elif defined(__aarch64__) #elif defined(aa64)
asmv("mrs %0, MIDR_EL1" asmv("mrs %0, MIDR_EL1"
: "=r"(Hypervisor[0])); : "=r"(Hypervisor[0]));
#endif #endif
@ -106,17 +106,17 @@ namespace CPU
case Check: case Check:
{ {
uintptr_t Flags; uintptr_t Flags;
#if defined(__amd64__) #if defined(a64)
asmv("pushfq"); asmv("pushfq");
asmv("popq %0" asmv("popq %0"
: "=r"(Flags)); : "=r"(Flags));
return Flags & (1 << 9); return Flags & (1 << 9);
#elif defined(__i386__) #elif defined(a32)
asmv("pushfl"); asmv("pushfl");
asmv("popl %0" asmv("popl %0"
: "=r"(Flags)); : "=r"(Flags));
return Flags & (1 << 9); return Flags & (1 << 9);
#elif defined(__aarch64__) #elif defined(aa64)
asmv("mrs %0, daif" asmv("mrs %0, daif"
: "=r"(Flags)); : "=r"(Flags));
return !(Flags & (1 << 2)); return !(Flags & (1 << 2));
@ -124,18 +124,18 @@ namespace CPU
} }
case Enable: case Enable:
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("sti"); asmv("sti");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("msr daifclr, #2"); asmv("msr daifclr, #2");
#endif #endif
return true; return true;
} }
case Disable: case Disable:
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cli"); asmv("cli");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("msr daifset, #2"); asmv("msr daifset, #2");
#endif #endif
return true; return true;
@ -146,7 +146,7 @@ namespace CPU
void *PageTable(void *PT) void *PageTable(void *PT)
{ {
#if defined(__amd64__) #if defined(a64)
if (PT) if (PT)
asmv("movq %0, %%cr3" asmv("movq %0, %%cr3"
: :
@ -154,7 +154,7 @@ namespace CPU
else else
asmv("movq %%cr3, %0" asmv("movq %%cr3, %0"
: "=r"(PT)); : "=r"(PT));
#elif defined(__i386__) #elif defined(a32)
if (PT) if (PT)
asmv("movl %0, %%cr3" asmv("movl %0, %%cr3"
: :
@ -162,7 +162,7 @@ namespace CPU
else else
asmv("movl %%cr3, %0" asmv("movl %%cr3, %0"
: "=r"(PT)); : "=r"(PT));
#elif defined(__aarch64__) #elif defined(aa64)
if (PT) if (PT)
asmv("msr ttbr0_el1, %0" asmv("msr ttbr0_el1, %0"
: :
@ -178,19 +178,19 @@ namespace CPU
{ {
bool PGESupport = false; bool PGESupport = false;
bool SSESupport = false; bool SSESupport = false;
#if defined(__amd64__) #if defined(a64)
static int BSP = 0; static int BSP = 0;
x64::CR0 cr0 = x64::readcr0(); x64::CR0 cr0 = x64::readcr0();
x64::CR4 cr4 = x64::readcr4(); x64::CR4 cr4 = x64::readcr4();
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -202,12 +202,12 @@ namespace CPU
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -310,8 +310,8 @@ namespace CPU
trace("Features for BSP initialized."); trace("Features for BSP initialized.");
if (SSEEnableAfter) if (SSEEnableAfter)
SSEEnabled = true; SSEEnabled = true;
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
@ -319,13 +319,13 @@ namespace CPU
{ {
// TODO: Get the counter from the x2APIC or any other timer that is available. (TSC is not available on all CPUs) // TODO: Get the counter from the x2APIC or any other timer that is available. (TSC is not available on all CPUs)
uintptr_t Counter; uintptr_t Counter;
#if defined(__amd64__) #if defined(a64)
asmv("rdtsc" asmv("rdtsc"
: "=A"(Counter)); : "=A"(Counter));
#elif defined(__i386__) #elif defined(a32)
asmv("rdtsc" asmv("rdtsc"
: "=A"(Counter)); : "=A"(Counter));
#elif defined(__aarch64__) #elif defined(aa64)
asmv("mrs %0, cntvct_el0" asmv("mrs %0, cntvct_el0"
: "=r"(Counter)); : "=r"(Counter));
#endif #endif
@ -334,6 +334,10 @@ namespace CPU
x86SIMDType CheckSIMD() x86SIMDType CheckSIMD()
{ {
#if defined(a32)
return SIMD_NONE; /* TODO: Support x86 SIMD on x32 */
#endif
if (unlikely(!SSEEnabled)) if (unlikely(!SSEEnabled))
return SIMD_NONE; return SIMD_NONE;
@ -344,12 +348,12 @@ namespace CPU
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -382,12 +386,12 @@ namespace CPU
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -429,12 +433,12 @@ namespace CPU
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -452,12 +456,12 @@ namespace CPU
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));

View File

@ -7,10 +7,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../Architecture/amd64/cpu/gdt.hpp" #include "../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../kernel.h" #include "../../kernel.h"
@ -100,11 +100,11 @@ SafeFunction void SegmentNotPresentExceptionHandler(CHArchTrapFrame *Frame)
SafeFunction void StackFaultExceptionHandler(CHArchTrapFrame *Frame) SafeFunction void StackFaultExceptionHandler(CHArchTrapFrame *Frame)
{ {
CPU::x64::SelectorErrorCode SelCode = {.raw = Frame->ErrorCode}; CPU::x64::SelectorErrorCode SelCode = {.raw = Frame->ErrorCode};
#if defined(__amd64__) #if defined(a64)
CrashHandler::EHPrint("Stack segment fault at address %#lx\n", Frame->rip); CrashHandler::EHPrint("Stack segment fault at address %#lx\n", Frame->rip);
#elif defined(__i386__) #elif defined(a32)
CrashHandler::EHPrint("Stack segment fault at address %#lx\n", Frame->eip); CrashHandler::EHPrint("Stack segment fault at address %#lx\n", Frame->eip);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
CrashHandler::EHPrint("External: %d\n", SelCode.External); CrashHandler::EHPrint("External: %d\n", SelCode.External);
CrashHandler::EHPrint("Table: %d\n", SelCode.Table); CrashHandler::EHPrint("Table: %d\n", SelCode.Table);
@ -142,11 +142,11 @@ SafeFunction void GeneralProtectionExceptionHandler(CHArchTrapFrame *Frame)
SafeFunction void PageFaultExceptionHandler(CHArchTrapFrame *Frame) SafeFunction void PageFaultExceptionHandler(CHArchTrapFrame *Frame)
{ {
CPU::x64::PageFaultErrorCode params = {.raw = (uint32_t)Frame->ErrorCode}; CPU::x64::PageFaultErrorCode params = {.raw = (uint32_t)Frame->ErrorCode};
#if defined(__amd64__) #if defined(a64)
CrashHandler::EHPrint("\eAFAFAFAn exception occurred at %#lx by %#lx\n", CrashHandler::PageFaultAddress, Frame->rip); CrashHandler::EHPrint("\eAFAFAFAn exception occurred at %#lx by %#lx\n", CrashHandler::PageFaultAddress, Frame->rip);
#elif defined(__i386__) #elif defined(a32)
CrashHandler::EHPrint("\eAFAFAFAn exception occurred at %#lx by %#lx\n", CrashHandler::PageFaultAddress, Frame->eip); CrashHandler::EHPrint("\eAFAFAFAn exception occurred at %#lx by %#lx\n", CrashHandler::PageFaultAddress, Frame->eip);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
CrashHandler::EHPrint("Page: %s\n", params.P ? "Present" : "Not Present"); CrashHandler::EHPrint("Page: %s\n", params.P ? "Present" : "Not Present");
CrashHandler::EHPrint("Write Operation: %s\n", params.W ? "Read-Only" : "Read-Write"); CrashHandler::EHPrint("Write Operation: %s\n", params.W ? "Read-Only" : "Read-Write");
@ -165,15 +165,20 @@ SafeFunction void PageFaultExceptionHandler(CHArchTrapFrame *Frame)
uintptr_t CheckPageFaultAddress = 0; uintptr_t CheckPageFaultAddress = 0;
CheckPageFaultAddress = CrashHandler::PageFaultAddress; CheckPageFaultAddress = CrashHandler::PageFaultAddress;
if (CheckPageFaultAddress == 0) if (CheckPageFaultAddress == 0)
#ifdef __amd64__ #ifdef a64
CheckPageFaultAddress = Frame->rip; CheckPageFaultAddress = Frame->rip;
#elif defined(__i386__) #elif defined(a32)
CheckPageFaultAddress = Frame->eip; CheckPageFaultAddress = Frame->eip;
#elif defined(__aarch64__) #elif defined(aa64)
CheckPageFaultAddress = 0; CheckPageFaultAddress = 0;
#endif #endif
#if defined(a64)
Memory::Virtual vma = Memory::Virtual(((Memory::PageTable4 *)CPU::x64::readcr3().raw)); Memory::Virtual vma = Memory::Virtual(((Memory::PageTable4 *)CPU::x64::readcr3().raw));
#elif defined(a32)
Memory::Virtual vma = Memory::Virtual(((Memory::PageTable4 *)CPU::x32::readcr3().raw));
#elif defined(aa64)
#endif
bool PageAvailable = vma.Check((void *)CheckPageFaultAddress); bool PageAvailable = vma.Check((void *)CheckPageFaultAddress);
debug("Page available (Check(...)): %s. %s", debug("Page available (Check(...)): %s. %s",
PageAvailable ? "Yes" : "No", PageAvailable ? "Yes" : "No",
@ -213,7 +218,12 @@ SafeFunction void PageFaultExceptionHandler(CHArchTrapFrame *Frame)
Index.PDPTEIndex, Index.PDPTEIndex,
Index.PDEIndex, Index.PDEIndex,
Index.PTEIndex); Index.PTEIndex);
#if defined(a64)
Memory::PageMapLevel4 PML4 = ((Memory::PageTable4 *)CPU::x64::readcr3().raw)->Entries[Index.PMLIndex]; Memory::PageMapLevel4 PML4 = ((Memory::PageTable4 *)CPU::x64::readcr3().raw)->Entries[Index.PMLIndex];
#elif defined(a32)
Memory::PageMapLevel4 PML4 = ((Memory::PageTable4 *)CPU::x32::readcr3().raw)->Entries[Index.PMLIndex];
#elif defined(aa64)
#endif
Memory::PageDirectoryPointerTableEntryPtr *PDPTE = (Memory::PageDirectoryPointerTableEntryPtr *)((uintptr_t)PML4.GetAddress() << 12); Memory::PageDirectoryPointerTableEntryPtr *PDPTE = (Memory::PageDirectoryPointerTableEntryPtr *)((uintptr_t)PML4.GetAddress() << 12);
Memory::PageDirectoryEntryPtr *PDE = (Memory::PageDirectoryEntryPtr *)((uintptr_t)PDPTE->Entries[Index.PDPTEIndex].GetAddress() << 12); Memory::PageDirectoryEntryPtr *PDE = (Memory::PageDirectoryEntryPtr *)((uintptr_t)PDPTE->Entries[Index.PDPTEIndex].GetAddress() << 12);

View File

@ -13,13 +13,13 @@
#include <cpu.hpp> #include <cpu.hpp>
#include <io.h> #include <io.h>
#if defined(__amd64__) #if defined(a64)
#include "../../Architecture/amd64/cpu/gdt.hpp" #include "../../Architecture/amd64/cpu/gdt.hpp"
#include "../Architecture/amd64/cpu/apic.hpp" #include "../Architecture/amd64/cpu/apic.hpp"
#elif defined(__i386__) #elif defined(a32)
#include "../../Architecture/i686/cpu/gdt.hpp" #include "../../Architecture/i686/cpu/gdt.hpp"
#include "../Architecture/i686/cpu/apic.hpp" #include "../Architecture/i686/cpu/apic.hpp"
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../kernel.h" #include "../../kernel.h"
@ -386,11 +386,11 @@ namespace CrashHandler
continue; continue;
EHPrint("\n\e2565CC%p", EHIntFrames[i]); EHPrint("\n\e2565CC%p", EHIntFrames[i]);
EHPrint("\e7925CC-"); EHPrint("\e7925CC-");
#if defined(__amd64__) #if defined(a64)
if ((uintptr_t)EHIntFrames[i] >= 0xFFFFFFFF80000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end) if ((uintptr_t)EHIntFrames[i] >= 0xFFFFFFFF80000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end)
#elif defined(__i386__) #elif defined(a32)
if ((uintptr_t)EHIntFrames[i] >= 0xC0000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end) if ((uintptr_t)EHIntFrames[i] >= 0xC0000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\e25CCC9%s", KernelSymbolTable->GetSymbolFromAddress((uintptr_t)EHIntFrames[i])); EHPrint("\e25CCC9%s", KernelSymbolTable->GetSymbolFromAddress((uintptr_t)EHIntFrames[i]));
else else
@ -543,20 +543,50 @@ namespace CrashHandler
switch (cr[0]) switch (cr[0])
{ {
case '0': case '0':
{
#if defined(a64)
EHPrint("\e44AA000: %#lx\n", CPU::x64::readcr0()); EHPrint("\e44AA000: %#lx\n", CPU::x64::readcr0());
#elif defined(a32)
EHPrint("\e44AA000: %#lx\n", CPU::x32::readcr0());
#endif
break; break;
}
case '2': case '2':
{
#if defined(a64)
EHPrint("\e44AA002: %#lx\n", PageFaultAddress); EHPrint("\e44AA002: %#lx\n", PageFaultAddress);
#elif defined(a32)
EHPrint("\e44AA002: %#lx\n", CPU::x32::readcr2());
#endif
break; break;
}
case '3': case '3':
{
#if defined(a64)
EHPrint("\e44AA003: %#lx\n", CPU::x64::readcr3()); EHPrint("\e44AA003: %#lx\n", CPU::x64::readcr3());
#elif defined(a32)
EHPrint("\e44AA003: %#lx\n", CPU::x32::readcr3());
#endif
break; break;
}
case '4': case '4':
{
#if defined(a64)
EHPrint("\e44AA004: %#lx\n", CPU::x64::readcr4()); EHPrint("\e44AA004: %#lx\n", CPU::x64::readcr4());
#elif defined(a32)
EHPrint("\e44AA004: %#lx\n", CPU::x32::readcr4());
#endif
break; break;
}
case '8': case '8':
{
#if defined(a64)
EHPrint("\e44AA008: %#lx\n", CPU::x64::readcr8()); EHPrint("\e44AA008: %#lx\n", CPU::x64::readcr8());
#elif defined(a32)
EHPrint("\e44AA008: %#lx\n", CPU::x32::readcr8());
#endif
break; break;
}
default: default:
EHPrint("\eFF0000Invalid CR\n"); EHPrint("\eFF0000Invalid CR\n");
break; break;
@ -723,7 +753,7 @@ namespace CrashHandler
SafeFunction void StopAllCores() SafeFunction void StopAllCores()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
/* FIXME: Can't send IPIs to other cores /* FIXME: Can't send IPIs to other cores
* because it causes another exception on * because it causes another exception on
* the other cores. * the other cores.
@ -751,7 +781,7 @@ namespace CrashHandler
__sync; __sync;
CPU::Interrupts(CPU::Disable); CPU::Interrupts(CPU::Disable);
// } // }
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
@ -761,7 +791,7 @@ namespace CrashHandler
CPU::Interrupts(CPU::Disable); CPU::Interrupts(CPU::Disable);
SBIdx = 255; SBIdx = 255;
CHArchTrapFrame *Frame = (CHArchTrapFrame *)Data; CHArchTrapFrame *Frame = (CHArchTrapFrame *)Data;
#if defined(__amd64__) #if defined(a64)
error("An exception occurred!"); error("An exception occurred!");
error("Exception: %#llx", Frame->InterruptNumber); error("Exception: %#llx", Frame->InterruptNumber);
for (size_t i = 0; i < INT_FRAMES_MAX; i++) for (size_t i = 0; i < INT_FRAMES_MAX; i++)
@ -998,8 +1028,8 @@ namespace CrashHandler
} }
goto CrashEnd; goto CrashEnd;
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
CrashEnd: CrashEnd:

View File

@ -9,10 +9,10 @@
#include <cpu.hpp> #include <cpu.hpp>
#include <io.h> #include <io.h>
#if defined(__amd64__) #if defined(a64)
#include "../../Architecture/amd64/cpu/gdt.hpp" #include "../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../kernel.h" #include "../../kernel.h"
@ -102,11 +102,11 @@ namespace CrashHandler
int BackSpaceLimit = 0; int BackSpaceLimit = 0;
static char UserInputBuffer[1024]; static char UserInputBuffer[1024];
#if defined(__amd64__) #if defined(a64)
SafeFunction void CrashKeyboardDriver::OnInterruptReceived(CPU::x64::TrapFrame *Frame) SafeFunction void CrashKeyboardDriver::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
#elif defined(__i386__) #elif defined(a32)
SafeFunction void CrashKeyboardDriver::OnInterruptReceived(void *Frame) SafeFunction void CrashKeyboardDriver::OnInterruptReceived(CPU::x32::TrapFrame *Frame)
#elif defined(__aarch64__) #elif defined(aa64)
SafeFunction void CrashKeyboardDriver::OnInterruptReceived(void *Frame) SafeFunction void CrashKeyboardDriver::OnInterruptReceived(void *Frame)
#endif #endif
{ {

View File

@ -7,10 +7,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../Architecture/amd64/cpu/gdt.hpp" #include "../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../kernel.h" #include "../../kernel.h"
@ -31,20 +31,20 @@ namespace CrashHandler
return; return;
} }
#if defined(__amd64__) #if defined(a64)
struct StackFrame *frames = (struct StackFrame *)Frame->rbp; // (struct StackFrame *)__builtin_frame_address(0); struct StackFrame *frames = (struct StackFrame *)Frame->rbp; // (struct StackFrame *)__builtin_frame_address(0);
if (!Memory::Virtual().Check((void *)Frame->rbp)) if (!Memory::Virtual().Check((void *)Frame->rbp))
#elif defined(__i386__) #elif defined(a32)
struct StackFrame *frames = (struct StackFrame *)Frame->ebp; // (struct StackFrame *)__builtin_frame_address(0); struct StackFrame *frames = (struct StackFrame *)Frame->ebp; // (struct StackFrame *)__builtin_frame_address(0);
if (!Memory::Virtual().Check((void *)Frame->ebp)) if (!Memory::Virtual().Check((void *)Frame->ebp))
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
{ {
#if defined(__amd64__) #if defined(a64)
EHPrint("Invalid rbp pointer: %p\n", Frame->rbp); EHPrint("Invalid rbp pointer: %p\n", Frame->rbp);
#elif defined(__i386__) #elif defined(a32)
EHPrint("Invalid ebp pointer: %p\n", Frame->ebp); EHPrint("Invalid ebp pointer: %p\n", Frame->ebp);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
return; return;
} }
@ -59,39 +59,39 @@ namespace CrashHandler
EHPrint("\e7981FC\nStack Trace:\n"); EHPrint("\e7981FC\nStack Trace:\n");
if (!frames || !frames->rip || !frames->rbp) if (!frames || !frames->rip || !frames->rbp)
{ {
#if defined(__amd64__) #if defined(a64)
EHPrint("\e2565CC%p", (void *)Frame->rip); EHPrint("\e2565CC%p", (void *)Frame->rip);
#elif defined(__i386__) #elif defined(a32)
EHPrint("\e2565CC%p", (void *)Frame->eip); EHPrint("\e2565CC%p", (void *)Frame->eip);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\e7925CC-"); EHPrint("\e7925CC-");
#if defined(__amd64__) #if defined(a64)
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip)); EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip));
#elif defined(__i386__) #elif defined(a32)
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip)); EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip));
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\e7981FC <- Exception"); EHPrint("\e7981FC <- Exception");
EHPrint("\eFF0000\n< No stack trace available. >\n"); EHPrint("\eFF0000\n< No stack trace available. >\n");
} }
else else
{ {
#if defined(__amd64__) #if defined(a64)
EHPrint("\e2565CC%p", (void *)Frame->rip); EHPrint("\e2565CC%p", (void *)Frame->rip);
EHPrint("\e7925CC-"); EHPrint("\e7925CC-");
if ((Frame->rip >= 0xFFFFFFFF80000000 && Frame->rip <= (uintptr_t)&_kernel_end) || !Kernel) if ((Frame->rip >= 0xFFFFFFFF80000000 && Frame->rip <= (uintptr_t)&_kernel_end) || !Kernel)
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip)); EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip));
else else
EHPrint("Outside Kernel"); EHPrint("Outside Kernel");
#elif defined(__i386__) #elif defined(a32)
EHPrint("\e2565CC%p", (void *)Frame->eip); EHPrint("\e2565CC%p", (void *)Frame->eip);
EHPrint("\e7925CC-"); EHPrint("\e7925CC-");
if ((Frame->eip >= 0xC0000000 && Frame->eip <= (uintptr_t)&_kernel_end) || !Kernel) if ((Frame->eip >= 0xC0000000 && Frame->eip <= (uintptr_t)&_kernel_end) || !Kernel)
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip)); EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip));
else else
EHPrint("Outside Kernel"); EHPrint("Outside Kernel");
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\e7981FC <- Exception"); EHPrint("\e7981FC <- Exception");
for (int frame = 0; frame < Count; ++frame) for (int frame = 0; frame < Count; ++frame)
@ -100,11 +100,11 @@ namespace CrashHandler
break; break;
EHPrint("\n\e2565CC%p", (void *)frames->rip); EHPrint("\n\e2565CC%p", (void *)frames->rip);
EHPrint("\e7925CC-"); EHPrint("\e7925CC-");
#if defined(__amd64__) #if defined(a64)
if ((frames->rip >= 0xFFFFFFFF80000000 && frames->rip <= (uintptr_t)&_kernel_end) || !Kernel) if ((frames->rip >= 0xFFFFFFFF80000000 && frames->rip <= (uintptr_t)&_kernel_end) || !Kernel)
#elif defined(__i386__) #elif defined(a32)
if ((frames->rip >= 0xC0000000 && frames->rip <= (uintptr_t)&_kernel_end) || !Kernel) if ((frames->rip >= 0xC0000000 && frames->rip <= (uintptr_t)&_kernel_end) || !Kernel)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\e25CCC9%s", SymHandle->GetSymbolFromAddress(frames->rip)); EHPrint("\e25CCC9%s", SymHandle->GetSymbolFromAddress(frames->rip));
else else

View File

@ -7,10 +7,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../../Architecture/amd64/cpu/gdt.hpp" #include "../../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../../kernel.h" #include "../../../kernel.h"

View File

@ -7,10 +7,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../../Architecture/amd64/cpu/gdt.hpp" #include "../../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../../kernel.h" #include "../../../kernel.h"
@ -29,7 +29,7 @@ namespace CrashHandler
data.Thread->ID); data.Thread->ID);
EHPrint("\e7981FCTechnical Informations on CPU %lld:\n", data.ID); EHPrint("\e7981FCTechnical Informations on CPU %lld:\n", data.ID);
uintptr_t ds; uintptr_t ds;
#if defined(__amd64__) #if defined(a64)
CPUData *cpu = (CPUData *)data.CPUData; CPUData *cpu = (CPUData *)data.CPUData;
if (cpu) if (cpu)
@ -45,26 +45,29 @@ namespace CrashHandler
asmv("mov %%ds, %0" asmv("mov %%ds, %0"
: "=r"(ds)); : "=r"(ds));
#elif defined(__i386__) #elif defined(a32)
asmv("mov %%ds, %0" asmv("mov %%ds, %0"
: "=r"(ds)); : "=r"(ds));
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#if defined(a64)
EHPrint("\e7981FCFS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx\n", EHPrint("\e7981FCFS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx\n",
CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE),
data.Frame->ss, data.Frame->cs, ds); data.Frame->ss, data.Frame->cs, ds);
#if defined(__amd64__)
EHPrint("R8=%#llx R9=%#llx R10=%#llx R11=%#llx\n", data.Frame->r8, data.Frame->r9, data.Frame->r10, data.Frame->r11); EHPrint("R8=%#llx R9=%#llx R10=%#llx R11=%#llx\n", data.Frame->r8, data.Frame->r9, data.Frame->r10, data.Frame->r11);
EHPrint("R12=%#llx R13=%#llx R14=%#llx R15=%#llx\n", data.Frame->r12, data.Frame->r13, data.Frame->r14, data.Frame->r15); EHPrint("R12=%#llx R13=%#llx R14=%#llx R15=%#llx\n", data.Frame->r12, data.Frame->r13, data.Frame->r14, data.Frame->r15);
EHPrint("RAX=%#llx RBX=%#llx RCX=%#llx RDX=%#llx\n", data.Frame->rax, data.Frame->rbx, data.Frame->rcx, data.Frame->rdx); EHPrint("RAX=%#llx RBX=%#llx RCX=%#llx RDX=%#llx\n", data.Frame->rax, data.Frame->rbx, data.Frame->rcx, data.Frame->rdx);
EHPrint("RSI=%#llx RDI=%#llx RBP=%#llx RSP=%#llx\n", data.Frame->rsi, data.Frame->rdi, data.Frame->rbp, data.Frame->rsp); EHPrint("RSI=%#llx RDI=%#llx RBP=%#llx RSP=%#llx\n", data.Frame->rsi, data.Frame->rdi, data.Frame->rbp, data.Frame->rsp);
EHPrint("RIP=%#llx RFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx\n", data.Frame->rip, data.Frame->rflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode, data.efer.raw); EHPrint("RIP=%#llx RFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx\n", data.Frame->rip, data.Frame->rflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode, data.efer.raw);
#elif defined(__i386__) #elif defined(a32)
EHPrint("\e7981FCFS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx\n",
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
data.Frame->ss, data.Frame->cs, ds);
EHPrint("EAX=%#llx EBX=%#llx ECX=%#llx EDX=%#llx\n", data.Frame->eax, data.Frame->ebx, data.Frame->ecx, data.Frame->edx); EHPrint("EAX=%#llx EBX=%#llx ECX=%#llx EDX=%#llx\n", data.Frame->eax, data.Frame->ebx, data.Frame->ecx, data.Frame->edx);
EHPrint("ESI=%#llx EDI=%#llx EBP=%#llx ESP=%#llx\n", data.Frame->esi, data.Frame->edi, data.Frame->ebp, data.Frame->esp); EHPrint("ESI=%#llx EDI=%#llx EBP=%#llx ESP=%#llx\n", data.Frame->esi, data.Frame->edi, data.Frame->ebp, data.Frame->esp);
EHPrint("EIP=%#llx EFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx\n", data.Frame->eip, data.Frame->eflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode, data.efer.raw); EHPrint("EIP=%#llx EFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx\n", data.Frame->eip, data.Frame->eflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode, data.efer.raw);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("CR0=%#llx CR2=%#llx CR3=%#llx CR4=%#llx CR8=%#llx\n", data.cr0.raw, data.cr2.raw, data.cr3.raw, data.cr4.raw, data.cr8.raw); EHPrint("CR0=%#llx CR2=%#llx CR3=%#llx CR4=%#llx CR8=%#llx\n", data.cr0.raw, data.cr2.raw, data.cr3.raw, data.cr4.raw, data.cr8.raw);
EHPrint("DR0=%#llx DR1=%#llx DR2=%#llx DR3=%#llx DR6=%#llx DR7=%#llx\n", data.dr0, data.dr1, data.dr2, data.dr3, data.dr6, data.dr7.raw); EHPrint("DR0=%#llx DR1=%#llx DR2=%#llx DR3=%#llx DR6=%#llx DR7=%#llx\n", data.dr0, data.dr1, data.dr2, data.dr3, data.dr6, data.dr7.raw);
@ -87,16 +90,16 @@ namespace CrashHandler
data.cr4.PCE ? "True " : "False", data.cr4.UMIP ? "True " : "False", data.cr4.OSFXSR ? "True " : "False", data.cr4.OSXMMEXCPT ? "True " : "False", data.cr4.PCE ? "True " : "False", data.cr4.UMIP ? "True " : "False", data.cr4.OSFXSR ? "True " : "False", data.cr4.OSXMMEXCPT ? "True " : "False",
data.cr4.LA57 ? "True " : "False", data.cr4.VMXE ? "True " : "False", data.cr4.SMXE ? "True " : "False", data.cr4.PCIDE ? "True " : "False", data.cr4.LA57 ? "True " : "False", data.cr4.VMXE ? "True " : "False", data.cr4.SMXE ? "True " : "False", data.cr4.PCIDE ? "True " : "False",
data.cr4.OSXSAVE ? "True " : "False", data.cr4.SMEP ? "True " : "False", data.cr4.SMAP ? "True " : "False", data.cr4.PKE ? "True " : "False", data.cr4.OSXSAVE ? "True " : "False", data.cr4.SMEP ? "True " : "False", data.cr4.SMAP ? "True " : "False", data.cr4.PKE ? "True " : "False",
#if defined(__amd64__) #if defined(a64)
data.cr4.Reserved0, data.cr4.Reserved1, data.cr4.Reserved2); data.cr4.Reserved0, data.cr4.Reserved1, data.cr4.Reserved2);
#elif defined(__i386__) #elif defined(a32)
data.cr4.Reserved0, data.cr4.Reserved1, 0); data.cr4.Reserved0, data.cr4.Reserved1, 0);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\e79FCF5CR8: TPL:%d\n", data.cr8.TPL); EHPrint("\e79FCF5CR8: TPL:%d\n", data.cr8.TPL);
#if defined(__amd64__) #if defined(a64)
EHPrint("\eFCFC02RFL: CF:%s PF:%s AF:%s ZF:%s\n SF:%s TF:%s IF:%s DF:%s\n OF:%s IOPL:%s NT:%s RF:%s\n VM:%s AC:%s VIF:%s VIP:%s\n ID:%s AlwaysOne:%d\n R0:%#x R1:%#x R2:%#x R3:%#x\n", EHPrint("\eFCFC02RFL: CF:%s PF:%s AF:%s ZF:%s\n SF:%s TF:%s IF:%s DF:%s\n OF:%s IOPL:%s NT:%s RF:%s\n VM:%s AC:%s VIF:%s VIP:%s\n ID:%s AlwaysOne:%d\n R0:%#x R1:%#x R2:%#x R3:%#x\n",
data.Frame->rflags.CF ? "True " : "False", data.Frame->rflags.PF ? "True " : "False", data.Frame->rflags.AF ? "True " : "False", data.Frame->rflags.ZF ? "True " : "False", data.Frame->rflags.CF ? "True " : "False", data.Frame->rflags.PF ? "True " : "False", data.Frame->rflags.AF ? "True " : "False", data.Frame->rflags.ZF ? "True " : "False",
data.Frame->rflags.SF ? "True " : "False", data.Frame->rflags.TF ? "True " : "False", data.Frame->rflags.IF ? "True " : "False", data.Frame->rflags.DF ? "True " : "False", data.Frame->rflags.SF ? "True " : "False", data.Frame->rflags.TF ? "True " : "False", data.Frame->rflags.IF ? "True " : "False", data.Frame->rflags.DF ? "True " : "False",
@ -104,7 +107,7 @@ namespace CrashHandler
data.Frame->rflags.VM ? "True " : "False", data.Frame->rflags.AC ? "True " : "False", data.Frame->rflags.VIF ? "True " : "False", data.Frame->rflags.VIP ? "True " : "False", data.Frame->rflags.VM ? "True " : "False", data.Frame->rflags.AC ? "True " : "False", data.Frame->rflags.VIF ? "True " : "False", data.Frame->rflags.VIP ? "True " : "False",
data.Frame->rflags.ID ? "True " : "False", data.Frame->rflags.AlwaysOne, data.Frame->rflags.ID ? "True " : "False", data.Frame->rflags.AlwaysOne,
data.Frame->rflags.Reserved0, data.Frame->rflags.Reserved1, data.Frame->rflags.Reserved2, data.Frame->rflags.Reserved3); data.Frame->rflags.Reserved0, data.Frame->rflags.Reserved1, data.Frame->rflags.Reserved2, data.Frame->rflags.Reserved3);
#elif defined(__i386__) #elif defined(a32)
EHPrint("\eFCFC02EFL: CF:%s PF:%s AF:%s ZF:%s\n SF:%s TF:%s IF:%s DF:%s\n OF:%s IOPL:%s NT:%s RF:%s\n VM:%s AC:%s VIF:%s VIP:%s\n ID:%s AlwaysOne:%d\n R0:%#x R1:%#x R2:%#x\n", EHPrint("\eFCFC02EFL: CF:%s PF:%s AF:%s ZF:%s\n SF:%s TF:%s IF:%s DF:%s\n OF:%s IOPL:%s NT:%s RF:%s\n VM:%s AC:%s VIF:%s VIP:%s\n ID:%s AlwaysOne:%d\n R0:%#x R1:%#x R2:%#x\n",
data.Frame->eflags.CF ? "True " : "False", data.Frame->eflags.PF ? "True " : "False", data.Frame->eflags.AF ? "True " : "False", data.Frame->eflags.ZF ? "True " : "False", data.Frame->eflags.CF ? "True " : "False", data.Frame->eflags.PF ? "True " : "False", data.Frame->eflags.AF ? "True " : "False", data.Frame->eflags.ZF ? "True " : "False",
data.Frame->eflags.SF ? "True " : "False", data.Frame->eflags.TF ? "True " : "False", data.Frame->eflags.IF ? "True " : "False", data.Frame->eflags.DF ? "True " : "False", data.Frame->eflags.SF ? "True " : "False", data.Frame->eflags.TF ? "True " : "False", data.Frame->eflags.IF ? "True " : "False", data.Frame->eflags.DF ? "True " : "False",
@ -112,7 +115,7 @@ namespace CrashHandler
data.Frame->eflags.VM ? "True " : "False", data.Frame->eflags.AC ? "True " : "False", data.Frame->eflags.VIF ? "True " : "False", data.Frame->eflags.VIP ? "True " : "False", data.Frame->eflags.VM ? "True " : "False", data.Frame->eflags.AC ? "True " : "False", data.Frame->eflags.VIF ? "True " : "False", data.Frame->eflags.VIP ? "True " : "False",
data.Frame->eflags.ID ? "True " : "False", data.Frame->eflags.AlwaysOne, data.Frame->eflags.ID ? "True " : "False", data.Frame->eflags.AlwaysOne,
data.Frame->eflags.Reserved0, data.Frame->eflags.Reserved1, data.Frame->eflags.Reserved2); data.Frame->eflags.Reserved0, data.Frame->eflags.Reserved1, data.Frame->eflags.Reserved2);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\eA0F0F0DR7: LDR0:%s GDR0:%s LDR1:%s GDR1:%s\n LDR2:%s GDR2:%s LDR3:%s GDR3:%s\n CDR0:%s SDR0:%s CDR1:%s SDR1:%s\n CDR2:%s SDR2:%s CDR3:%s SDR3:%s\n R:%#x\n", EHPrint("\eA0F0F0DR7: LDR0:%s GDR0:%s LDR1:%s GDR1:%s\n LDR2:%s GDR2:%s LDR3:%s GDR3:%s\n CDR0:%s SDR0:%s CDR1:%s SDR1:%s\n CDR2:%s SDR2:%s CDR3:%s SDR3:%s\n R:%#x\n",

View File

@ -7,10 +7,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../../Architecture/amd64/cpu/gdt.hpp" #include "../../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../../kernel.h" #include "../../../kernel.h"
@ -269,11 +269,11 @@ namespace CrashHandler
EHPrint("The processor attempted to access a page that is not present.\n"); EHPrint("The processor attempted to access a page that is not present.\n");
CPU::x64::PageFaultErrorCode params = {.raw = (uint32_t)Frame->ErrorCode}; CPU::x64::PageFaultErrorCode params = {.raw = (uint32_t)Frame->ErrorCode};
#if defined(__amd64__) #if defined(a64)
EHPrint("At \e8888FF%#lx \eFAFAFAby \e8888FF%#lx\eFAFAFA\n", PageFaultAddress, Frame->rip); EHPrint("At \e8888FF%#lx \eFAFAFAby \e8888FF%#lx\eFAFAFA\n", PageFaultAddress, Frame->rip);
#elif defined(__i386__) #elif defined(a32)
EHPrint("At \e8888FF%#lx \eFAFAFAby \e8888FF%#lx\eFAFAFA\n", PageFaultAddress, Frame->eip); EHPrint("At \e8888FF%#lx \eFAFAFAby \e8888FF%#lx\eFAFAFA\n", PageFaultAddress, Frame->eip);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("Page: %s\eFAFAFA\n", params.P ? "\e058C19Present" : "\eE85230Not Present"); EHPrint("Page: %s\eFAFAFA\n", params.P ? "\e058C19Present" : "\eE85230Not Present");
EHPrint("Write Operation: \e8888FF%s\eFAFAFA\n", params.W ? "Read-Only" : "Read-Write"); EHPrint("Write Operation: \e8888FF%s\eFAFAFA\n", params.W ? "Read-Only" : "Read-Write");
@ -335,11 +335,11 @@ namespace CrashHandler
} }
} }
#if defined(__amd64__) #if defined(a64)
EHPrint("The exception happened at \e8888FF%#lx\eFAFAFA\n", Frame->rip); EHPrint("The exception happened at \e8888FF%#lx\eFAFAFA\n", Frame->rip);
#elif defined(__i386__) #elif defined(a32)
EHPrint("The exception happened at \e8888FF%#lx\eFAFAFA\n", Frame->eip); EHPrint("The exception happened at \e8888FF%#lx\eFAFAFA\n", Frame->eip);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
} }

View File

@ -8,10 +8,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../../Architecture/amd64/cpu/gdt.hpp" #include "../../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../../kernel.h" #include "../../../kernel.h"
@ -40,11 +40,11 @@ namespace CrashHandler
continue; continue;
EHPrint("\n\e2565CC%p", EHIntFrames[i]); EHPrint("\n\e2565CC%p", EHIntFrames[i]);
EHPrint("\e7925CC-"); EHPrint("\e7925CC-");
#if defined(__amd64__) #if defined(a64)
if ((uintptr_t)EHIntFrames[i] >= 0xFFFFFFFF80000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end) if ((uintptr_t)EHIntFrames[i] >= 0xFFFFFFFF80000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end)
#elif defined(__i386__) #elif defined(a32)
if ((uintptr_t)EHIntFrames[i] >= 0xC0000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end) if ((uintptr_t)EHIntFrames[i] >= 0xC0000000 && (uintptr_t)EHIntFrames[i] <= (uintptr_t)&_kernel_end)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\e25CCC9%s", KernelSymbolTable->GetSymbolFromAddress((uintptr_t)EHIntFrames[i])); EHPrint("\e25CCC9%s", KernelSymbolTable->GetSymbolFromAddress((uintptr_t)EHIntFrames[i]));
else else

View File

@ -7,10 +7,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../../Architecture/amd64/cpu/gdt.hpp" #include "../../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../../kernel.h" #include "../../../kernel.h"
@ -44,11 +44,11 @@ namespace CrashHandler
if (TaskManager) if (TaskManager)
{ {
if (data.Thread) if (data.Thread)
#if defined(__amd64__) #if defined(a64)
EHPrint("\eFAFAFACrash occurred in thread \eAA0F0F%s\eFAFAFA(%ld) at \e00AAAA%#lx\n", data.Thread->Name, data.Thread->ID, data.Frame->rip); EHPrint("\eFAFAFACrash occurred in thread \eAA0F0F%s\eFAFAFA(%ld) at \e00AAAA%#lx\n", data.Thread->Name, data.Thread->ID, data.Frame->rip);
#elif defined(__i386__) #elif defined(a32)
EHPrint("\eFAFAFACrash occurred in thread \eAA0F0F%s\eFAFAFA(%ld) at \e00AAAA%#lx\n", data.Thread->Name, data.Thread->ID, data.Frame->eip); EHPrint("\eFAFAFACrash occurred in thread \eAA0F0F%s\eFAFAFA(%ld) at \e00AAAA%#lx\n", data.Thread->Name, data.Thread->ID, data.Frame->eip);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
EHPrint("\eFAFAFAProcess list (%ld):\n", Plist.size()); EHPrint("\eFAFAFAProcess list (%ld):\n", Plist.size());

View File

@ -7,10 +7,10 @@
#include <smp.hpp> #include <smp.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../../Architecture/amd64/cpu/gdt.hpp" #include "../../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../../kernel.h" #include "../../kernel.h"
@ -34,6 +34,7 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
CPUData *CurCPU = GetCurrentCPU(); CPUData *CurCPU = GetCurrentCPU();
{ {
#if defined(a64)
CPU::x64::CR0 cr0 = CPU::x64::readcr0(); CPU::x64::CR0 cr0 = CPU::x64::readcr0();
CPU::x64::CR2 cr2 = CPU::x64::CR2{.PFLA = CrashHandler::PageFaultAddress}; CPU::x64::CR2 cr2 = CPU::x64::CR2{.PFLA = CrashHandler::PageFaultAddress};
CPU::x64::CR3 cr3 = CPU::x64::readcr3(); CPU::x64::CR3 cr3 = CPU::x64::readcr3();
@ -44,28 +45,41 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
error("Technical Informations on CPU %lld:", CurCPU->ID); error("Technical Informations on CPU %lld:", CurCPU->ID);
uintptr_t ds; uintptr_t ds;
#if defined(__amd64__)
asmv("mov %%ds, %0" asmv("mov %%ds, %0"
: "=r"(ds)); : "=r"(ds));
#elif defined(__i386__) #elif defined(a32)
CPU::x32::CR0 cr0 = CPU::x32::readcr0();
CPU::x32::CR2 cr2 = CPU::x32::CR2{.PFLA = CrashHandler::PageFaultAddress};
CPU::x32::CR3 cr3 = CPU::x32::readcr3();
CPU::x32::CR4 cr4 = CPU::x32::readcr4();
CPU::x32::CR8 cr8 = CPU::x32::readcr8();
CPU::x32::EFER efer;
efer.raw = CPU::x32::rdmsr(CPU::x32::MSR_EFER);
error("Technical Informations on CPU %lld:", CurCPU->ID);
uintptr_t ds;
asmv("mov %%ds, %0" asmv("mov %%ds, %0"
: "=r"(ds)); : "=r"(ds));
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#if defined(a64)
error("FS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx", error("FS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx",
CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE),
Frame->ss, Frame->cs, ds); Frame->ss, Frame->cs, ds);
#if defined(__amd64__)
error("R8=%#llx R9=%#llx R10=%#llx R11=%#llx", Frame->r8, Frame->r9, Frame->r10, Frame->r11); error("R8=%#llx R9=%#llx R10=%#llx R11=%#llx", Frame->r8, Frame->r9, Frame->r10, Frame->r11);
error("R12=%#llx R13=%#llx R14=%#llx R15=%#llx", Frame->r12, Frame->r13, Frame->r14, Frame->r15); error("R12=%#llx R13=%#llx R14=%#llx R15=%#llx", Frame->r12, Frame->r13, Frame->r14, Frame->r15);
error("RAX=%#llx RBX=%#llx RCX=%#llx RDX=%#llx", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); error("RAX=%#llx RBX=%#llx RCX=%#llx RDX=%#llx", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx);
error("RSI=%#llx RDI=%#llx RBP=%#llx RSP=%#llx", Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp); error("RSI=%#llx RDI=%#llx RBP=%#llx RSP=%#llx", Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp);
error("RIP=%#llx RFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx", Frame->rip, Frame->rflags.raw, Frame->InterruptNumber, Frame->ErrorCode, efer.raw); error("RIP=%#llx RFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx", Frame->rip, Frame->rflags.raw, Frame->InterruptNumber, Frame->ErrorCode, efer.raw);
#elif defined(__i386__) #elif defined(a32)
error("FS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx",
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
Frame->ss, Frame->cs, ds);
error("EAX=%#llx EBX=%#llx ECX=%#llx EDX=%#llx", Frame->eax, Frame->ebx, Frame->ecx, Frame->edx); error("EAX=%#llx EBX=%#llx ECX=%#llx EDX=%#llx", Frame->eax, Frame->ebx, Frame->ecx, Frame->edx);
error("ESI=%#llx EDI=%#llx EBP=%#llx ESP=%#llx", Frame->esi, Frame->edi, Frame->ebp, Frame->esp); error("ESI=%#llx EDI=%#llx EBP=%#llx ESP=%#llx", Frame->esi, Frame->edi, Frame->ebp, Frame->esp);
error("EIP=%#llx EFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx", Frame->eip, Frame->eflags.raw, Frame->InterruptNumber, Frame->ErrorCode, efer.raw); error("EIP=%#llx EFL=%#llx INT=%#llx ERR=%#llx EFER=%#llx", Frame->eip, Frame->eflags.raw, Frame->InterruptNumber, Frame->ErrorCode, efer.raw);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
error("CR0=%#llx CR2=%#llx CR3=%#llx CR4=%#llx CR8=%#llx", cr0.raw, cr2.raw, cr3.raw, cr4.raw, cr8.raw); error("CR0=%#llx CR2=%#llx CR3=%#llx CR4=%#llx CR8=%#llx", cr0.raw, cr2.raw, cr3.raw, cr4.raw, cr8.raw);
@ -81,6 +95,7 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
error("CR3: PWT:%s PCD:%s PDBR:%#llx", error("CR3: PWT:%s PCD:%s PDBR:%#llx",
cr3.PWT ? "True " : "False", cr3.PCD ? "True " : "False", cr3.PDBR); cr3.PWT ? "True " : "False", cr3.PCD ? "True " : "False", cr3.PDBR);
#if defined(a64)
error("CR4: VME:%s PVI:%s TSD:%s DE:%s PSE:%s PAE:%s MCE:%s PGE:%s PCE:%s UMIP:%s OSFXSR:%s OSXMMEXCPT:%s LA57:%s VMXE:%s SMXE:%s PCIDE:%s OSXSAVE:%s SMEP:%s SMAP:%s PKE:%s R0:%#x R1:%#x R2:%#x", error("CR4: VME:%s PVI:%s TSD:%s DE:%s PSE:%s PAE:%s MCE:%s PGE:%s PCE:%s UMIP:%s OSFXSR:%s OSXMMEXCPT:%s LA57:%s VMXE:%s SMXE:%s PCIDE:%s OSXSAVE:%s SMEP:%s SMAP:%s PKE:%s R0:%#x R1:%#x R2:%#x",
cr4.VME ? "True " : "False", cr4.PVI ? "True " : "False", cr4.TSD ? "True " : "False", cr4.DE ? "True " : "False", cr4.VME ? "True " : "False", cr4.PVI ? "True " : "False", cr4.TSD ? "True " : "False", cr4.DE ? "True " : "False",
cr4.PSE ? "True " : "False", cr4.PAE ? "True " : "False", cr4.MCE ? "True " : "False", cr4.PGE ? "True " : "False", cr4.PSE ? "True " : "False", cr4.PAE ? "True " : "False", cr4.MCE ? "True " : "False", cr4.PGE ? "True " : "False",
@ -88,10 +103,19 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
cr4.LA57 ? "True " : "False", cr4.VMXE ? "True " : "False", cr4.SMXE ? "True " : "False", cr4.PCIDE ? "True " : "False", cr4.LA57 ? "True " : "False", cr4.VMXE ? "True " : "False", cr4.SMXE ? "True " : "False", cr4.PCIDE ? "True " : "False",
cr4.OSXSAVE ? "True " : "False", cr4.SMEP ? "True " : "False", cr4.SMAP ? "True " : "False", cr4.PKE ? "True " : "False", cr4.OSXSAVE ? "True " : "False", cr4.SMEP ? "True " : "False", cr4.SMAP ? "True " : "False", cr4.PKE ? "True " : "False",
cr4.Reserved0, cr4.Reserved1, cr4.Reserved2); cr4.Reserved0, cr4.Reserved1, cr4.Reserved2);
#elif defined(a32)
error("CR4: VME:%s PVI:%s TSD:%s DE:%s PSE:%s PAE:%s MCE:%s PGE:%s PCE:%s UMIP:%s OSFXSR:%s OSXMMEXCPT:%s LA57:%s VMXE:%s SMXE:%s PCIDE:%s OSXSAVE:%s SMEP:%s SMAP:%s PKE:%s R0:%#x R1:%#x",
cr4.VME ? "True " : "False", cr4.PVI ? "True " : "False", cr4.TSD ? "True " : "False", cr4.DE ? "True " : "False",
cr4.PSE ? "True " : "False", cr4.PAE ? "True " : "False", cr4.MCE ? "True " : "False", cr4.PGE ? "True " : "False",
cr4.PCE ? "True " : "False", cr4.UMIP ? "True " : "False", cr4.OSFXSR ? "True " : "False", cr4.OSXMMEXCPT ? "True " : "False",
cr4.LA57 ? "True " : "False", cr4.VMXE ? "True " : "False", cr4.SMXE ? "True " : "False", cr4.PCIDE ? "True " : "False",
cr4.OSXSAVE ? "True " : "False", cr4.SMEP ? "True " : "False", cr4.SMAP ? "True " : "False", cr4.PKE ? "True " : "False",
cr4.Reserved0, cr4.Reserved1);
#endif
error("CR8: TPL:%d", cr8.TPL); error("CR8: TPL:%d", cr8.TPL);
#if defined(__amd64__) #if defined(a64)
error("RFL: CF:%s PF:%s AF:%s ZF:%s SF:%s TF:%s IF:%s DF:%s OF:%s IOPL:%s NT:%s RF:%s VM:%s AC:%s VIF:%s VIP:%s ID:%s AlwaysOne:%d R0:%#x R1:%#x R2:%#x R3:%#x", error("RFL: CF:%s PF:%s AF:%s ZF:%s SF:%s TF:%s IF:%s DF:%s OF:%s IOPL:%s NT:%s RF:%s VM:%s AC:%s VIF:%s VIP:%s ID:%s AlwaysOne:%d R0:%#x R1:%#x R2:%#x R3:%#x",
Frame->rflags.CF ? "True " : "False", Frame->rflags.PF ? "True " : "False", Frame->rflags.AF ? "True " : "False", Frame->rflags.ZF ? "True " : "False", Frame->rflags.CF ? "True " : "False", Frame->rflags.PF ? "True " : "False", Frame->rflags.AF ? "True " : "False", Frame->rflags.ZF ? "True " : "False",
Frame->rflags.SF ? "True " : "False", Frame->rflags.TF ? "True " : "False", Frame->rflags.IF ? "True " : "False", Frame->rflags.DF ? "True " : "False", Frame->rflags.SF ? "True " : "False", Frame->rflags.TF ? "True " : "False", Frame->rflags.IF ? "True " : "False", Frame->rflags.DF ? "True " : "False",
@ -99,7 +123,7 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
Frame->rflags.VM ? "True " : "False", Frame->rflags.AC ? "True " : "False", Frame->rflags.VIF ? "True " : "False", Frame->rflags.VIP ? "True " : "False", Frame->rflags.VM ? "True " : "False", Frame->rflags.AC ? "True " : "False", Frame->rflags.VIF ? "True " : "False", Frame->rflags.VIP ? "True " : "False",
Frame->rflags.ID ? "True " : "False", Frame->rflags.AlwaysOne, Frame->rflags.ID ? "True " : "False", Frame->rflags.AlwaysOne,
Frame->rflags.Reserved0, Frame->rflags.Reserved1, Frame->rflags.Reserved2, Frame->rflags.Reserved3); Frame->rflags.Reserved0, Frame->rflags.Reserved1, Frame->rflags.Reserved2, Frame->rflags.Reserved3);
#elif defined(__i386__) #elif defined(a32)
error("EFL: CF:%s PF:%s AF:%s ZF:%s SF:%s TF:%s IF:%s DF:%s OF:%s IOPL:%s NT:%s RF:%s VM:%s AC:%s VIF:%s VIP:%s ID:%s AlwaysOne:%d R0:%#x R1:%#x R2:%#x", error("EFL: CF:%s PF:%s AF:%s ZF:%s SF:%s TF:%s IF:%s DF:%s OF:%s IOPL:%s NT:%s RF:%s VM:%s AC:%s VIF:%s VIP:%s ID:%s AlwaysOne:%d R0:%#x R1:%#x R2:%#x",
Frame->eflags.CF ? "True " : "False", Frame->eflags.PF ? "True " : "False", Frame->eflags.AF ? "True " : "False", Frame->eflags.ZF ? "True " : "False", Frame->eflags.CF ? "True " : "False", Frame->eflags.PF ? "True " : "False", Frame->eflags.AF ? "True " : "False", Frame->eflags.ZF ? "True " : "False",
Frame->eflags.SF ? "True " : "False", Frame->eflags.TF ? "True " : "False", Frame->eflags.IF ? "True " : "False", Frame->eflags.DF ? "True " : "False", Frame->eflags.SF ? "True " : "False", Frame->eflags.TF ? "True " : "False", Frame->eflags.IF ? "True " : "False", Frame->eflags.DF ? "True " : "False",
@ -107,7 +131,7 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
Frame->eflags.VM ? "True " : "False", Frame->eflags.AC ? "True " : "False", Frame->eflags.VIF ? "True " : "False", Frame->eflags.VIP ? "True " : "False", Frame->eflags.VM ? "True " : "False", Frame->eflags.AC ? "True " : "False", Frame->eflags.VIF ? "True " : "False", Frame->eflags.VIP ? "True " : "False",
Frame->eflags.ID ? "True " : "False", Frame->eflags.AlwaysOne, Frame->eflags.ID ? "True " : "False", Frame->eflags.AlwaysOne,
Frame->eflags.Reserved0, Frame->eflags.Reserved1, Frame->eflags.Reserved2); Frame->eflags.Reserved0, Frame->eflags.Reserved1, Frame->eflags.Reserved2);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
error("EFER: SCE:%s LME:%s LMA:%s NXE:%s SVME:%s LMSLE:%s FFXSR:%s TCE:%s R0:%#x R1:%#x R2:%#x", error("EFER: SCE:%s LME:%s LMA:%s NXE:%s SVME:%s LMSLE:%s FFXSR:%s TCE:%s R0:%#x R1:%#x R2:%#x",
@ -178,15 +202,15 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
{ {
uintptr_t CheckPageFaultAddress = 0; uintptr_t CheckPageFaultAddress = 0;
CPU::x64::PageFaultErrorCode params = {.raw = (uint32_t)Frame->ErrorCode}; CPU::x64::PageFaultErrorCode params = {.raw = (uint32_t)Frame->ErrorCode};
#if defined(__amd64__) #if defined(a64)
CheckPageFaultAddress = CrashHandler::PageFaultAddress; CheckPageFaultAddress = CrashHandler::PageFaultAddress;
if (CheckPageFaultAddress == 0) if (CheckPageFaultAddress == 0)
CheckPageFaultAddress = Frame->rip; CheckPageFaultAddress = Frame->rip;
error("An exception occurred at %#lx by %#lx", CrashHandler::PageFaultAddress, Frame->rip); error("An exception occurred at %#lx by %#lx", CrashHandler::PageFaultAddress, Frame->rip);
#elif defined(__i386__) #elif defined(a32)
error("An exception occurred at %#lx by %#lx", CrashHandler::PageFaultAddress, Frame->eip); error("An exception occurred at %#lx by %#lx", CrashHandler::PageFaultAddress, Frame->eip);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
error("Page: %s", params.P ? "Present" : "Not Present"); error("Page: %s", params.P ? "Present" : "Not Present");
error("Write Operation: %s", params.W ? "Read-Only" : "Read-Write"); error("Write Operation: %s", params.W ? "Read-Only" : "Read-Write");

View File

@ -7,7 +7,7 @@
#include <task.hpp> #include <task.hpp>
#include <cpu.hpp> #include <cpu.hpp>
#if defined(__amd64__) #if defined(a64)
typedef struct CPU::x64::TrapFrame CHArchTrapFrame; typedef struct CPU::x64::TrapFrame CHArchTrapFrame;
struct CRData struct CRData
@ -29,7 +29,7 @@ struct CRData
Tasking::TCB *Thread; Tasking::TCB *Thread;
}; };
#elif defined(__i386__) #elif defined(a32)
typedef struct CPU::x32::TrapFrame CHArchTrapFrame; typedef struct CPU::x32::TrapFrame CHArchTrapFrame;
struct CRData struct CRData
@ -49,7 +49,7 @@ struct CRData
Tasking::PCB *Process; Tasking::PCB *Process;
Tasking::TCB *Thread; Tasking::TCB *Thread;
}; };
#elif defined(__aarch64__) #elif defined(aa64)
typedef struct CPU::aarch64::TrapFrame CHArchTrapFrame; typedef struct CPU::aarch64::TrapFrame CHArchTrapFrame;
#endif #endif
@ -244,11 +244,11 @@ namespace CrashHandler
class CrashKeyboardDriver : public Interrupts::Handler class CrashKeyboardDriver : public Interrupts::Handler
{ {
private: private:
#if defined(__amd64__) #if defined(a64)
void OnInterruptReceived(CPU::x64::TrapFrame *Frame); void OnInterruptReceived(CPU::x64::TrapFrame *Frame);
#elif defined(__i386__) #elif defined(a32)
void OnInterruptReceived(void *Frame); void OnInterruptReceived(CPU::x32::TrapFrame *Frame);
#elif defined(__aarch64__) #elif defined(aa64)
void OnInterruptReceived(void *Frame); void OnInterruptReceived(void *Frame);
#endif #endif
public: public:

View File

@ -209,11 +209,11 @@ namespace Driver
this->UnloadAllDrivers(); this->UnloadAllDrivers();
} }
#if defined(__amd64__) #if defined(a64)
SafeFunction void DriverInterruptHook::OnInterruptReceived(CPU::x64::TrapFrame *Frame) SafeFunction void DriverInterruptHook::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
#elif defined(__i386__) #elif defined(a32)
SafeFunction void DriverInterruptHook::OnInterruptReceived(void *Frame) SafeFunction void DriverInterruptHook::OnInterruptReceived(CPU::x32::TrapFrame *Frame)
#elif defined(__aarch64__) #elif defined(aa64)
SafeFunction void DriverInterruptHook::OnInterruptReceived(void *Frame) SafeFunction void DriverInterruptHook::OnInterruptReceived(void *Frame)
#endif #endif
{ {

View File

@ -5,15 +5,15 @@
#include <smp.hpp> #include <smp.hpp>
#include <io.h> #include <io.h>
#if defined(__amd64__) #if defined(a64)
#include "../Architecture/amd64/cpu/gdt.hpp" #include "../Architecture/amd64/cpu/gdt.hpp"
#include "../Architecture/amd64/cpu/idt.hpp" #include "../Architecture/amd64/cpu/idt.hpp"
#include "../Architecture/amd64/acpi.hpp" #include "../Architecture/amd64/acpi.hpp"
#include "../Architecture/amd64/cpu/apic.hpp" #include "../Architecture/amd64/cpu/apic.hpp"
#elif defined(__i386__) #elif defined(a32)
#include "../Architecture/i686/cpu/gdt.hpp" #include "../Architecture/i686/cpu/gdt.hpp"
#include "../Architecture/i686/cpu/idt.hpp" #include "../Architecture/i686/cpu/idt.hpp"
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../crashhandler.hpp" #include "../crashhandler.hpp"
@ -30,18 +30,18 @@ namespace Interrupts
}; };
Vector<Event> RegisteredEvents; Vector<Event> RegisteredEvents;
#if defined(__amd64__) #if defined(a64)
/* APIC::APIC */ void *apic[MAX_CPU]; /* APIC::APIC */ void *apic[MAX_CPU];
/* APIC::Timer */ void *apicTimer[MAX_CPU]; /* APIC::Timer */ void *apicTimer[MAX_CPU];
#elif defined(__i386__) #elif defined(a32)
/* APIC::APIC */ void *apic[MAX_CPU]; /* APIC::APIC */ void *apic[MAX_CPU];
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
void *InterruptFrames[INT_FRAMES_MAX]; void *InterruptFrames[INT_FRAMES_MAX];
void Initialize(int Core) void Initialize(int Core)
{ {
#if defined(__amd64__) #if defined(a64)
GlobalDescriptorTable::Init(Core); GlobalDescriptorTable::Init(Core);
InterruptDescriptorTable::Init(Core); InterruptDescriptorTable::Init(Core);
CPUData *CoreData = GetCPU(Core); CPUData *CoreData = GetCPU(Core);
@ -60,16 +60,16 @@ namespace Interrupts
debug("Stack for core %d is %#lx (Address: %#lx)", Core, CoreData->Stack, CoreData->Stack - STACK_SIZE); debug("Stack for core %d is %#lx (Address: %#lx)", Core, CoreData->Stack, CoreData->Stack - STACK_SIZE);
asmv("movq %0, %%rsp" ::"r"(CoreData->Stack)); asmv("movq %0, %%rsp" ::"r"(CoreData->Stack));
InitializeSystemCalls(); InitializeSystemCalls();
#elif defined(__i386__) #elif defined(a32)
warn("i386 is not supported yet"); warn("i386 is not supported yet");
#elif defined(__aarch64__) #elif defined(aa64)
warn("aarch64 is not supported yet"); warn("aarch64 is not supported yet");
#endif #endif
} }
void Enable(int Core) void Enable(int Core)
{ {
#if defined(__amd64__) #if defined(a64)
if (((ACPI::MADT *)PowerManager->GetMADT())->LAPICAddress != nullptr) if (((ACPI::MADT *)PowerManager->GetMADT())->LAPICAddress != nullptr)
{ {
// TODO: This function is called by SMP too. Do not initialize timers that doesn't support multiple cores. // TODO: This function is called by SMP too. Do not initialize timers that doesn't support multiple cores.
@ -82,9 +82,9 @@ namespace Interrupts
error("LAPIC not found"); error("LAPIC not found");
// TODO: PIC // TODO: PIC
} }
#elif defined(__i386__) #elif defined(a32)
warn("i386 is not supported yet"); warn("i386 is not supported yet");
#elif defined(__aarch64__) #elif defined(aa64)
warn("aarch64 is not supported yet"); warn("aarch64 is not supported yet");
#endif #endif
} }
@ -92,16 +92,16 @@ namespace Interrupts
void InitializeTimer(int Core) void InitializeTimer(int Core)
{ {
// TODO: This function is called by SMP too. Do not initialize timers that doesn't support multiple cores. // TODO: This function is called by SMP too. Do not initialize timers that doesn't support multiple cores.
#if defined(__amd64__) #if defined(a64)
if (apic[Core] != nullptr) if (apic[Core] != nullptr)
apicTimer[Core] = new APIC::Timer((APIC::APIC *)apic[Core]); apicTimer[Core] = new APIC::Timer((APIC::APIC *)apic[Core]);
else else
{ {
fixme("apic not found"); fixme("apic not found");
} }
#elif defined(__i386__) #elif defined(a32)
warn("i386 is not supported yet"); warn("i386 is not supported yet");
#elif defined(__aarch64__) #elif defined(aa64)
warn("aarch64 is not supported yet"); warn("aarch64 is not supported yet");
#endif #endif
} }
@ -113,7 +113,7 @@ namespace Interrupts
extern "C" SafeFunction void MainInterruptHandler(void *Data) extern "C" SafeFunction void MainInterruptHandler(void *Data)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::TrapFrame *Frame = (CPU::x64::TrapFrame *)Data; CPU::x64::TrapFrame *Frame = (CPU::x64::TrapFrame *)Data;
memmove(InterruptFrames + 1, InterruptFrames, sizeof(InterruptFrames) - sizeof(InterruptFrames[0])); memmove(InterruptFrames + 1, InterruptFrames, sizeof(InterruptFrames) - sizeof(InterruptFrames[0]));
@ -159,9 +159,9 @@ namespace Interrupts
} }
// TODO: PIC // TODO: PIC
} }
#elif defined(__i386__) #elif defined(a32)
void *Frame = Data; void *Frame = Data;
#elif defined(__aarch64__) #elif defined(aa64)
void *Frame = Data; void *Frame = Data;
#endif #endif
error("HALT HALT HALT HALT HALT HALT HALT HALT HALT"); error("HALT HALT HALT HALT HALT HALT HALT HALT HALT");
@ -197,15 +197,15 @@ namespace Interrupts
warn("Event %d not found.", InterruptNumber); warn("Event %d not found.", InterruptNumber);
} }
#if defined(__amd64__) #if defined(a64)
void Handler::OnInterruptReceived(CPU::x64::TrapFrame *Frame) void Handler::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
{ {
trace("Unhandled interrupt IRQ%d", Frame->InterruptNumber - 32); trace("Unhandled interrupt IRQ%d", Frame->InterruptNumber - 32);
#elif defined(__i386__) #elif defined(a32)
void Handler::OnInterruptReceived(void *Frame) void Handler::OnInterruptReceived(CPU::x32::TrapFrame *Frame)
{ {
trace("Unhandled interrupt received"); trace("Unhandled interrupt received");
#elif defined(__aarch64__) #elif defined(aa64)
void Handler::OnInterruptReceived(void *Frame) void Handler::OnInterruptReceived(void *Frame)
{ {
trace("Unhandled interrupt received"); trace("Unhandled interrupt received");

View File

@ -103,7 +103,7 @@ namespace Xalloc
{ {
if (this->SMAPUsed) if (this->SMAPUsed)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asm volatile("stac" :: asm volatile("stac" ::
: "cc"); : "cc");
#endif #endif
@ -114,7 +114,7 @@ namespace Xalloc
{ {
if (this->SMAPUsed) if (this->SMAPUsed)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asm volatile("clac" :: asm volatile("clac" ::
: "cc"); : "cc");
#endif #endif

View File

@ -39,7 +39,7 @@ NIF void tracepagetable(PageTable4 *pt)
{ {
for (int i = 0; i < 512; i++) for (int i = 0; i < 512; i++)
{ {
#if defined(__amd64__) #if defined(a64)
if (pt->Entries[i].Present) if (pt->Entries[i].Present)
debug("Entry %03d: %x %x %x %x %x %x %x %p-%#llx", i, debug("Entry %03d: %x %x %x %x %x %x %x %p-%#llx", i,
pt->Entries[i].Present, pt->Entries[i].ReadWrite, pt->Entries[i].Present, pt->Entries[i].ReadWrite,
@ -47,8 +47,8 @@ NIF void tracepagetable(PageTable4 *pt)
pt->Entries[i].CacheDisable, pt->Entries[i].Accessed, pt->Entries[i].CacheDisable, pt->Entries[i].Accessed,
pt->Entries[i].ExecuteDisable, pt->Entries[i].Address << 12, pt->Entries[i].ExecuteDisable, pt->Entries[i].Address << 12,
pt->Entries[i]); pt->Entries[i]);
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
} }
@ -232,9 +232,9 @@ NIF void InitializeMemoryManagement(BootInfo *Info)
tracepagetable(UserspaceKernelOnlyPageTable); tracepagetable(UserspaceKernelOnlyPageTable);
#endif #endif
KPT = KernelPageTable; KPT = KernelPageTable;
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("mov %0, %%cr3" ::"r"(KPT)); asmv("mov %0, %%cr3" ::"r"(KPT));
#elif defined(__aarch64__) #elif defined(aa64)
asmv("msr ttbr0_el1, %0" ::"r"(KPT)); asmv("msr ttbr0_el1, %0" ::"r"(KPT));
#endif #endif
debug("Page table updated."); debug("Page table updated.");

View File

@ -192,7 +192,11 @@ namespace Memory
if (PageTable) if (PageTable)
this->PageTable = PageTable; this->PageTable = PageTable;
else else
#if defined(a64)
this->PageTable = (PageTable4 *)CPU::x64::readcr3().raw; this->PageTable = (PageTable4 *)CPU::x64::readcr3().raw;
#elif defined(a32)
this->PageTable = (PageTable4 *)CPU::x32::readcr3().raw;
#endif
this->Directory = Directory; this->Directory = Directory;
debug("+ %#lx", this); debug("+ %#lx", this);

View File

@ -4,7 +4,7 @@ namespace Memory
{ {
Virtual::PageMapIndexer::PageMapIndexer(uintptr_t VirtualAddress) Virtual::PageMapIndexer::PageMapIndexer(uintptr_t VirtualAddress)
{ {
#if defined(__amd64__) #if defined(a64)
uintptr_t Address = VirtualAddress; uintptr_t Address = VirtualAddress;
Address >>= 12; Address >>= 12;
this->PTEIndex = Address & 0x1FF; this->PTEIndex = Address & 0x1FF;
@ -14,7 +14,7 @@ namespace Memory
this->PDPTEIndex = Address & 0x1FF; this->PDPTEIndex = Address & 0x1FF;
Address >>= 9; Address >>= 9;
this->PMLIndex = Address & 0x1FF; this->PMLIndex = Address & 0x1FF;
#elif defined(__i386__) #elif defined(a32)
uintptr_t Address = VirtualAddress; uintptr_t Address = VirtualAddress;
Address >>= 12; Address >>= 12;
this->PTEIndex = Address & 0x3FF; this->PTEIndex = Address & 0x3FF;
@ -22,7 +22,7 @@ namespace Memory
this->PDEIndex = Address & 0x3FF; this->PDEIndex = Address & 0x3FF;
Address >>= 10; Address >>= 10;
this->PDPTEIndex = Address & 0x3FF; this->PDPTEIndex = Address & 0x3FF;
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
} }

View File

@ -101,11 +101,11 @@ namespace Memory
PTE.SetAddress((uintptr_t)PhysicalAddress >> 12); PTE.SetAddress((uintptr_t)PhysicalAddress >> 12);
PTEPtr->Entries[Index.PTEIndex] = PTE; PTEPtr->Entries[Index.PTEIndex] = PTE;
#if defined(__amd64__) #if defined(a64)
CPU::x64::invlpg(VirtualAddress); CPU::x64::invlpg(VirtualAddress);
#elif defined(__i386__) #elif defined(a32)
CPU::x32::invlpg(VirtualAddress); CPU::x32::invlpg(VirtualAddress);
#elif defined(__aarch64__) #elif defined(aa64)
asmv("dsb sy"); asmv("dsb sy");
asmv("tlbi vae1is, %0" asmv("tlbi vae1is, %0"
: :
@ -180,11 +180,11 @@ namespace Memory
PTE.Present = false; PTE.Present = false;
PTEPtr->Entries[Index.PTEIndex] = PTE; PTEPtr->Entries[Index.PTEIndex] = PTE;
#if defined(__amd64__) #if defined(a64)
CPU::x64::invlpg(VirtualAddress); CPU::x64::invlpg(VirtualAddress);
#elif defined(__i386__) #elif defined(a32)
CPU::x32::invlpg(VirtualAddress); CPU::x32::invlpg(VirtualAddress);
#elif defined(__aarch64__) #elif defined(aa64)
asmv("dsb sy"); asmv("dsb sy");
asmv("tlbi vae1is, %0" asmv("tlbi vae1is, %0"
: :

View File

@ -2,10 +2,10 @@
#include <memory.hpp> #include <memory.hpp>
#include <power.hpp> #include <power.hpp>
#if defined(__amd64__) #if defined(a64)
#include "../Architecture/amd64/acpi.hpp" #include "../Architecture/amd64/acpi.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../kernel.h" #include "../kernel.h"
@ -837,7 +837,7 @@ namespace PCI
PCI::PCI() PCI::PCI()
{ {
#if defined(__amd64__) #if defined(a64)
int Entries = ((((ACPI::ACPI *)PowerManager->GetACPI())->MCFG->Header.Length) - sizeof(ACPI::ACPI::MCFGHeader)) / sizeof(DeviceConfig); int Entries = ((((ACPI::ACPI *)PowerManager->GetACPI())->MCFG->Header.Length) - sizeof(ACPI::ACPI::MCFGHeader)) / sizeof(DeviceConfig);
for (int t = 0; t < Entries; t++) for (int t = 0; t < Entries; t++)
{ {
@ -848,9 +848,9 @@ namespace PCI
for (uintptr_t Bus = NewDeviceConfig->StartBus; Bus < NewDeviceConfig->EndBus; Bus++) for (uintptr_t Bus = NewDeviceConfig->StartBus; Bus < NewDeviceConfig->EndBus; Bus++)
EnumerateBus(NewDeviceConfig->BaseAddress, Bus); EnumerateBus(NewDeviceConfig->BaseAddress, Bus);
} }
#elif defined(__i386__) #elif defined(a32)
error("PCI not implemented on i386"); error("PCI not implemented on i386");
#elif defined(__aarch64__) #elif defined(aa64)
error("PCI not implemented on aarch64"); error("PCI not implemented on aarch64");
#endif #endif
} }

View File

@ -5,7 +5,7 @@
#include "../kernel.h" #include "../kernel.h"
#if defined(__amd64__) #if defined(a64)
#include <io.h> #include <io.h>
#include "../Architecture/amd64/acpi.hpp" #include "../Architecture/amd64/acpi.hpp"
@ -75,7 +75,7 @@ namespace Power
} }
} }
#elif defined(__i386__) #elif defined(a32)
namespace Power namespace Power
{ {
@ -99,7 +99,7 @@ namespace Power
} }
} }
#elif defined(__aarch64__) #elif defined(aa64)
namespace Power namespace Power
{ {

View File

@ -10,12 +10,12 @@ namespace Random
int RDRANDFlag = 0; int RDRANDFlag = 0;
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -24,12 +24,12 @@ namespace Random
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -40,7 +40,7 @@ namespace Random
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0) if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
RDRANDFlag = 0; RDRANDFlag = 0;
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
if (RDRANDFlag) if (RDRANDFlag)
{ {
uint16_t RDRANDValue = 0; uint16_t RDRANDValue = 0;
@ -59,12 +59,12 @@ namespace Random
int RDRANDFlag = 0; int RDRANDFlag = 0;
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -73,12 +73,12 @@ namespace Random
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -89,7 +89,7 @@ namespace Random
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0) if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
RDRANDFlag = 0; RDRANDFlag = 0;
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
if (RDRANDFlag) if (RDRANDFlag)
{ {
uint32_t RDRANDValue = 0; uint32_t RDRANDValue = 0;
@ -108,12 +108,12 @@ namespace Random
int RDRANDFlag = 0; int RDRANDFlag = 0;
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -122,12 +122,12 @@ namespace Random
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -138,7 +138,7 @@ namespace Random
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0) if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
RDRANDFlag = 0; RDRANDFlag = 0;
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
if (RDRANDFlag) if (RDRANDFlag)
{ {
uint64_t RDRANDValue = 0; uint64_t RDRANDValue = 0;

View File

@ -43,15 +43,20 @@ EXTERNC __attribute__((weak, noreturn, no_stack_protector)) void __stack_chk_fai
debug("Current stack check guard value: %#lx", __stack_chk_guard); debug("Current stack check guard value: %#lx", __stack_chk_guard);
KPrint("\eFF0000Stack smashing detected!"); KPrint("\eFF0000Stack smashing detected!");
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
void *Stack = nullptr; void *Stack = nullptr;
#if defined(a64)
asmv("movq %%rsp, %0" asmv("movq %%rsp, %0"
: "=r"(Stack)); : "=r"(Stack));
#elif defined(a32)
asmv("movl %%esp, %0"
: "=r"(Stack));
#endif
error("Stack address: %#lx", Stack); error("Stack address: %#lx", Stack);
while (1) while (1)
asmv("cli; hlt"); asmv("cli; hlt");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("wfe"); asmv("wfe");
#endif #endif
CPU::Stop(); CPU::Stop();
@ -65,10 +70,10 @@ EXTERNC __attribute__((weak, noreturn, no_stack_protector)) void __chk_fail(void
error("Buffer overflow detected!"); error("Buffer overflow detected!");
KPrint("\eFF0000Buffer overflow detected!"); KPrint("\eFF0000Buffer overflow detected!");
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
while (1) while (1)
asmv("cli; hlt"); asmv("cli; hlt");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("wfe"); asmv("wfe");
#endif #endif
} }

View File

@ -7,7 +7,7 @@ namespace Time
Clock ReadClock() Clock ReadClock()
{ {
Clock tm; Clock tm;
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
uint32_t t = 0; uint32_t t = 0;
outb(0x70, 0x00); outb(0x70, 0x00);
t = inb(0x71); t = inb(0x71);
@ -28,7 +28,7 @@ namespace Time
t = inb(0x71); t = inb(0x71);
tm.Year = ((t & 0x0F) + ((t >> 4) * 10)); tm.Year = ((t & 0x0F) + ((t >> 4) * 10));
tm.Counter = 0; tm.Counter = 0;
#elif defined(__aarch64__) #elif defined(aa64)
tm.Year = 0; tm.Year = 0;
tm.Month = 0; tm.Month = 0;
tm.Day = 0; tm.Day = 0;

View File

@ -4,10 +4,10 @@
#include <debug.h> #include <debug.h>
#include <io.h> #include <io.h>
#if defined(__amd64__) #if defined(a64)
#include "../Architecture/amd64/acpi.hpp" #include "../Architecture/amd64/acpi.hpp"
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#include "../kernel.h" #include "../kernel.h"
@ -16,7 +16,7 @@ namespace Time
{ {
void time::Sleep(uint64_t Milliseconds) void time::Sleep(uint64_t Milliseconds)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
uint64_t Target = mminq(&((HPET *)hpet)->MainCounterValue) + (Milliseconds * 1000000000000) / clk; uint64_t Target = mminq(&((HPET *)hpet)->MainCounterValue) + (Milliseconds * 1000000000000) / clk;
#ifdef DEBUG #ifdef DEBUG
uint64_t Counter = mminq(&((HPET *)hpet)->MainCounterValue); uint64_t Counter = mminq(&((HPET *)hpet)->MainCounterValue);
@ -29,23 +29,23 @@ namespace Time
while (mminq(&((HPET *)hpet)->MainCounterValue) < Target) while (mminq(&((HPET *)hpet)->MainCounterValue) < Target)
CPU::Pause(); CPU::Pause();
#endif #endif
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
uint64_t time::GetCounter() uint64_t time::GetCounter()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
return mminq(&((HPET *)hpet)->MainCounterValue); return mminq(&((HPET *)hpet)->MainCounterValue);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
uint64_t time::CalculateTarget(uint64_t Milliseconds) uint64_t time::CalculateTarget(uint64_t Milliseconds)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
return mminq(&((HPET *)hpet)->MainCounterValue) + (Milliseconds * 1000000000000) / clk; return mminq(&((HPET *)hpet)->MainCounterValue) + (Milliseconds * 1000000000000) / clk;
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
@ -53,7 +53,7 @@ namespace Time
{ {
if (_acpi) if (_acpi)
{ {
#if defined(__amd64__) #if defined(a64)
this->acpi = _acpi; this->acpi = _acpi;
ACPI::ACPI *acpi = (ACPI::ACPI *)this->acpi; ACPI::ACPI *acpi = (ACPI::ACPI *)this->acpi;
if (acpi->HPET) if (acpi->HPET)
@ -76,8 +76,8 @@ namespace Time
KPrint("\eFF2200HPET not found"); KPrint("\eFF2200HPET not found");
CPU::Stop(); CPU::Stop();
} }
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
} }

View File

@ -6,7 +6,7 @@
volatile bool serialports[8] = {false, false, false, false, false, false, false, false}; volatile bool serialports[8] = {false, false, false, false, false, false, false, false};
Vector<UniversalAsynchronousReceiverTransmitter::Events *> RegisteredEvents; Vector<UniversalAsynchronousReceiverTransmitter::Events *> RegisteredEvents;
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
NIF uint8_t NoProfiler_inportb(uint16_t Port) NIF uint8_t NoProfiler_inportb(uint16_t Port)
{ {
uint8_t Result; uint8_t Result;
@ -39,7 +39,7 @@ namespace UniversalAsynchronousReceiverTransmitter
SafeFunction NIF UART::UART(SerialPorts Port) SafeFunction NIF UART::UART(SerialPorts Port)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
if (Port == COMNULL) if (Port == COMNULL)
return; return;
@ -108,7 +108,7 @@ namespace UniversalAsynchronousReceiverTransmitter
SafeFunction NIF void UART::Write(uint8_t Char) SafeFunction NIF void UART::Write(uint8_t Char)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
while ((NoProfiler_inportb(Port + 5) & SERIAL_BUFFER_EMPTY) == 0) while ((NoProfiler_inportb(Port + 5) & SERIAL_BUFFER_EMPTY) == 0)
; ;
NoProfiler_outportb(Port, Char); NoProfiler_outportb(Port, Char);
@ -120,7 +120,7 @@ namespace UniversalAsynchronousReceiverTransmitter
SafeFunction NIF uint8_t UART::Read() SafeFunction NIF uint8_t UART::Read()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
while ((NoProfiler_inportb(Port + 5) & 1) == 0) while ((NoProfiler_inportb(Port + 5) & 1) == 0)
; ;
return NoProfiler_inportb(Port); return NoProfiler_inportb(Port);
@ -129,7 +129,7 @@ namespace UniversalAsynchronousReceiverTransmitter
{ {
if (e->GetRegisteredPort() == Port || e->GetRegisteredPort() == COMNULL) if (e->GetRegisteredPort() == Port || e->GetRegisteredPort() == COMNULL)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
e->OnReceived(NoProfiler_inportb(Port)); e->OnReceived(NoProfiler_inportb(Port));
#endif #endif
} }

View File

@ -93,23 +93,23 @@
* *
*/ */
#ifdef __amd64__ #ifdef a64
#if UINTPTR_MAX != UINT64_MAX #if UINTPTR_MAX != UINT64_MAX
#error "uintptr_t is not 64-bit!" #error "uintptr_t is not 64-bit!"
#endif // UINTPTR_MAX != UINT64_MAX #endif // UINTPTR_MAX != UINT64_MAX
#endif // __amd64__ #endif // a64
#ifdef __i386__ #ifdef a32
#if UINTPTR_MAX != UINT32_MAX #if UINTPTR_MAX != UINT32_MAX
#error "uintptr_t is not 32-bit!" #error "uintptr_t is not 32-bit!"
#endif // UINTPTR_MAX != UINT32_MAX #endif // UINTPTR_MAX != UINT32_MAX
#endif // __i386__ #endif // a32
#ifdef __aarch64__ #ifdef aa64
#if UINTPTR_MAX != UINT64_MAX #if UINTPTR_MAX != UINT64_MAX
#error "uintptr_t is not 64-bit!" #error "uintptr_t is not 64-bit!"
#endif // UINTPTR_MAX != UINT64_MAX #endif // UINTPTR_MAX != UINT64_MAX
#endif // __aarch64__ #endif // aa64
NewLock(KernelLock); NewLock(KernelLock);
@ -184,18 +184,18 @@ EXTERNC NIF void Main(BootInfo *Info)
} }
KPrint("Enabling Interrupts on Bootstrap Processor"); KPrint("Enabling Interrupts on Bootstrap Processor");
Interrupts::Enable(0); Interrupts::Enable(0);
#if defined(__amd64__) #if defined(a64)
PowerManager->InitDSDT(); PowerManager->InitDSDT();
#elif defined(__i386__) #elif defined(a32)
// FIXME: Add ACPI support for i386 // FIXME: Add ACPI support for i386
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
KPrint("Initializing Timers"); KPrint("Initializing Timers");
#if defined(__amd64__) #if defined(a64)
TimeManager = new Time::time(PowerManager->GetACPI()); TimeManager = new Time::time(PowerManager->GetACPI());
#elif defined(__i386__) #elif defined(a32)
TimeManager = new Time::time(PowerManager->GetACPI()); TimeManager = new Time::time(PowerManager->GetACPI());
#elif defined(__aarch64__) #elif defined(aa64)
TimeManager = new Time::time(nullptr); TimeManager = new Time::time(nullptr);
#endif #endif
KPrint("Initializing Bootstrap Processor Timer"); KPrint("Initializing Bootstrap Processor Timer");

View File

@ -594,7 +594,7 @@ EXTERNC void __chk_fail(void) __attribute__((__noreturn__));
__noreturn static inline void __convert_chk_fail(void) __noreturn static inline void __convert_chk_fail(void)
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("int3"); asmv("int3");
#else #else
#error "Not implemented!" #error "Not implemented!"

View File

@ -12,6 +12,7 @@ TODO: Replace these functions with even more optimized versions.
EXTERNC void *memcpy_sse(void *dest, const void *src, size_t n) EXTERNC void *memcpy_sse(void *dest, const void *src, size_t n)
{ {
#if defined(a64)
char *d = (char *)dest; char *d = (char *)dest;
const char *s = (const char *)src; const char *s = (const char *)src;
@ -32,11 +33,13 @@ EXTERNC void *memcpy_sse(void *dest, const void *src, size_t n)
} }
memcpy_unsafe(d, s, n); memcpy_unsafe(d, s, n);
#endif // defined(a64)
return dest; return dest;
} }
EXTERNC void *memcpy_sse2(void *dest, const void *src, size_t n) EXTERNC void *memcpy_sse2(void *dest, const void *src, size_t n)
{ {
#if defined(a64)
char *d = (char *)dest; char *d = (char *)dest;
const char *s = (const char *)src; const char *s = (const char *)src;
@ -57,11 +60,13 @@ EXTERNC void *memcpy_sse2(void *dest, const void *src, size_t n)
} }
memcpy_unsafe(d, s, n); memcpy_unsafe(d, s, n);
#endif // defined(a64)
return dest; return dest;
} }
EXTERNC void *memcpy_sse3(void *dest, const void *src, size_t n) EXTERNC void *memcpy_sse3(void *dest, const void *src, size_t n)
{ {
#if defined(a64)
char *d = (char *)dest; char *d = (char *)dest;
const char *s = (const char *)src; const char *s = (const char *)src;
@ -83,11 +88,13 @@ EXTERNC void *memcpy_sse3(void *dest, const void *src, size_t n)
} }
memcpy_unsafe(d, s, n); memcpy_unsafe(d, s, n);
#endif // defined(a64)
return dest; return dest;
} }
EXTERNC void *memcpy_ssse3(void *dest, const void *src, size_t n) EXTERNC void *memcpy_ssse3(void *dest, const void *src, size_t n)
{ {
#if defined(a64)
char *d = (char *)dest; char *d = (char *)dest;
const char *s = (const char *)src; const char *s = (const char *)src;
@ -110,11 +117,13 @@ EXTERNC void *memcpy_ssse3(void *dest, const void *src, size_t n)
} }
memcpy_unsafe(d, s, n); memcpy_unsafe(d, s, n);
#endif // defined(a64)
return dest; return dest;
} }
EXTERNC void *memcpy_sse4_1(void *dest, const void *src, size_t n) EXTERNC void *memcpy_sse4_1(void *dest, const void *src, size_t n)
{ {
#if defined(a64)
char *d = (char *)dest; char *d = (char *)dest;
const char *s = (const char *)src; const char *s = (const char *)src;
@ -136,11 +145,13 @@ EXTERNC void *memcpy_sse4_1(void *dest, const void *src, size_t n)
} }
memcpy_unsafe(d, s, n); memcpy_unsafe(d, s, n);
#endif // defined(a64)
return dest; return dest;
} }
EXTERNC void *memcpy_sse4_2(void *dest, const void *src, size_t n) EXTERNC void *memcpy_sse4_2(void *dest, const void *src, size_t n)
{ {
#if defined(a64)
char *d = (char *)dest; char *d = (char *)dest;
const char *s = (const char *)src; const char *s = (const char *)src;
@ -162,5 +173,6 @@ EXTERNC void *memcpy_sse4_2(void *dest, const void *src, size_t n)
} }
memcpy_unsafe(d, s, n); memcpy_unsafe(d, s, n);
#endif // defined(a64)
return dest; return dest;
} }

View File

@ -39,6 +39,7 @@ EXTERNC void *memset_sse4_1(void *dest, int c, size_t n)
EXTERNC void *memset_sse4_2(void *dest, int c, size_t n) EXTERNC void *memset_sse4_2(void *dest, int c, size_t n)
{ {
#if defined(a64)
char *d = (char *)dest; char *d = (char *)dest;
if (((uintptr_t)d & 0xF) == 0) if (((uintptr_t)d & 0xF) == 0)
@ -58,5 +59,6 @@ EXTERNC void *memset_sse4_2(void *dest, int c, size_t n)
} }
memset_unsafe(d, c, n); memset_unsafe(d, c, n);
#endif
return dest; return dest;
} }

View File

@ -120,7 +120,7 @@ void md5Finalize(MD5Context *ctx)
unsigned int offset = ctx->size % 64; unsigned int offset = ctx->size % 64;
unsigned int padding_length = offset < 56 ? 56 - offset : (56 + 64) - offset; unsigned int padding_length = offset < 56 ? 56 - offset : (56 + 64) - offset;
// Fill in the padding andndo the changes to size that resulted from the update // Fill in the padding and do the changes to size that resulted from the update
md5Update(ctx, PADDING, padding_length); md5Update(ctx, PADDING, padding_length);
ctx->size -= (uint64_t)padding_length; ctx->size -= (uint64_t)padding_length;
@ -134,7 +134,11 @@ void md5Finalize(MD5Context *ctx)
(uint32_t)(ctx->input[(j * 4)]); (uint32_t)(ctx->input[(j * 4)]);
} }
input[14] = (uint32_t)(ctx->size * 8); input[14] = (uint32_t)(ctx->size * 8);
#ifdef a32
input[15] = (uint32_t)((ctx->size >> 32) | (ctx->size << 32)) >> 32;
#else
input[15] = (uint32_t)((ctx->size * 8) >> 32); input[15] = (uint32_t)((ctx->size * 8) >> 32);
#endif
md5Step(ctx->buffer, input); md5Step(ctx->buffer, input);

View File

@ -972,15 +972,39 @@ static uint64_t sys_arch_prctl(int code, unsigned long arg2, unsigned long arg3,
switch (code) switch (code)
{ {
case 0x1001: // ARCH_SET_GS case 0x1001: // ARCH_SET_GS
{
#if defined(a64)
CPU::x64::wrmsr(CPU::x64::MSRID::MSR_GS_BASE, arg2); CPU::x64::wrmsr(CPU::x64::MSRID::MSR_GS_BASE, arg2);
#elif defined(a32)
CPU::x32::wrmsr(CPU::x32::MSRID::MSR_GS_BASE, arg2);
#endif
return arg2; return arg2;
}
case 0x1002: // ARCH_SET_FS case 0x1002: // ARCH_SET_FS
{
#if defined(a64)
CPU::x64::wrmsr(CPU::x64::MSRID::MSR_FS_BASE, arg2); CPU::x64::wrmsr(CPU::x64::MSRID::MSR_FS_BASE, arg2);
#elif defined(a32)
CPU::x32::wrmsr(CPU::x32::MSRID::MSR_FS_BASE, arg2);
#endif
return arg2; return arg2;
}
case 0x1003: // ARCH_GET_FS case 0x1003: // ARCH_GET_FS
{
#if defined(a64)
return CPU::x64::rdmsr(CPU::x64::MSRID::MSR_FS_BASE); return CPU::x64::rdmsr(CPU::x64::MSRID::MSR_FS_BASE);
#elif defined(a32)
return CPU::x32::rdmsr(CPU::x32::MSRID::MSR_FS_BASE);
#endif
}
case 0x1004: // ARCH_GET_GS case 0x1004: // ARCH_GET_GS
{
#if defined(a64)
return CPU::x64::rdmsr(CPU::x64::MSRID::MSR_GS_BASE); return CPU::x64::rdmsr(CPU::x64::MSRID::MSR_GS_BASE);
#elif defined(a32)
return CPU::x32::rdmsr(CPU::x32::MSRID::MSR_GS_BASE);
#endif
}
default: default:
warn("Unimplemented prctl code %#lx (arg2=%lx, arg3=%lx, arg4=%lx, arg5=%lx)", code, arg2, arg3, arg4, arg5); warn("Unimplemented prctl code %#lx (arg2=%lx, arg3=%lx, arg4=%lx, arg5=%lx)", code, arg2, arg3, arg4, arg5);
return -1; /* EINVAL */ return -1; /* EINVAL */
@ -2393,7 +2417,7 @@ static void *LinuxSyscallsTable[] = {
uintptr_t HandleLinuxSyscalls(SyscallsFrame *Frame) uintptr_t HandleLinuxSyscalls(SyscallsFrame *Frame)
{ {
#if defined(__amd64__) #if defined(a64)
if (Frame->rax > sizeof(LinuxSyscallsTable)) if (Frame->rax > sizeof(LinuxSyscallsTable))
{ {
fixme("Syscall %lld not implemented", Frame->rax); fixme("Syscall %lld not implemented", Frame->rax);
@ -2409,7 +2433,7 @@ uintptr_t HandleLinuxSyscalls(SyscallsFrame *Frame)
uint64_t ret = call(Frame->rdi, Frame->rsi, Frame->rdx, Frame->r10, Frame->r8, Frame->r9); uint64_t ret = call(Frame->rdi, Frame->rsi, Frame->rdx, Frame->r10, Frame->r8, Frame->r9);
Frame->rax = ret; Frame->rax = ret;
return ret; return ret;
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }

View File

@ -276,7 +276,7 @@ static void *NativeSyscallsTable[] = {
uintptr_t HandleNativeSyscalls(SyscallsFrame *Frame) uintptr_t HandleNativeSyscalls(SyscallsFrame *Frame)
{ {
#if defined(__amd64__) #if defined(a64)
// debug("rax: %#llx, rbx: %#llx, rcx: %#llx, rdx: %#llx, rsi: %#llx, rdi: %#llx, rbp: %#llx, r8: %#llx, r9: %#llx, r10: %#llx, r11: %#llx, r12: %#llx, r13: %#llx, r14: %#llx, r15: %#llx", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx, Frame->rsi, Frame->rdi, Frame->rbp, Frame->r8, Frame->r9, Frame->r10, Frame->r11, Frame->r12, Frame->r13, Frame->r14, Frame->r15); // debug("rax: %#llx, rbx: %#llx, rcx: %#llx, rdx: %#llx, rsi: %#llx, rdi: %#llx, rbp: %#llx, r8: %#llx, r9: %#llx, r10: %#llx, r11: %#llx, r12: %#llx, r13: %#llx, r14: %#llx, r15: %#llx", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx, Frame->rsi, Frame->rdi, Frame->rbp, Frame->r8, Frame->r9, Frame->r10, Frame->r11, Frame->r12, Frame->r13, Frame->r14, Frame->r15);
if (Frame->rax > sizeof(NativeSyscallsTable)) if (Frame->rax > sizeof(NativeSyscallsTable))
{ {
@ -294,7 +294,7 @@ uintptr_t HandleNativeSyscalls(SyscallsFrame *Frame)
uintptr_t ret = call((uintptr_t)Frame, Frame->rdi, Frame->rsi, Frame->rdx, Frame->r10, Frame->r8, Frame->r9); uintptr_t ret = call((uintptr_t)Frame, Frame->rdi, Frame->rsi, Frame->rdx, Frame->r10, Frame->r8, Frame->r9);
Frame->rax = ret; Frame->rax = ret;
return ret; return ret;
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }

View File

@ -11,7 +11,7 @@ extern "C" uintptr_t SystemCallsHandler(SyscallsFrame *Frame)
CPU::Interrupts(CPU::Enable); CPU::Interrupts(CPU::Enable);
SmartLock(SyscallsLock); /* TODO: This should be replaced or moved somewhere else. */ SmartLock(SyscallsLock); /* TODO: This should be replaced or moved somewhere else. */
#if defined(__amd64__) #if defined(a64)
switch (TaskManager->GetCurrentThread()->Info.Compatibility) switch (TaskManager->GetCurrentThread()->Info.Compatibility)
{ {
case Tasking::TaskCompatibility::Native: case Tasking::TaskCompatibility::Native:
@ -30,9 +30,9 @@ extern "C" uintptr_t SystemCallsHandler(SyscallsFrame *Frame)
break; break;
} }
} }
#elif defined(__i386__) #elif defined(a32)
fixme("System call %lld", Frame->eax); fixme("System call %lld", Frame->eax);
#elif defined(__aarch64__) #elif defined(aa64)
fixme("System call"); fixme("System call");
#endif #endif
return -1; return -1;

View File

@ -9,12 +9,12 @@
#include "../kernel.h" #include "../kernel.h"
#if defined(__amd64__) #if defined(a64)
#include "../Architecture/amd64/cpu/apic.hpp" #include "../Architecture/amd64/cpu/apic.hpp"
#include "../Architecture/amd64/cpu/gdt.hpp" #include "../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#include "../Architecture/i686/cpu/apic.hpp" #include "../Architecture/i686/cpu/apic.hpp"
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
NewLock(SchedulerLock); NewLock(SchedulerLock);
@ -94,16 +94,16 @@ extern "C" SafeFunction NIF void TaskingScheduler_OneShot(int TimeSlice)
{ {
if (TimeSlice == 0) if (TimeSlice == 0)
TimeSlice = Tasking::TaskPriority::Normal; TimeSlice = Tasking::TaskPriority::Normal;
#if defined(__amd64__) #if defined(a64)
((APIC::Timer *)Interrupts::apicTimer[GetCurrentCPU()->ID])->OneShot(CPU::x86::IRQ16, TimeSlice); ((APIC::Timer *)Interrupts::apicTimer[GetCurrentCPU()->ID])->OneShot(CPU::x86::IRQ16, TimeSlice);
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }
namespace Tasking namespace Tasking
{ {
#if defined(__amd64__) #if defined(a64)
SafeFunction NIF bool Task::FindNewProcess(void *CPUDataPointer) SafeFunction NIF bool Task::FindNewProcess(void *CPUDataPointer)
{ {
CPUData *CurrentCPU = (CPUData *)CPUDataPointer; CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
@ -671,7 +671,7 @@ namespace Tasking
} }
SafeFunction NIF void Task::OnInterruptReceived(CPU::x64::TrapFrame *Frame) { this->Schedule(Frame); } SafeFunction NIF void Task::OnInterruptReceived(CPU::x64::TrapFrame *Frame) { this->Schedule(Frame); }
#elif defined(__i386__) #elif defined(a32)
SafeFunction bool Task::FindNewProcess(void *CPUDataPointer) SafeFunction bool Task::FindNewProcess(void *CPUDataPointer)
{ {
fixme("unimplemented"); fixme("unimplemented");
@ -702,8 +702,8 @@ namespace Tasking
fixme("unimplemented"); fixme("unimplemented");
} }
SafeFunction void Task::OnInterruptReceived(void *Frame) { this->Schedule(Frame); } SafeFunction void Task::OnInterruptReceived(CPU::x32::TrapFrame *Frame) { this->Schedule(Frame); }
#elif defined(__aarch64__) #elif defined(aa64)
SafeFunction bool Task::FindNewProcess(void *CPUDataPointer) SafeFunction bool Task::FindNewProcess(void *CPUDataPointer)
{ {
fixme("unimplemented"); fixme("unimplemented");

View File

@ -9,12 +9,12 @@
#include "../kernel.h" #include "../kernel.h"
#if defined(__amd64__) #if defined(a64)
#include "../Architecture/amd64/cpu/apic.hpp" #include "../Architecture/amd64/cpu/apic.hpp"
#include "../Architecture/amd64/cpu/gdt.hpp" #include "../Architecture/amd64/cpu/gdt.hpp"
#elif defined(__i386__) #elif defined(a32)
#include "../Architecture/i686/cpu/apic.hpp" #include "../Architecture/i686/cpu/apic.hpp"
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
// #define DEBUG_TASKING 1 // #define DEBUG_TASKING 1
@ -43,11 +43,11 @@ namespace Tasking
__naked __used __no_stack_protector NIF void IdleProcessLoop() __naked __used __no_stack_protector NIF void IdleProcessLoop()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("IdleLoop:\n" asmv("IdleLoop:\n"
"hlt\n" "hlt\n"
"jmp IdleLoop\n"); "jmp IdleLoop\n");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("IdleLoop:\n" asmv("IdleLoop:\n"
"wfe\n" "wfe\n"
"b IdleLoop\n"); "b IdleLoop\n");
@ -394,11 +394,11 @@ namespace Tasking
// : "memory"); // : "memory");
// CPU::x64::fxsave(Thread->FPU); // CPU::x64::fxsave(Thread->FPU);
#if defined(__amd64__) #if defined(a64)
memset(&Thread->Registers, 0, sizeof(CPU::x64::TrapFrame)); // Just in case memset(&Thread->Registers, 0, sizeof(CPU::x64::TrapFrame)); // Just in case
Thread->Registers.rip = (EntryPoint + Offset); Thread->Registers.rip = (EntryPoint + Offset);
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
switch (Parent->Security.TrustLevel) switch (Parent->Security.TrustLevel)
{ {
@ -408,7 +408,7 @@ namespace Tasking
case TaskTrustLevel::Kernel: case TaskTrustLevel::Kernel:
{ {
Thread->Stack = new Memory::StackGuard(false, Parent->PageTable); Thread->Stack = new Memory::StackGuard(false, Parent->PageTable);
#if defined(__amd64__) #if defined(a64)
SecurityManager.TrustToken(Thread->Security.UniqueToken, TTL::TrustedByKernel); SecurityManager.TrustToken(Thread->Security.UniqueToken, TTL::TrustedByKernel);
Thread->GSBase = CPU::x64::rdmsr(CPU::x64::MSRID::MSR_GS_BASE); Thread->GSBase = CPU::x64::rdmsr(CPU::x64::MSRID::MSR_GS_BASE);
Thread->FSBase = CPU::x64::rdmsr(CPU::x64::MSRID::MSR_FS_BASE); Thread->FSBase = CPU::x64::rdmsr(CPU::x64::MSRID::MSR_FS_BASE);
@ -419,15 +419,15 @@ namespace Tasking
Thread->Registers.rflags.ID = 1; Thread->Registers.rflags.ID = 1;
Thread->Registers.rsp = ((uintptr_t)Thread->Stack->GetStackTop()); Thread->Registers.rsp = ((uintptr_t)Thread->Stack->GetStackTop());
POKE(uintptr_t, Thread->Registers.rsp) = (uintptr_t)ThreadDoExit; POKE(uintptr_t, Thread->Registers.rsp) = (uintptr_t)ThreadDoExit;
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
break; break;
} }
case TaskTrustLevel::User: case TaskTrustLevel::User:
{ {
Thread->Stack = new Memory::StackGuard(true, Parent->PageTable); Thread->Stack = new Memory::StackGuard(true, Parent->PageTable);
#if defined(__amd64__) #if defined(a64)
SecurityManager.TrustToken(Thread->Security.UniqueToken, TTL::Untrusted); SecurityManager.TrustToken(Thread->Security.UniqueToken, TTL::Untrusted);
Thread->GSBase = 0; Thread->GSBase = 0;
Thread->FSBase = 0; Thread->FSBase = 0;
@ -577,8 +577,8 @@ namespace Tasking
error("Offset is not user accessible"); error("Offset is not user accessible");
uva.Map((void *)Offset, (void *)Offset, Memory::PTFlag::RW | Memory::PTFlag::US); // We try one more time. uva.Map((void *)Offset, (void *)Offset, Memory::PTFlag::RW | Memory::PTFlag::US); // We try one more time.
} }
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
#ifdef DEBUG_TASKING #ifdef DEBUG_TASKING
DumpData(Thread->Name, Thread->Stack, STACK_SIZE); DumpData(Thread->Name, Thread->Stack, STACK_SIZE);
@ -613,19 +613,19 @@ namespace Tasking
Thread->Info.Compatibility = Compatibility; Thread->Info.Compatibility = Compatibility;
#ifdef DEBUG #ifdef DEBUG
#ifdef __amd64__ #ifdef a64
debug("Thread offset is %#lx (EntryPoint: %#lx) => RIP: %#lx", Thread->Offset, Thread->EntryPoint, Thread->Registers.rip); debug("Thread offset is %#lx (EntryPoint: %#lx) => RIP: %#lx", Thread->Offset, Thread->EntryPoint, Thread->Registers.rip);
if (Parent->Security.TrustLevel == TaskTrustLevel::User) if (Parent->Security.TrustLevel == TaskTrustLevel::User)
debug("Thread stack region is %#lx-%#lx (U) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.rsp); debug("Thread stack region is %#lx-%#lx (U) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.rsp);
else else
debug("Thread stack region is %#lx-%#lx (K) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.rsp); debug("Thread stack region is %#lx-%#lx (K) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.rsp);
#elif defined(__i386__) #elif defined(a32)
debug("Thread offset is %#lx (EntryPoint: %#lx) => RIP: %#lx", Thread->Offset, Thread->EntryPoint, Thread->Registers.eip); debug("Thread offset is %#lx (EntryPoint: %#lx) => RIP: %#lx", Thread->Offset, Thread->EntryPoint, Thread->Registers.eip);
if (Parent->Security.TrustLevel == TaskTrustLevel::User) if (Parent->Security.TrustLevel == TaskTrustLevel::User)
debug("Thread stack region is %#lx-%#lx (U) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.esp); debug("Thread stack region is %#lx-%#lx (U) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.esp);
else else
debug("Thread stack region is %#lx-%#lx (K) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.esp); debug("Thread stack region is %#lx-%#lx (K) and rsp is %#lx", Thread->Stack->GetStackBottom(), Thread->Stack->GetStackTop(), Thread->Registers.esp);
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
debug("Created thread \"%s\"(%d) in process \"%s\"(%d)", debug("Created thread \"%s\"(%d) in process \"%s\"(%d)",
Thread->Name, Thread->ID, Thread->Name, Thread->ID,
@ -669,18 +669,18 @@ namespace Tasking
case TaskTrustLevel::Kernel: case TaskTrustLevel::Kernel:
{ {
SecurityManager.TrustToken(Process->Security.UniqueToken, TTL::TrustedByKernel); SecurityManager.TrustToken(Process->Security.UniqueToken, TTL::TrustedByKernel);
#if defined(__amd64__) #if defined(a64)
if (!DoNotCreatePageTable) if (!DoNotCreatePageTable)
Process->PageTable = (Memory::PageTable4 *)CPU::x64::readcr3().raw; Process->PageTable = (Memory::PageTable4 *)CPU::x64::readcr3().raw;
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
break; break;
} }
case TaskTrustLevel::User: case TaskTrustLevel::User:
{ {
SecurityManager.TrustToken(Process->Security.UniqueToken, TTL::Untrusted); SecurityManager.TrustToken(Process->Security.UniqueToken, TTL::Untrusted);
#if defined(__amd64__) #if defined(a64)
if (!DoNotCreatePageTable) if (!DoNotCreatePageTable)
{ {
Process->PageTable = (Memory::PageTable4 *)KernelAllocator.RequestPages(TO_PAGES(PAGE_SIZE)); Process->PageTable = (Memory::PageTable4 *)KernelAllocator.RequestPages(TO_PAGES(PAGE_SIZE));
@ -688,8 +688,8 @@ namespace Tasking
for (size_t i = 0; i < TO_PAGES(PAGE_SIZE); i++) for (size_t i = 0; i < TO_PAGES(PAGE_SIZE); i++)
Memory::Virtual(Process->PageTable).Map((void *)Process->PageTable, (void *)Process->PageTable, Memory::PTFlag::RW); // Make sure the page table is mapped. Memory::Virtual(Process->PageTable).Map((void *)Process->PageTable, (void *)Process->PageTable, Memory::PTFlag::RW); // Make sure the page table is mapped.
} }
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
break; break;
} }
@ -740,20 +740,20 @@ namespace Tasking
Task::Task(const IP EntryPoint) : Interrupts::Handler(CPU::x86::IRQ16) Task::Task(const IP EntryPoint) : Interrupts::Handler(CPU::x86::IRQ16)
{ {
SmartCriticalSection(TaskingLock); SmartCriticalSection(TaskingLock);
#if defined(__amd64__) #if defined(a64)
// Map the IRQ16 to the first CPU. // Map the IRQ16 to the first CPU.
((APIC::APIC *)Interrupts::apic[0])->RedirectIRQ(0, CPU::x86::IRQ16 - CPU::x86::IRQ0, 1); ((APIC::APIC *)Interrupts::apic[0])->RedirectIRQ(0, CPU::x86::IRQ16 - CPU::x86::IRQ0, 1);
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
KPrint("Starting Tasking With Instruction Pointer: %p (\e666666%s\eCCCCCC)", EntryPoint, KernelSymbolTable->GetSymbolFromAddress(EntryPoint)); KPrint("Starting Tasking With Instruction Pointer: %p (\e666666%s\eCCCCCC)", EntryPoint, KernelSymbolTable->GetSymbolFromAddress(EntryPoint));
TaskingLock.Unlock(); TaskingLock.Unlock();
#if defined(__amd64__) #if defined(a64)
TaskArchitecture Arch = TaskArchitecture::x64; TaskArchitecture Arch = TaskArchitecture::x64;
#elif defined(__i386__) #elif defined(a32)
TaskArchitecture Arch = TaskArchitecture::x32; TaskArchitecture Arch = TaskArchitecture::x32;
#elif defined(__aarch64__) #elif defined(aa64)
TaskArchitecture Arch = TaskArchitecture::ARM64; TaskArchitecture Arch = TaskArchitecture::ARM64;
#endif #endif
PCB *kproc = CreateProcess(nullptr, "Kernel", TaskTrustLevel::Kernel); PCB *kproc = CreateProcess(nullptr, "Kernel", TaskTrustLevel::Kernel);
@ -765,12 +765,12 @@ namespace Tasking
bool MONITORSupported = false; bool MONITORSupported = false;
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -779,12 +779,12 @@ namespace Tasking
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -817,7 +817,7 @@ namespace Tasking
IdleThread->Info.Affinity[i] = true; IdleThread->Info.Affinity[i] = true;
} }
debug("Tasking Started"); debug("Tasking Started");
#if defined(__amd64__) #if defined(a64)
((APIC::Timer *)Interrupts::apicTimer[0])->OneShot(CPU::x86::IRQ16, 100); ((APIC::Timer *)Interrupts::apicTimer[0])->OneShot(CPU::x86::IRQ16, 100);
/* FIXME: The kernel is not ready for multi-core tasking. */ /* FIXME: The kernel is not ready for multi-core tasking. */
@ -829,8 +829,8 @@ namespace Tasking
// icr.Level = APIC::APICLevel::Assert; // icr.Level = APIC::APICLevel::Assert;
// ((APIC::APIC *)Interrupts::apic[0])->IPI(i, icr); // ((APIC::APIC *)Interrupts::apic[0])->IPI(i, icr);
// } // }
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} }

View File

@ -9,12 +9,12 @@ __constructor void TestRandom()
int RDRANDFlag = 0; int RDRANDFlag = 0;
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0) if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::AMD::CPUID0x1 cpuid1amd; CPU::x64::AMD::CPUID0x1 cpuid1amd;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::AMD::CPUID0x1 cpuid1amd; CPU::x32::AMD::CPUID0x1 cpuid1amd;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw) : "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -23,12 +23,12 @@ __constructor void TestRandom()
} }
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0) else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::Intel::CPUID0x1 cpuid1intel; CPU::x64::Intel::CPUID0x1 cpuid1intel;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::Intel::CPUID0x1 cpuid1intel; CPU::x32::Intel::CPUID0x1 cpuid1intel;
#endif #endif
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw) : "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
: "a"(0x1)); : "a"(0x1));
@ -39,7 +39,7 @@ __constructor void TestRandom()
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0) if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
RDRANDFlag = 0; RDRANDFlag = 0;
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
if (RDRANDFlag) if (RDRANDFlag)
{ {
uint64_t RDSEEDValue = 0; uint64_t RDSEEDValue = 0;

View File

@ -62,11 +62,11 @@ typedef struct
typedef struct typedef struct
{ {
#if defined(__amd64__) #if defined(a64)
Elf64_auxv_t archaux; Elf64_auxv_t archaux;
#elif defined(__i386__) #elif defined(a32)
Elf32_auxv_t archaux; Elf32_auxv_t archaux;
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} AuxiliaryVector; } AuxiliaryVector;

View File

@ -119,9 +119,9 @@ namespace CPU
{ {
do do
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("pause"); asmv("pause");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("yield"); asmv("yield");
#endif #endif
} while (Loop); } while (Loop);
@ -132,12 +132,12 @@ namespace CPU
*/ */
SafeFunction __noreturn __naked __used inline void Stop() SafeFunction __noreturn __naked __used inline void Stop()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("CPUStopLoop:\n" asmv("CPUStopLoop:\n"
"cli\n" "cli\n"
"hlt\n" "hlt\n"
"jmp CPUStopLoop"); "jmp CPUStopLoop");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("msr daifset, #2"); asmv("msr daifset, #2");
asmv("wfe"); asmv("wfe");
#endif #endif
@ -150,9 +150,9 @@ namespace CPU
{ {
do do
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("hlt"); asmv("hlt");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("wfe"); asmv("wfe");
#endif #endif
} while (Loop); } while (Loop);
@ -362,7 +362,7 @@ namespace CPU
*/ */
static inline void cpuid(uint32_t Function, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) static inline void cpuid(uint32_t Function, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
{ {
#if defined(__i386__) #if defined(a32)
asmv("cpuid" asmv("cpuid"
: "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
: "a"(Function)); : "a"(Function));
@ -377,7 +377,7 @@ namespace CPU
SafeFunction static inline void invlpg(void *Address) SafeFunction static inline void invlpg(void *Address)
{ {
#if defined(__i386__) #if defined(a32)
asmv("invlpg (%0)" asmv("invlpg (%0)"
: :
: "r"(Address) : "r"(Address)
@ -650,7 +650,7 @@ namespace CPU
SafeFunction static inline void lgdt(void *gdt) SafeFunction static inline void lgdt(void *gdt)
{ {
#if defined(__amd64__) #if defined(a64)
asmv("lgdt (%0)" asmv("lgdt (%0)"
: :
: "r"(gdt)); : "r"(gdt));
@ -659,7 +659,7 @@ namespace CPU
SafeFunction static inline void lidt(void *idt) SafeFunction static inline void lidt(void *idt)
{ {
#if defined(__amd64__) #if defined(a64)
asmv("lidt (%0)" asmv("lidt (%0)"
: :
: "r"(idt)); : "r"(idt));
@ -668,7 +668,7 @@ namespace CPU
SafeFunction static inline void ltr(uint16_t Segment) SafeFunction static inline void ltr(uint16_t Segment)
{ {
#if defined(__amd64__) #if defined(a64)
asmv("ltr %0" asmv("ltr %0"
: :
: "r"(Segment)); : "r"(Segment));
@ -677,7 +677,7 @@ namespace CPU
SafeFunction static inline void invlpg(void *Address) SafeFunction static inline void invlpg(void *Address)
{ {
#if defined(__amd64__) #if defined(a64)
asmv("invlpg (%0)" asmv("invlpg (%0)"
: :
: "r"(Address) : "r"(Address)
@ -696,7 +696,7 @@ namespace CPU
*/ */
SafeFunction static inline void cpuid(uint32_t Function, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) SafeFunction static inline void cpuid(uint32_t Function, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
{ {
#if defined(__amd64__) #if defined(a64)
asmv("cpuid" asmv("cpuid"
: "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
: "a"(Function)); : "a"(Function));
@ -719,7 +719,7 @@ namespace CPU
SafeFunction static inline void fxsave(void *FXSaveArea) SafeFunction static inline void fxsave(void *FXSaveArea)
{ {
#if defined(__amd64__) #if defined(a64)
if (!FXSaveArea || FXSaveArea >= (char *)0xfffffffffffff000) if (!FXSaveArea || FXSaveArea >= (char *)0xfffffffffffff000)
return; return;
@ -732,7 +732,7 @@ namespace CPU
SafeFunction static inline void fxrstor(void *FXRstorArea) SafeFunction static inline void fxrstor(void *FXRstorArea)
{ {
#if defined(__amd64__) #if defined(a64)
if (!FXRstorArea || FXRstorArea >= (char *)0xfffffffffffff000) if (!FXRstorArea || FXRstorArea >= (char *)0xfffffffffffff000)
return; return;

View File

@ -9,10 +9,10 @@ namespace CPU
{ {
SafeFunction static inline void Barrier() SafeFunction static inline void Barrier()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("" :: asmv("" ::
: "memory"); : "memory");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("dmb ish" :: asmv("dmb ish" ::
: "memory"); : "memory");
#endif #endif
@ -20,10 +20,10 @@ namespace CPU
SafeFunction static inline void Fence() SafeFunction static inline void Fence()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("mfence" :: asmv("mfence" ::
: "memory"); : "memory");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("dmb ish" :: asmv("dmb ish" ::
: "memory"); : "memory");
#endif #endif
@ -31,10 +31,10 @@ namespace CPU
SafeFunction static inline void StoreFence() SafeFunction static inline void StoreFence()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("sfence" :: asmv("sfence" ::
: "memory"); : "memory");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("dmb ishst" :: asmv("dmb ishst" ::
: "memory"); : "memory");
#endif #endif
@ -42,10 +42,10 @@ namespace CPU
SafeFunction static inline void LoadFence() SafeFunction static inline void LoadFence()
{ {
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
asmv("lfence" :: asmv("lfence" ::
: "memory"); : "memory");
#elif defined(__aarch64__) #elif defined(aa64)
asmv("dmb ishld" :: asmv("dmb ishld" ::
: "memory"); : "memory");
#endif #endif

View File

@ -134,6 +134,87 @@ namespace CPU
}; };
uint32_t raw; uint32_t raw;
} CR8; } CR8;
#if defined(a32)
SafeFunction static inline CR0 readcr0()
{
uint32_t Result = 0;
asmv("mov %%cr0, %[Result]"
: [Result] "=q"(Result));
return (CR0){.raw = Result};
}
SafeFunction static inline CR2 readcr2()
{
uint32_t Result = 0;
asmv("mov %%cr2, %[Result]"
: [Result] "=q"(Result));
return (CR2){.raw = Result};
}
SafeFunction static inline CR3 readcr3()
{
uint32_t Result = 0;
asmv("mov %%cr3, %[Result]"
: [Result] "=q"(Result));
return (CR3){.raw = Result};
}
SafeFunction static inline CR4 readcr4()
{
uint32_t Result = 0;
asmv("mov %%cr4, %[Result]"
: [Result] "=q"(Result));
return (CR4){.raw = Result};
}
SafeFunction static inline CR8 readcr8()
{
uint32_t Result = 0;
asmv("mov %%cr8, %[Result]"
: [Result] "=q"(Result));
return (CR8){.raw = Result};
}
SafeFunction static inline void writecr0(CR0 ControlRegister)
{
asmv("mov %[ControlRegister], %%cr0"
:
: [ControlRegister] "q"(ControlRegister.raw)
: "memory");
}
SafeFunction static inline void writecr2(CR2 ControlRegister)
{
asmv("mov %[ControlRegister], %%cr2"
:
: [ControlRegister] "q"(ControlRegister.raw)
: "memory");
}
SafeFunction static inline void writecr3(CR3 ControlRegister)
{
asmv("mov %[ControlRegister], %%cr3"
:
: [ControlRegister] "q"(ControlRegister.raw)
: "memory");
}
SafeFunction static inline void writecr4(CR4 ControlRegister)
{
asmv("mov %[ControlRegister], %%cr4"
:
: [ControlRegister] "q"(ControlRegister.raw)
: "memory");
}
SafeFunction static inline void writecr8(CR8 ControlRegister)
{
asmv("mov %[ControlRegister], %%cr8"
:
: [ControlRegister] "q"(ControlRegister.raw)
: "memory");
}
#endif
} }
} }

View File

@ -7,7 +7,402 @@ namespace CPU
{ {
namespace x32 namespace x32
{ {
enum MSRID
{
MSR_MONITOR_FILTER_SIZE = 0x6,
MSR_TIME_STAMP_COUNTER = 0x10,
MSR_PLATFORM_ID = 0x17,
MSR_APIC_BASE = 0x1B,
MSR_FEATURE_CONTROL = 0x3A,
MSR_TSC_ADJUST = 0x3B,
MSR_SPEC_CTRL = 0x48,
MSR_PRED_CMD = 0x49,
MSR_BIOS_UPDT_TRIG = 0x79,
MSR_BIOS_SIGN_ID = 0x8B,
MSR_SGXLEPUBKEYHASH0 = 0x8C,
MSR_SGXLEPUBKEYHASH1 = 0x8D,
MSR_SGXLEPUBKEYHASH2 = 0x8E,
MSR_SGXLEPUBKEYHASH3 = 0x8F,
MSR_SMM_MONITOR_CTL = 0x9B,
MSR_SMBASE = 0x9E,
MSR_PMC0 = 0xC1,
MSR_PMC1 = 0xC2,
MSR_PMC2 = 0xC3,
MSR_PMC3 = 0xC4,
MSR_PMC4 = 0xC5,
MSR_PMC5 = 0xC6,
MSR_PMC6 = 0xC7,
MSR_PMC7 = 0xC8,
MSR_UMWAIT_CONTROL = 0xE1,
MSR_MPERF = 0xE7,
MSR_APERF = 0xE8,
MSR_MTRRCAP = 0xFE,
MSR_ARCH_CAPABILITIES = 0x10A,
MSR_FLUSH_CMD = 0x10B,
MSR_SYSENTER_CS = 0x17A,
MSR_SYSENTER_ESP = 0x175,
MSR_SYSENTER_EIP = 0x176,
MSR_MCG_CAP = 0x179,
MSR_MCG_STATUS = 0x17A,
MSR_MCG_CTL = 0x17B,
MSR_PERFEVTSEL0 = 0x186,
MSR_PERFEVTSEL1 = 0x187,
MSR_PERFEVTSEL2 = 0x188,
MSR_PERFEVTSEL3 = 0x189,
MSR_PERF_STATUS = 0x198,
MSR_PERF_CTL = 0x199,
MSR_CLOCK_MODULATION = 0x19A,
MSR_THERM_INTERRUPT = 0x19B,
MSR_THERM_STATUS = 0x19C,
MSR_MISC_ENABLE = 0x1A0,
MSR_ENERGY_PERF_BIAS = 0x1B0,
MSR_PACKAGE_THERM_STATUS = 0x1B1,
MSR_PACKAGE_THERM_INTERRUPT = 0x1B2,
MSR_DEBUGCTL = 0x1D9,
MSR_SMRR_PHYSBASE = 0x1F2,
MSR_SMRR_PHYSMASK = 0x1F3,
MSR_PLATFORM_DCA_CAP = 0x1F8,
MSR_CPU_DCA_CAP = 0x1F9,
MSR_DCA_0_CAP = 0x1FA,
MSR_MTRR_PHYSBASE0 = 0x200,
MSR_MTRR_PHYSMASK0 = 0x201,
MSR_MTRR_PHYSBASE1 = 0x202,
MSR_MTRR_PHYSMASK1 = 0x203,
MSR_MTRR_PHYSBASE2 = 0x204,
MSR_MTRR_PHYSMASK2 = 0x205,
MSR_MTRR_PHYSBASE3 = 0x206,
MSR_MTRR_PHYSMASK3 = 0x207,
MSR_MTRR_PHYSBASE4 = 0x208,
MSR_MTRR_PHYSMASK4 = 0x209,
MSR_MTRR_PHYSBASE5 = 0x20A,
MSR_MTRR_PHYSMASK5 = 0x20B,
MSR_MTRR_PHYSBASE6 = 0x20C,
MSR_MTRR_PHYSMASK6 = 0x20D,
MSR_MTRR_PHYSBASE7 = 0x20E,
MSR_MTRR_PHYSMASK7 = 0x20F,
MSR_MTRR_PHYSBASE8 = 0x210,
MSR_MTRR_PHYSMASK8 = 0x211,
MSR_MTRR_PHYSBASE9 = 0x212,
MSR_MTRR_PHYSMASK9 = 0x213,
MSR_MTRR_FIX64K_00000 = 0x250,
MSR_MTRR_FIX16K_80000 = 0x258,
MSR_MTRR_FIX16K_A0000 = 0x259,
MSR_MTRR_FIX4K_C0000 = 0x268,
MSR_MTRR_FIX4K_C8000 = 0x269,
MSR_MTRR_FIX4K_D0000 = 0x26A,
MSR_MTRR_FIX4K_D8000 = 0x26B,
MSR_MTRR_FIX4K_E0000 = 0x26C,
MSR_MTRR_FIX4K_E8000 = 0x26D,
MSR_MTRR_FIX4K_F0000 = 0x26E,
MSR_MTRR_FIX4K_F8000 = 0x26F,
MSR_PAT = 0x277,
MSR_MC0_CTL2 = 0x280,
MSR_MC1_CTL2 = 0x281,
MSR_MC2_CTL2 = 0x282,
MSR_MC3_CTL2 = 0x283,
MSR_MC4_CTL2 = 0x284,
MSR_MC5_CTL2 = 0x285,
MSR_MC6_CTL2 = 0x286,
MSR_MC7_CTL2 = 0x287,
MSR_MC8_CTL2 = 0x288,
MSR_MC9_CTL2 = 0x289,
MSR_MC10_CTL2 = 0x28A,
MSR_MC11_CTL2 = 0x28B,
MSR_MC12_CTL2 = 0x28C,
MSR_MC13_CTL2 = 0x28D,
MSR_MC14_CTL2 = 0x28E,
MSR_MC15_CTL2 = 0x28F,
MSR_MC16_CTL2 = 0x290,
MSR_MC17_CTL2 = 0x291,
MSR_MC18_CTL2 = 0x292,
MSR_MC19_CTL2 = 0x293,
MSR_MC20_CTL2 = 0x294,
MSR_MC21_CTL2 = 0x295,
MSR_MC22_CTL2 = 0x296,
MSR_MC23_CTL2 = 0x297,
MSR_MC24_CTL2 = 0x298,
MSR_MC25_CTL2 = 0x299,
MSR_MC26_CTL2 = 0x29A,
MSR_MC27_CTL2 = 0x29B,
MSR_MC28_CTL2 = 0x29C,
MSR_MC29_CTL2 = 0x29D,
MSR_MC30_CTL2 = 0x29E,
MSR_MC31_CTL2 = 0x29F,
MSR_MTRR_DEF_TYPE = 0x2FF,
MSR_FIXED_CTR0 = 0x309,
MSR_FIXED_CTR1 = 0x30A,
MSR_FIXED_CTR2 = 0x30B,
MSR_PERF_CAPABILITIES = 0x345,
MSR_FIXED_CTR_CTRL = 0x38D,
MSR_PERF_GLOBAL_STATUS = 0x38E,
MSR_PERF_GLOBAL_CTRL = 0x38F,
MSR_PERF_GLOBAL_STATUS_RESET = 0x390,
MSR_PERF_GLOBAL_STATUS_SET = 0x391,
MSR_PERF_GLOBAL_INUSE = 0x392,
MSR_PEBS_ENABLE = 0x3F1,
MSR_MC0_CTL = 0x400,
MSR_MC0_STATUS = 0x401,
MSR_MC0_ADDR = 0x402,
MSR_MC0_MISC = 0x403,
MSR_MC1_CTL = 0x404,
MSR_MC1_STATUS = 0x405,
MSR_MC1_ADDR = 0x406,
MSR_MC1_MISC = 0x407,
MSR_MC2_CTL = 0x408,
MSR_MC2_STATUS = 0x409,
MSR_MC2_ADDR = 0x40A,
MSR_MC2_MISC = 0x40B,
MSR_MC3_CTL = 0x40C,
MSR_MC3_STATUS = 0x40D,
MSR_MC3_ADDR = 0x40E,
MSR_MC3_MISC = 0x40F,
MSR_MC4_CTL = 0x410,
MSR_MC4_STATUS = 0x411,
MSR_MC4_ADDR = 0x412,
MSR_MC4_MISC = 0x413,
MSR_MC5_CTL = 0x414,
MSR_MC5_STATUS = 0x415,
MSR_MC5_ADDR = 0x416,
MSR_MC5_MISC = 0x417,
MSR_MC6_CTL = 0x418,
MSR_MC6_STATUS = 0x419,
MSR_MC6_ADDR = 0x41A,
MSR_MC6_MISC = 0x41B,
MSR_MC7_CTL = 0x41C,
MSR_MC7_STATUS = 0x41D,
MSR_MC7_ADDR = 0x41E,
MSR_MC7_MISC = 0x41F,
MSR_MC8_CTL = 0x420,
MSR_MC8_STATUS = 0x421,
MSR_MC8_ADDR = 0x422,
MSR_MC8_MISC = 0x423,
MSR_MC9_CTL = 0x424,
MSR_MC9_STATUS = 0x425,
MSR_MC9_ADDR = 0x426,
MSR_MC9_MISC = 0x427,
MSR_MC10_CTL = 0x428,
MSR_MC10_STATUS = 0x429,
MSR_MC10_ADDR = 0x42A,
MSR_MC10_MISC = 0x42B,
MSR_MC11_CTL = 0x42C,
MSR_MC11_STATUS = 0x42D,
MSR_MC11_ADDR = 0x42E,
MSR_MC11_MISC = 0x42F,
MSR_MC12_CTL = 0x430,
MSR_MC12_STATUS = 0x431,
MSR_MC12_ADDR = 0x432,
MSR_MC12_MISC = 0x433,
MSR_MC13_CTL = 0x434,
MSR_MC13_STATUS = 0x435,
MSR_MC13_ADDR = 0x436,
MSR_MC13_MISC = 0x437,
MSR_MC14_CTL = 0x438,
MSR_MC14_STATUS = 0x439,
MSR_MC14_ADDR = 0x43A,
MSR_MC14_MISC = 0x43B,
MSR_MC15_CTL = 0x43C,
MSR_MC15_STATUS = 0x43D,
MSR_MC15_ADDR = 0x43E,
MSR_MC15_MISC = 0x43F,
MSR_MC16_CTL = 0x440,
MSR_MC16_STATUS = 0x441,
MSR_MC16_ADDR = 0x442,
MSR_MC16_MISC = 0x443,
MSR_MC17_CTL = 0x444,
MSR_MC17_STATUS = 0x445,
MSR_MC17_ADDR = 0x446,
MSR_MC17_MISC = 0x447,
MSR_MC18_CTL = 0x448,
MSR_MC18_STATUS = 0x449,
MSR_MC18_ADDR = 0x44A,
MSR_MC18_MISC = 0x44B,
MSR_MC19_CTL = 0x44C,
MSR_MC19_STATUS = 0x44D,
MSR_MC19_ADDR = 0x44E,
MSR_MC19_MISC = 0x44F,
MSR_MC20_CTL = 0x450,
MSR_MC20_STATUS = 0x451,
MSR_MC20_ADDR = 0x452,
MSR_MC20_MISC = 0x453,
MSR_MC21_CTL = 0x454,
MSR_MC21_STATUS = 0x455,
MSR_MC21_ADDR = 0x456,
MSR_MC21_MISC = 0x457,
MSR_MC22_CTL = 0x458,
MSR_MC22_STATUS = 0x459,
MSR_MC22_ADDR = 0x45A,
MSR_MC22_MISC = 0x45B,
MSR_MC23_CTL = 0x45C,
MSR_MC23_STATUS = 0x45D,
MSR_MC23_ADDR = 0x45E,
MSR_MC23_MISC = 0x45F,
MSR_MC24_CTL = 0x460,
MSR_MC24_STATUS = 0x461,
MSR_MC24_ADDR = 0x462,
MSR_MC24_MISC = 0x463,
MSR_MC25_CTL = 0x464,
MSR_MC25_STATUS = 0x465,
MSR_MC25_ADDR = 0x466,
MSR_MC25_MISC = 0x467,
MSR_MC26_CTL = 0x468,
MSR_MC26_STATUS = 0x469,
MSR_MC26_ADDR = 0x46A,
MSR_MC26_MISC = 0x46B,
MSR_MC27_CTL = 0x46C,
MSR_MC27_STATUS = 0x46D,
MSR_MC27_ADDR = 0x46E,
MSR_MC27_MISC = 0x46F,
MSR_MC28_CTL = 0x470,
MSR_MC28_STATUS = 0x471,
MSR_MC28_ADDR = 0x472,
MSR_MC28_MISC = 0x473,
MSR_VMX_BASIC = 0x480,
MSR_VMX_PINBASED_CTLS = 0x481,
MSR_VMX_PROCBASED_CTLS = 0x482,
MSR_VMX_EXIT_CTLS = 0x483,
MSR_VMX_ENTRY_CTLS = 0x484,
MSR_VMX_MISC = 0x485,
MSR_VMX_CR0_FIXED0 = 0x486,
MSR_VMX_CR0_FIXED1 = 0x487,
MSR_VMX_CR4_FIXED0 = 0x488,
MSR_VMX_CR4_FIXED1 = 0x489,
MSR_VMX_VMCS_ENUM = 0x48A,
MSR_VMX_PROCBASED_CTLS2 = 0x48B,
MSR_VMX_EPT_VPID_CAP = 0x48C,
MSR_VMX_TRUE_PINBASED_CTLS = 0x48D,
MSR_VMX_TRUE_PROCBASED_CTLS = 0x48E,
MSR_VMX_TRUE_EXIT_CTLS = 0x48F,
MSR_VMX_TRUE_ENTRY_CTLS = 0x490,
MSR_VMX_VMFUNC = 0x491,
MSR_A_PMC0 = 0x4C1,
MSR_A_PMC1 = 0x4C2,
MSR_A_PMC2 = 0x4C3,
MSR_A_PMC3 = 0x4C4,
MSR_A_PMC4 = 0x4C5,
MSR_A_PMC5 = 0x4C6,
MSR_A_PMC6 = 0x4C7,
MSR_A_PMC7 = 0x4C8,
MSR_MCG_EXT_CTL = 0x4D0,
MSR_SGX_SVN_STATUS = 0x500,
MSR_RTIT_OUTPUT_BASE = 0x560,
MSR_RTIT_OUTPUT_MASK_PTRS = 0x561,
MSR_RTIT_CTL = 0x570,
MSR_RTIT_STATUS = 0x571,
MSR_RTIT_CR3_MATCH = 0x572,
MSR_RTIT_ADDR0_A = 0x580,
MSR_RTIT_ADDR0_B = 0x581,
MSR_RTIT_ADDR1_A = 0x582,
MSR_RTIT_ADDR1_B = 0x583,
MSR_RTIT_ADDR2_A = 0x584,
MSR_RTIT_ADDR2_B = 0x585,
MSR_RTIT_ADDR3_A = 0x586,
MSR_RTIT_ADDR3_B = 0x587,
MSR_DS_AREA = 0x600,
MSR_TSC_DEADLINE = 0x6E0,
MSR_PM_ENABLE = 0x770,
MSR_HWP_CAPABILITIES = 0x771,
MSR_HWP_REQUEST_PKG = 0x772,
MSR_HWP_INTERRUPT = 0x773,
MSR_HWP_REQUEST = 0x774,
MSR_HWP_STATUS = 0x777,
MSR_X2APIC_APICID = 0x802,
MSR_X2APIC_VERSION = 0x803,
MSR_X2APIC_TPR = 0x808,
MSR_X2APIC_PPR = 0x80A,
MSR_X2APIC_EOI = 0x80B,
MSR_X2APIC_LDR = 0x80D,
MSR_X2APIC_SIVR = 0x80F,
MSR_X2APIC_ISR0 = 0x810,
MSR_X2APIC_ISR1 = 0x811,
MSR_X2APIC_ISR2 = 0x812,
MSR_X2APIC_ISR3 = 0x813,
MSR_X2APIC_ISR4 = 0x814,
MSR_X2APIC_ISR5 = 0x815,
MSR_X2APIC_ISR6 = 0x816,
MSR_X2APIC_ISR7 = 0x817,
MSR_X2APIC_TMR0 = 0x818,
MSR_X2APIC_TMR1 = 0x819,
MSR_X2APIC_TMR2 = 0x81A,
MSR_X2APIC_TMR3 = 0x81B,
MSR_X2APIC_TMR4 = 0x81C,
MSR_X2APIC_TMR5 = 0x81D,
MSR_X2APIC_TMR6 = 0x81E,
MSR_X2APIC_TMR7 = 0x81F,
MSR_X2APIC_IRR0 = 0x820,
MSR_X2APIC_IRR1 = 0x821,
MSR_X2APIC_IRR2 = 0x822,
MSR_X2APIC_IRR3 = 0x823,
MSR_X2APIC_IRR4 = 0x824,
MSR_X2APIC_IRR5 = 0x825,
MSR_X2APIC_IRR6 = 0x826,
MSR_X2APIC_IRR7 = 0x827,
MSR_X2APIC_ESR = 0x828,
MSR_X2APIC_LVT_CMCI = 0x82F,
MSR_X2APIC_ICR = 0x830,
MSR_X2APIC_LVT_TIMER = 0x832,
MSR_X2APIC_LVT_THERMAL = 0x833,
MSR_X2APIC_LVT_PMI = 0x834,
MSR_X2APIC_LVT_LINT0 = 0x835,
MSR_X2APIC_LVT_LINT1 = 0x836,
MSR_X2APIC_LVT_ERROR = 0x837,
MSR_X2APIC_INIT_COUNT = 0x838,
MSR_X2APIC_CUR_COUNT = 0x839,
MSR_X2APIC_DIV_CONF = 0x83E,
MSR_X2APIC_SELF_IPI = 0x83F,
MSR_DEBUG_INTERFACE = 0xC80,
MSR_L3_QOS_CFG = 0xC81,
MSR_L2_QOS_CFG = 0xC82,
MSR_QM_EVTSEL = 0xC8D,
MSR_QM_CTR = 0xC8E,
MSR_PQR_ASSOC = 0xC8F,
MSR_L3_MASK_0 = 0xC90,
MSR_L2_MASK_0 = 0xD10,
MSR_BNDCFGS = 0xD90,
MSR_XSS = 0xDA0,
MSR_PKG_HDC_CTL = 0xDB0,
MSR_PM_CTL1 = 0xDB1,
MSR_THREAD_STALL = 0xDB2,
/** @brief Extended Feature Enable Register (0xc0000080) */
MSR_EFER = 0xC0000080,
/** @brief legacy SYSCALL (0xC0000081) */
MSR_STAR = 0xC0000081,
/** @brief 64bit SYSCALL (0xC0000082) */
MSR_LSTAR = 0xC0000082,
/** @brief compatibility mode SYSCALL (0xC0000083) */
MSR_CSTAR = 0xC0000083,
/** @brief EFLAGS mask for syscall (0xC0000084) */
MSR_SYSCALL_MASK = 0xC0000084,
/** @brief 64bit FS base (0xC0000100) */
MSR_FS_BASE = 0xC0000100,
/** @brief 64bit GS base (0xC0000101) */
MSR_GS_BASE = 0xC0000101,
/** @brief SwapGS GS shadow (0xC0000102) */
MSR_SHADOW_GS_BASE = 0xC0000102,
/** @brief Auxiliary TSC (0xC0000103) */
MSR_TSC_AUX = 0xC0000103,
MSR_CR_PAT = 0x00000277,
};
#if defined(a32)
SafeFunction static inline uint64_t rdmsr(uint32_t msr)
{
uint32_t Low, High;
asmv("rdmsr"
: "=a"(Low), "=d"(High)
: "c"(msr)
: "memory");
return ((uint64_t)Low) | (((uint64_t)High) << 32);
}
SafeFunction static inline void wrmsr(uint32_t msr, uint64_t Value)
{
uint32_t Low = Value, High = Value >> 32;
asmv("wrmsr"
:
: "c"(msr), "a"(Low), "d"(High)
: "memory");
}
#endif
} }
} }

View File

@ -172,127 +172,105 @@ namespace CPU
uint64_t raw; uint64_t raw;
} XCR0; } XCR0;
#if defined(a64)
SafeFunction static inline CR0 readcr0() SafeFunction static inline CR0 readcr0()
{ {
uint64_t Result = 0; uint64_t Result = 0;
#if defined(__amd64__)
asmv("mov %%cr0, %[Result]" asmv("mov %%cr0, %[Result]"
: [Result] "=q"(Result)); : [Result] "=q"(Result));
#endif
return (CR0){.raw = Result}; return (CR0){.raw = Result};
} }
SafeFunction static inline CR2 readcr2() SafeFunction static inline CR2 readcr2()
{ {
uint64_t Result = 0; uint64_t Result = 0;
#if defined(__amd64__)
asmv("mov %%cr2, %[Result]" asmv("mov %%cr2, %[Result]"
: [Result] "=q"(Result)); : [Result] "=q"(Result));
#endif
return (CR2){.raw = Result}; return (CR2){.raw = Result};
} }
SafeFunction static inline CR3 readcr3() SafeFunction static inline CR3 readcr3()
{ {
uint64_t Result = 0; uint64_t Result = 0;
#if defined(__amd64__)
asmv("mov %%cr3, %[Result]" asmv("mov %%cr3, %[Result]"
: [Result] "=q"(Result)); : [Result] "=q"(Result));
#endif
return (CR3){.raw = Result}; return (CR3){.raw = Result};
} }
SafeFunction static inline CR4 readcr4() SafeFunction static inline CR4 readcr4()
{ {
uint64_t Result = 0; uint64_t Result = 0;
#if defined(__amd64__)
asmv("mov %%cr4, %[Result]" asmv("mov %%cr4, %[Result]"
: [Result] "=q"(Result)); : [Result] "=q"(Result));
#endif
return (CR4){.raw = Result}; return (CR4){.raw = Result};
} }
SafeFunction static inline CR8 readcr8() SafeFunction static inline CR8 readcr8()
{ {
uint64_t Result = 0; uint64_t Result = 0;
#if defined(__amd64__)
asmv("mov %%cr8, %[Result]" asmv("mov %%cr8, %[Result]"
: [Result] "=q"(Result)); : [Result] "=q"(Result));
#endif
return (CR8){.raw = Result}; return (CR8){.raw = Result};
} }
SafeFunction static inline XCR0 readxcr0() SafeFunction static inline XCR0 readxcr0()
{ {
uint64_t Result = 0; uint64_t Result = 0;
#if defined(__amd64__)
asmv("xgetbv" asmv("xgetbv"
: "=a"(Result) : "=a"(Result)
: "c"(0) : "c"(0)
: "edx"); : "edx");
#endif
return (XCR0){.raw = Result}; return (XCR0){.raw = Result};
} }
SafeFunction static inline void writecr0(CR0 ControlRegister) SafeFunction static inline void writecr0(CR0 ControlRegister)
{ {
#if defined(__amd64__)
asmv("mov %[ControlRegister], %%cr0" asmv("mov %[ControlRegister], %%cr0"
: :
: [ControlRegister] "q"(ControlRegister.raw) : [ControlRegister] "q"(ControlRegister.raw)
: "memory"); : "memory");
#endif
} }
SafeFunction static inline void writecr2(CR2 ControlRegister) SafeFunction static inline void writecr2(CR2 ControlRegister)
{ {
#if defined(__amd64__)
asmv("mov %[ControlRegister], %%cr2" asmv("mov %[ControlRegister], %%cr2"
: :
: [ControlRegister] "q"(ControlRegister.raw) : [ControlRegister] "q"(ControlRegister.raw)
: "memory"); : "memory");
#endif
} }
SafeFunction static inline void writecr3(CR3 ControlRegister) SafeFunction static inline void writecr3(CR3 ControlRegister)
{ {
#if defined(__amd64__)
asmv("mov %[ControlRegister], %%cr3" asmv("mov %[ControlRegister], %%cr3"
: :
: [ControlRegister] "q"(ControlRegister.raw) : [ControlRegister] "q"(ControlRegister.raw)
: "memory"); : "memory");
#endif
} }
SafeFunction static inline void writecr4(CR4 ControlRegister) SafeFunction static inline void writecr4(CR4 ControlRegister)
{ {
#if defined(__amd64__)
asmv("mov %[ControlRegister], %%cr4" asmv("mov %[ControlRegister], %%cr4"
: :
: [ControlRegister] "q"(ControlRegister.raw) : [ControlRegister] "q"(ControlRegister.raw)
: "memory"); : "memory");
#endif
} }
SafeFunction static inline void writecr8(CR8 ControlRegister) SafeFunction static inline void writecr8(CR8 ControlRegister)
{ {
#if defined(__amd64__)
asmv("mov %[ControlRegister], %%cr8" asmv("mov %[ControlRegister], %%cr8"
: :
: [ControlRegister] "q"(ControlRegister.raw) : [ControlRegister] "q"(ControlRegister.raw)
: "memory"); : "memory");
#endif
} }
SafeFunction static inline void writexcr0(XCR0 ControlRegister) SafeFunction static inline void writexcr0(XCR0 ControlRegister)
{ {
#if defined(__amd64__)
asmv("xsetbv" asmv("xsetbv"
: :
: "a"(ControlRegister.raw), "c"(0) : "a"(ControlRegister.raw), "c"(0)
: "edx"); : "edx");
#endif
} }
#endif
} }
} }

View File

@ -384,28 +384,26 @@ namespace CPU
MSR_CR_PAT_RESET = 0x0007040600070406ULL MSR_CR_PAT_RESET = 0x0007040600070406ULL
}; };
#if defined(a64)
SafeFunction static inline uint64_t rdmsr(uint32_t msr) SafeFunction static inline uint64_t rdmsr(uint32_t msr)
{ {
uint32_t Low, High; uint32_t Low, High;
#if defined(__amd64__)
asmv("rdmsr" asmv("rdmsr"
: "=a"(Low), "=d"(High) : "=a"(Low), "=d"(High)
: "c"(msr) : "c"(msr)
: "memory"); : "memory");
#endif
return ((uint64_t)Low) | (((uint64_t)High) << 32); return ((uint64_t)Low) | (((uint64_t)High) << 32);
} }
SafeFunction static inline void wrmsr(uint32_t msr, uint64_t Value) SafeFunction static inline void wrmsr(uint32_t msr, uint64_t Value)
{ {
uint32_t Low = Value, High = Value >> 32; uint32_t Low = Value, High = Value >> 32;
#if defined(__amd64__)
asmv("wrmsr" asmv("wrmsr"
: :
: "c"(msr), "a"(Low), "d"(High) : "c"(msr), "a"(Low), "d"(High)
: "memory"); : "memory");
#endif
} }
#endif
} }
} }

View File

@ -33,11 +33,11 @@ namespace Driver
void *Handle; void *Handle;
void *Data; void *Data;
#if defined(__amd64__) #if defined(a64)
void OnInterruptReceived(CPU::x64::TrapFrame *Frame); void OnInterruptReceived(CPU::x64::TrapFrame *Frame);
#elif defined(__i386__) #elif defined(a32)
void OnInterruptReceived(void *Frame); void OnInterruptReceived(CPU::x32::TrapFrame *Frame);
#elif defined(__aarch64__) #elif defined(aa64)
void OnInterruptReceived(void *Frame); void OnInterruptReceived(void *Frame);
#endif #endif

View File

@ -12,13 +12,13 @@ namespace Interrupts
#define INT_FRAMES_MAX 8 #define INT_FRAMES_MAX 8
#endif #endif
#if defined(__amd64__) #if defined(a64)
/* APIC::APIC */ extern void *apic[256]; // MAX_CPU /* APIC::APIC */ extern void *apic[256]; // MAX_CPU
/* APIC::Timer */ extern void *apicTimer[256]; // MAX_CPU /* APIC::Timer */ extern void *apicTimer[256]; // MAX_CPU
#elif defined(__i386__) #elif defined(a32)
/* APIC::APIC */ extern void *apic[256]; // MAX_CPU /* APIC::APIC */ extern void *apic[256]; // MAX_CPU
/* APIC::Timer */ extern void *apicTimer[256]; // MAX_CPU /* APIC::Timer */ extern void *apicTimer[256]; // MAX_CPU
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
extern void *InterruptFrames[INT_FRAMES_MAX]; extern void *InterruptFrames[INT_FRAMES_MAX];
@ -39,11 +39,11 @@ namespace Interrupts
~Handler(); ~Handler();
public: public:
#if defined(__amd64__) #if defined(a64)
virtual void OnInterruptReceived(CPU::x64::TrapFrame *Frame); virtual void OnInterruptReceived(CPU::x64::TrapFrame *Frame);
#elif defined(__i386__) #elif defined(a32)
virtual void OnInterruptReceived(void *Frame); virtual void OnInterruptReceived(CPU::x32::TrapFrame *Frame);
#elif defined(__aarch64__) #elif defined(aa64)
virtual void OnInterruptReceived(void *Frame); virtual void OnInterruptReceived(void *Frame);
#endif #endif
}; };

View File

@ -3,7 +3,7 @@
#include <types.h> #include <types.h>
#if defined(__amd64__) || defined(__i386__) #if defined(a64) || defined(a32)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
@ -215,6 +215,6 @@ extern "C"
#define outw(Port, Data) outportw(Port, Data) #define outw(Port, Data) outportw(Port, Data)
#define outl(Port, Data) outportl(Port, Data) #define outl(Port, Data) outportl(Port, Data)
#endif // defined(__amd64__) || defined(__i386__) #endif // defined(a64) || defined(a32)
#endif // !__FENNIX_KERNEL_IO_H__ #endif // !__FENNIX_KERNEL_IO_H__

View File

@ -46,22 +46,19 @@ extern uintptr_t _kernel_text_end, _kernel_data_end, _kernel_rodata_end;
// From pages // From pages
#define FROM_PAGES(d) ((d)*PAGE_SIZE - 1) #define FROM_PAGES(d) ((d)*PAGE_SIZE - 1)
#if defined(a64) || defined(aa64)
#define NORMAL_VMA_OFFSET 0xFFFF800000000000 #define NORMAL_VMA_OFFSET 0xFFFF800000000000
#define KERNEL_VMA_OFFSET 0xFFFFFFFF80000000 #define KERNEL_VMA_OFFSET 0xFFFFFFFF80000000
/**
* @brief KERNEL_HEAP_BASE is the base address of the kernel heap
*/
#define KERNEL_HEAP_BASE 0xFFFFA00000000000 #define KERNEL_HEAP_BASE 0xFFFFA00000000000
/**
* @brief USER_HEAP_BASE is the base address of the user heap allocated by the kernel
*/
#define USER_HEAP_BASE 0xFFFFB00000000000 #define USER_HEAP_BASE 0xFFFFB00000000000
/**
* @brief USER_STACK_BASE is the base address of the user stack
*/
#define USER_STACK_BASE 0xFFFFEFFFFFFF0000 #define USER_STACK_BASE 0xFFFFEFFFFFFF0000
#elif defined(a32)
#define NORMAL_VMA_OFFSET 0x80000000
#define KERNEL_VMA_OFFSET 0xC0000000
#define KERNEL_HEAP_BASE 0xA0000000
#define USER_HEAP_BASE 0xB0000000
#define USER_STACK_BASE 0xEFFFFFFF
#endif
namespace Memory namespace Memory
{ {
@ -181,15 +178,15 @@ namespace Memory
/** @brief Set Address */ /** @brief Set Address */
void SetAddress(uintptr_t _Address) void SetAddress(uintptr_t _Address)
{ {
#if defined(__amd64__) #if defined(a64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__i386__) #elif defined(a32)
_Address &= 0x000FFFFF; _Address &= 0x000FFFFF;
this->raw &= 0xFFC00003; this->raw &= 0xFFC00003;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__aarch64__) #elif defined(aa64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
@ -199,11 +196,11 @@ namespace Memory
/** @brief Get Address */ /** @brief Get Address */
uintptr_t GetAddress() uintptr_t GetAddress()
{ {
#if defined(__amd64__) #if defined(a64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#elif defined(__i386__) #elif defined(a32)
return (this->raw & 0x003FFFFF000) >> 12; return (this->raw & 0x003FFFFF000) >> 12;
#elif defined(__aarch64__) #elif defined(aa64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#endif #endif
} }
@ -236,15 +233,15 @@ namespace Memory
/** @brief Set PageTableEntryPtr address */ /** @brief Set PageTableEntryPtr address */
void SetAddress(uintptr_t _Address) void SetAddress(uintptr_t _Address)
{ {
#if defined(__amd64__) #if defined(a64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__i386__) #elif defined(a32)
_Address &= 0x000FFFFF; _Address &= 0x000FFFFF;
this->raw &= 0xFFC00003; this->raw &= 0xFFC00003;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__aarch64__) #elif defined(aa64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
@ -254,11 +251,11 @@ namespace Memory
/** @brief Get PageTableEntryPtr address */ /** @brief Get PageTableEntryPtr address */
uintptr_t GetAddress() uintptr_t GetAddress()
{ {
#if defined(__amd64__) #if defined(a64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#elif defined(__i386__) #elif defined(a32)
return (this->raw & 0x003FFFFF000) >> 12; return (this->raw & 0x003FFFFF000) >> 12;
#elif defined(__aarch64__) #elif defined(aa64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#endif #endif
} }
@ -291,15 +288,15 @@ namespace Memory
/** @brief Set PageDirectoryEntryPtr address */ /** @brief Set PageDirectoryEntryPtr address */
void SetAddress(uintptr_t _Address) void SetAddress(uintptr_t _Address)
{ {
#if defined(__amd64__) #if defined(a64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__i386__) #elif defined(a32)
_Address &= 0x000FFFFF; _Address &= 0x000FFFFF;
this->raw &= 0xFFC00003; this->raw &= 0xFFC00003;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__aarch64__) #elif defined(aa64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
@ -309,11 +306,11 @@ namespace Memory
/** @brief Get PageDirectoryEntryPtr address */ /** @brief Get PageDirectoryEntryPtr address */
uintptr_t GetAddress() uintptr_t GetAddress()
{ {
#if defined(__amd64__) #if defined(a64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#elif defined(__i386__) #elif defined(a32)
return (this->raw & 0x003FFFFF000) >> 12; return (this->raw & 0x003FFFFF000) >> 12;
#elif defined(__aarch64__) #elif defined(aa64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#endif #endif
} }
@ -346,15 +343,15 @@ namespace Memory
/** @brief Set PageDirectoryPointerTableEntryPtr address */ /** @brief Set PageDirectoryPointerTableEntryPtr address */
void SetAddress(uintptr_t _Address) void SetAddress(uintptr_t _Address)
{ {
#if defined(__amd64__) #if defined(a64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__i386__) #elif defined(a32)
_Address &= 0x000FFFFF; _Address &= 0x000FFFFF;
this->raw &= 0xFFC00003; this->raw &= 0xFFC00003;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
#elif defined(__aarch64__) #elif defined(aa64)
_Address &= 0x000000FFFFFFFFFF; _Address &= 0x000000FFFFFFFFFF;
this->raw &= 0xFFF0000000000FFF; this->raw &= 0xFFF0000000000FFF;
this->raw |= (_Address << 12); this->raw |= (_Address << 12);
@ -364,11 +361,11 @@ namespace Memory
/** @brief Get PageDirectoryPointerTableEntryPtr address */ /** @brief Get PageDirectoryPointerTableEntryPtr address */
uintptr_t GetAddress() uintptr_t GetAddress()
{ {
#if defined(__amd64__) #if defined(a64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#elif defined(__i386__) #elif defined(a32)
return (this->raw & 0x003FFFFF000) >> 12; return (this->raw & 0x003FFFFF000) >> 12;
#elif defined(__aarch64__) #elif defined(aa64)
return (this->raw & 0x000FFFFFFFFFF000) >> 12; return (this->raw & 0x000FFFFFFFFFF000) >> 12;
#endif #endif
} }

View File

@ -11,11 +11,11 @@
struct CPUArchData struct CPUArchData
{ {
#if defined(__amd64__) #if defined(a64)
CPU::x64::FXState *FPU; CPU::x64::FXState *FPU;
/* TODO */ /* TODO */
#elif defined(__i386__) #elif defined(a32)
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
}; };

View File

@ -5,14 +5,14 @@
typedef struct SyscallsFrame typedef struct SyscallsFrame
{ {
#if defined(__amd64__) #if defined(a64)
uint64_t r15, r14, r13, r12, r11, r10, r9, r8; uint64_t r15, r14, r13, r12, r11, r10, r9, r8;
uint64_t rbp, rdi, rsi, rdx, rcx, rbx, rax; uint64_t rbp, rdi, rsi, rdx, rcx, rbx, rax;
uint64_t InterruptNumber, ErrorCode, rip, cs, rflags, rsp, ss; uint64_t InterruptNumber, ErrorCode, rip, cs, rflags, rsp, ss;
#elif defined(__i386__) #elif defined(a32)
uint32_t ebp, edi, esi, edx, ecx, ebx, eax; uint32_t ebp, edi, esi, edx, ecx, ebx, eax;
uint32_t InterruptNumber, ErrorCode, eip, cs, eflags, esp, ss; uint32_t InterruptNumber, ErrorCode, eip, cs, eflags, esp, ss;
#elif defined(__aarch64__) #elif defined(aa64)
#endif #endif
} SyscallsFrame; } SyscallsFrame;

View File

@ -102,13 +102,13 @@ namespace Tasking
Memory::StackGuard *Stack; Memory::StackGuard *Stack;
Memory::MemMgr *Memory; Memory::MemMgr *Memory;
TaskStatus Status; TaskStatus Status;
#if defined(__amd64__) #if defined(a64)
CPU::x64::TrapFrame Registers; CPU::x64::TrapFrame Registers;
uint64_t GSBase, FSBase; uint64_t GSBase, FSBase;
#elif defined(__i386__) #elif defined(a32)
CPU::x32::TrapFrame Registers; // TODO CPU::x32::TrapFrame Registers; // TODO
uint64_t GSBase, FSBase; uint64_t GSBase, FSBase;
#elif defined(__aarch64__) #elif defined(aa64)
uint64_t Registers; // TODO uint64_t Registers; // TODO
#endif #endif
uintptr_t IPHistory[128]; uintptr_t IPHistory[128];
@ -250,13 +250,13 @@ namespace Tasking
void UpdateProcessStatus(); void UpdateProcessStatus();
void WakeUpThreads(void *CPUDataPointer); void WakeUpThreads(void *CPUDataPointer);
#if defined(__amd64__) #if defined(a64)
void Schedule(CPU::x64::TrapFrame *Frame); void Schedule(CPU::x64::TrapFrame *Frame);
void OnInterruptReceived(CPU::x64::TrapFrame *Frame); void OnInterruptReceived(CPU::x64::TrapFrame *Frame);
#elif defined(__i386__) #elif defined(a32)
void Schedule(void *Frame); void Schedule(void *Frame);
void OnInterruptReceived(void *Frame); void OnInterruptReceived(CPU::x32::TrapFrame *Frame);
#elif defined(__aarch64__) #elif defined(aa64)
void Schedule(void *Frame); void Schedule(void *Frame);
void OnInterruptReceived(void *Frame); void OnInterruptReceived(void *Frame);
#endif #endif

View File

@ -208,17 +208,17 @@ typedef intptr_t ssize_t;
#define WINT_MAX __WINT_MAX__ #define WINT_MAX __WINT_MAX__
#define WINT_MIN __WINT_MIN__ #define WINT_MIN __WINT_MIN__
#if defined(__amd64__) #if defined(a64)
#define BREAK __asm__ __volatile__("int $0x3" \ #define BREAK __asm__ __volatile__("int $0x3" \
: \ : \
: \ : \
: "memory"); : "memory");
#elif defined(__i386__) #elif defined(a32)
#define BREAK __asm__ __volatile__("int $0x3" \ #define BREAK __asm__ __volatile__("int $0x3" \
: \ : \
: \ : \
: "memory"); : "memory");
#elif defined(__aarch64__) #elif defined(aa64)
#define BREAK __asm__ __volatile__("brk #0" \ #define BREAK __asm__ __volatile__("brk #0" \
: \ : \
: \ : \