From 41271b11f74b5e9d919432d1f353a4c4b60452e6 Mon Sep 17 00:00:00 2001 From: yash20720 Date: Fri, 31 Jul 2026 22:49:27 +0530 Subject: [PATCH 1/5] feat(kernel): implement graceful page fault handling and process triage - Add shared diagnostic header BaseHdr/Hal/fault.h - Implement user vs kernel mode fault classification in x86_64 and ARM64 handlers - Gracefully terminate user-space faulting processes instead of halting kernel - Fix GCC/LLVM cross-compilation header issues in timer.h, stdarg.h, string.cpp, and core.c --- BaseHdr/Hal/fault.h | 84 ++++++++++ BaseHdr/stdarg.h | 22 +-- BaseHdr/timer.h | 24 +-- Kernel/Hal/x86_64_exception.cpp | 283 ++++++++++++++++++++++---------- Kernel/Makefile | 2 +- Kernel/string.cpp | 3 +- KernelAA64/Drivers/core.c | 2 +- KernelAA64/Fs/vdisk.c | 2 +- KernelAA64/Hal/vector.c | 179 ++++++++++---------- KernelAA64/Makefile | 2 +- KernelAA64/process.c | 9 +- 11 files changed, 406 insertions(+), 206 deletions(-) create mode 100644 BaseHdr/Hal/fault.h diff --git a/BaseHdr/Hal/fault.h b/BaseHdr/Hal/fault.h new file mode 100644 index 000000000..3421c673a --- /dev/null +++ b/BaseHdr/Hal/fault.h @@ -0,0 +1,84 @@ +/** +* BSD 2-Clause License +* +* Copyright (c) 2022-2026, Manas Kamal Choudhury +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +**/ + +#ifndef __AU_FAULT_H__ +#define __AU_FAULT_H__ + +#include +#if defined(__GNUC__) || defined(__clang__) +#ifndef __cplusplus +#include +#endif +#endif +#include +#include + +#define FAULT_ORIGIN_KERNEL 1 +#define FAULT_ORIGIN_USER 2 +#define FAULT_ORIGIN_DRIVER 3 + +#define FAULT_TYPE_PAGE_NOT_PRESENT 1 +#define FAULT_TYPE_WRITE_VIOLATION 2 +#define FAULT_TYPE_USER_ACCESS 3 +#define FAULT_TYPE_RESERVED_BIT 4 +#define FAULT_TYPE_INSTRUCTION_FETCH 5 +#define FAULT_TYPE_GENERAL_PROTECTION 6 +#define FAULT_TYPE_INVALID_OPCODE 7 +#define FAULT_TYPE_STACK_FAULT 8 +#define FAULT_TYPE_UNKNOWN 9 + +#pragma pack(push,1) +typedef struct _au_fault_info_ { + uint64_t fault_address; + uint64_t fault_pc; + uint8_t fault_type; + uint8_t origin; + uint16_t thread_id; + char thread_name[16]; + int process_id; + char process_name[16]; + uint64_t vma_start; + uint64_t vma_end; +}AuFaultInfo; +#pragma pack(pop) + +/* + * AuFaultLogDiagnostics -- print structured fault diagnostics to serial + * @param info -- pointer to fault diagnostic info + */ +AU_EXTERN AU_EXPORT void AuFaultLogDiagnostics(AuFaultInfo* info); + +/* + * AuFaultTerminateProcess -- gracefully terminate a faulting user process + * @param proc -- process slot to terminate + * @param info -- fault diagnostic info + */ +AU_EXTERN AU_EXPORT void AuFaultTerminateProcess(AuProcess* proc, AuFaultInfo* info); + +#endif diff --git a/BaseHdr/stdarg.h b/BaseHdr/stdarg.h index 167dd9aa4..e6e27c662 100644 --- a/BaseHdr/stdarg.h +++ b/BaseHdr/stdarg.h @@ -55,7 +55,12 @@ extern "C" ((sizeof(TYPE)+sizeof(STACKITEM)-1) \ & ~(sizeof(STACKITEM)-1)) -#if defined(ARCH_X64) || defined(__x86_64__) +#if defined(__GNUC__) || defined(__clang__) +#define va_start(ap, last) __builtin_va_start(ap, last) +#define va_arg(ap, type) __builtin_va_arg(ap, type) +#define va_end(ap) __builtin_va_end(ap) +#define va_copy(dest, src) __builtin_va_copy(dest, src) +#else /* &(LASTARG) points to the LEFTMOST argument of the function call (before the ...) */ #define va_start(AP, LASTARG) \ @@ -66,21 +71,6 @@ extern "C" #define va_arg(AP, TYPE) \ (AP += VA_SIZE(TYPE), *((TYPE *)(AP - VA_SIZE(TYPE)))) -#elif defined(ARCH_ARM64) || defined(__aarch64__) -#ifdef __GNUC__ -#define va_start(ap, last) __builtin_va_start(ap, last) -#define va_arg(ap, type) __builtin_va_arg(ap, type) -#define va_end(ap) __builtin_va_end(ap) -#else -#define va_start(ap,last) \ - ((ap) = (va_list)(&(last)) + 8) - -#define va_arg(ap,T) \ - (*(T*)((ap) += 8, (ap) - 8)) - -#define va_end(ap) \ - ((ap) = (va_list)0) -#endif #endif #ifdef __cplusplus diff --git a/BaseHdr/timer.h b/BaseHdr/timer.h index 32aab266a..4d66ab96e 100644 --- a/BaseHdr/timer.h +++ b/BaseHdr/timer.h @@ -32,8 +32,15 @@ #ifndef __TIMER_H__ #define __TIMER_H__ -#include +#ifdef ARCH_X64 +#include +typedef struct _au_thread_ AuThreadType; +#elif defined(ARCH_ARM64) #include +typedef AA64Thread AuThreadType; +#else +typedef void AuThreadType; +#endif #if defined(__GNUC__) || defined(__clang__) #ifndef __cplusplus #include @@ -48,7 +55,7 @@ typedef struct _kernel_timer_ { AuroraTimerCallback handler; void* param; uint8_t active; - AA64Thread* owner; + AuThreadType* owner; }AuKernelTimer; #define AURORA_MAX_TIMER 32 @@ -105,7 +112,9 @@ AU_EXTERN AU_EXPORT uint64_t AuGetCurrentUS(); * @param thr -- pointer to thread which requires one-shot timer * @param seconds -- amount of second to wait */ -extern int AuTimerCalculateAlarm(AA64Thread* thr, uint64_t seconds); +extern int AuTimerCalculateAlarm(AuThreadType* thr, uint64_t seconds); + +#include /* POSIX Timer API */ typedef struct _itimerval_ { @@ -113,19 +122,14 @@ typedef struct _itimerval_ { timeval it_value; }itimerval_t; -typedef struct _timeval_t_ { - long tv_sec; - long tv_usec; -}timeval_t; - /** *@brief AuTimerSetITimer -- posix standard implementation of * setting periodic timer */ -extern int AuTimerSetITimer(AA64Thread* thr, int which, const itimerval_t* newval, itimerval_t* oldval); -extern int AuTimerGetITimer(AA64Thread* thr, int which, itimerval_t* curr_value); +extern int AuTimerSetITimer(AuThreadType* thr, int which, const itimerval_t* newval, itimerval_t* oldval); +extern int AuTimerGetITimer(AuThreadType* thr, int which, itimerval_t* curr_value); extern void AuSetWalltime(int64_t sec, int64_t nsec); extern void AuGetWalltime(int64_t* out_sec, int64_t* out_ns); diff --git a/Kernel/Hal/x86_64_exception.cpp b/Kernel/Hal/x86_64_exception.cpp index 3990f4321..b19bb5c51 100644 --- a/Kernel/Hal/x86_64_exception.cpp +++ b/Kernel/Hal/x86_64_exception.cpp @@ -45,6 +45,7 @@ #include #include #include +#include void panic(const char* msg, ...) { SeTextOut("\r\n ***ARCH x86_64 : Kernel Panic!!! *** \r\n"); @@ -104,19 +105,96 @@ void bounds_check_fault(size_t v, void* p){ for (;;); } +void AuFaultLogDiagnostics(AuFaultInfo* info) { + if (!info) + return; + SeTextOut("\r\n======================================================\r\n"); + SeTextOut("[AuFault]: *** EXCEPTION DIAGNOSTIC REPORT ***\r\n"); + SeTextOut("[AuFault]: Origin : %s\r\n", + info->origin == FAULT_ORIGIN_USER ? "USER-SPACE" : + (info->origin == FAULT_ORIGIN_DRIVER ? "DRIVER" : "KERNEL")); + + const char* type_str = "UNKNOWN"; + switch (info->fault_type) { + case FAULT_TYPE_PAGE_NOT_PRESENT: type_str = "PAGE NOT PRESENT"; break; + case FAULT_TYPE_WRITE_VIOLATION: type_str = "READ/WRITE VIOLATION"; break; + case FAULT_TYPE_USER_ACCESS: type_str = "USER ACCESS VIOLATION"; break; + case FAULT_TYPE_RESERVED_BIT: type_str = "RESERVED BIT SET"; break; + case FAULT_TYPE_INSTRUCTION_FETCH: type_str = "INSTRUCTION FETCH FAULT"; break; + case FAULT_TYPE_GENERAL_PROTECTION: type_str = "GENERAL PROTECTION FAULT"; break; + case FAULT_TYPE_INVALID_OPCODE: type_str = "INVALID OPCODE FAULT"; break; + case FAULT_TYPE_STACK_FAULT: type_str = "STACK FAULT"; break; + default: type_str = "UNKNOWN FAULT"; break; + } + SeTextOut("[AuFault]: Fault Type : %s (%d)\r\n", type_str, info->fault_type); + if (info->fault_address) { + SeTextOut("[AuFault]: Fault Address : 0x%x\r\n", info->fault_address); + } + SeTextOut("[AuFault]: Faulting PC : 0x%x\r\n", info->fault_pc); + SeTextOut("[AuFault]: Process : %s (PID: %d)\r\n", info->process_name[0] ? info->process_name : "N/A", info->process_id); + SeTextOut("[AuFault]: Thread : %s (TID: %d)\r\n", info->thread_name[0] ? info->thread_name : "N/A", info->thread_id); + if (info->vma_start) { + SeTextOut("[AuFault]: VMA Range : 0x%x - 0x%x\r\n", info->vma_start, info->vma_end); + } + SeTextOut("======================================================\r\n\r\n"); +} + +void AuFaultTerminateProcess(AuProcess* proc, AuFaultInfo* info) { + AuThread* curr_thr = AuGetCurrentThread(); + + if (proc && proc != AuGetRootProcess()) { + SeTextOut("[AuFault]: Gracefully terminating user process '%s' (PID: %d)\r\n", proc->name, proc->proc_id); + AuProcessExit(proc, false); + } else if (curr_thr) { + SeTextOut("[AuFault]: Terminating user thread '%s' (TID: %d)\r\n", curr_thr->name, curr_thr->id); + curr_thr->state = THREAD_STATE_KILLABLE; + AuThreadMoveToTrash(curr_thr); + } + + x64_force_sched(); +} + //! exception function -- invalid_opcode_fault void invalid_opcode_fault(size_t v, void* p){ x64_cli(); interrupt_stack_frame *frame = (interrupt_stack_frame*)p; - panic("Invalid Opcode Fault \r\n"); - SeTextOut("Invalid Opcode Fault \r\n"); - SeTextOut("__PROCESSOR TRACE__ \r\n"); - SeTextOut("RIP -> %x\n", frame->rip); - SeTextOut("Stack -> %x\n", frame->rsp); - SeTextOut("RFLAGS -> %x\n", frame->rflags); - SeTextOut("CS -> %x\n", frame->cs); - SeTextOut("SS -> %x\n", frame->ss); - for (;;); + AuThread* thr = AuGetCurrentThread(); + AuProcess* proc = NULL; + if (thr) { + proc = AuProcessFindThread(thr); + if (!proc) + proc = AuProcessFindSubThread(thr); + } + + AuFaultInfo info; + memset(&info, 0, sizeof(AuFaultInfo)); + info.fault_address = 0; + info.fault_pc = frame->rip; + info.fault_type = FAULT_TYPE_INVALID_OPCODE; + info.origin = ((frame->cs & 0x3) == 0x3) ? FAULT_ORIGIN_USER : FAULT_ORIGIN_KERNEL; + + if (thr) { + info.thread_id = thr->id; + strncpy(info.thread_name, thr->name, 15); + } + if (proc) { + info.process_id = proc->proc_id; + strncpy(info.process_name, proc->name, 15); + AuVMArea* vma = AuVMAreaGet(proc, frame->rip); + if (vma) { + info.vma_start = vma->start; + info.vma_end = vma->end; + } + } + + AuFaultLogDiagnostics(&info); + + if (info.origin == FAULT_ORIGIN_USER && proc && proc != AuGetRootProcess()) { + AuFaultTerminateProcess(proc, &info); + } else { + panic("Invalid Opcode Fault !! Unrecoverable Kernel Fault"); + for (;;); + } } //! exception function -- no device fault @@ -151,14 +229,43 @@ void no_segment_fault(size_t v, void* p){ void stack_fault(size_t v, void* p){ x64_cli(); interrupt_stack_frame *frame = (interrupt_stack_frame*)p; - panic("\nStack Fault at "); - SeTextOut("__PROCESSOR TRACE__ \r\n"); - SeTextOut("RIP -> %x \r\n", frame->rip); - SeTextOut("Stack -> %x \r\n", frame->rsp); - SeTextOut("RFLAGS -> %x \r\n", frame->rflags); - SeTextOut("CS -> %x, SS -> %x \r\n", frame->cs, frame->ss); - SeTextOut("Current thread ->id %d , %s\r\n", AuGetCurrentThread()->id, AuGetCurrentThread()->name); - for (;;); + AuThread* thr = AuGetCurrentThread(); + AuProcess* proc = NULL; + if (thr) { + proc = AuProcessFindThread(thr); + if (!proc) + proc = AuProcessFindSubThread(thr); + } + + AuFaultInfo info; + memset(&info, 0, sizeof(AuFaultInfo)); + info.fault_address = 0; + info.fault_pc = frame->rip; + info.fault_type = FAULT_TYPE_STACK_FAULT; + info.origin = ((frame->cs & 0x3) == 0x3) ? FAULT_ORIGIN_USER : FAULT_ORIGIN_KERNEL; + + if (thr) { + info.thread_id = thr->id; + strncpy(info.thread_name, thr->name, 15); + } + if (proc) { + info.process_id = proc->proc_id; + strncpy(info.process_name, proc->name, 15); + AuVMArea* vma = AuVMAreaGet(proc, frame->rip); + if (vma) { + info.vma_start = vma->start; + info.vma_end = vma->end; + } + } + + AuFaultLogDiagnostics(&info); + + if (info.origin == FAULT_ORIGIN_USER && proc && proc != AuGetRootProcess()) { + AuFaultTerminateProcess(proc, &info); + } else { + panic("Stack Fault !! Unrecoverable Kernel Fault"); + for (;;); + } } //! exception function --- general protection fault @@ -166,7 +273,6 @@ void stack_fault(size_t v, void* p){ void general_protection_fault(size_t v, void* p){ x64_cli(); interrupt_stack_frame *frame = (interrupt_stack_frame*)p; - panic("Genral Protection Fault \r\n"); AuThread* thr = AuGetCurrentThread(); AuProcess* proc = NULL; @@ -176,23 +282,35 @@ void general_protection_fault(size_t v, void* p){ proc = AuProcessFindSubThread(thr); } - SeTextOut("General Protection Fault \r\n"); - SeTextOut("__PROCESSOR TRACE__ \r\n"); - SeTextOut("RIP -> %x \r\n", frame->rip); - SeTextOut("Stack -> %x \r\n", frame->rsp); - SeTextOut("RFLAGS -> %x \r\n", frame->rflags); - SeTextOut("CS -> %x, SS -> %x \r\n", frame->cs, frame->ss); - SeTextOut("Current thread ->id %d , %s\r\n", thr->id, thr->name); - AuVMArea* vma = NULL; - if (proc) - vma = AuVMAreaGet(proc, frame->rip); - if (vma) { - SeTextOut("VMA Start -> %x \r\n", vma->start); - uint64_t offset = (frame->rip - vma->start); - uint64_t realAddress = 0x600000 + offset; - SeTextOut("origin address -> %x %x\r\n", frame->rip, realAddress); + AuFaultInfo info; + memset(&info, 0, sizeof(AuFaultInfo)); + info.fault_address = 0; + info.fault_pc = frame->rip; + info.fault_type = FAULT_TYPE_GENERAL_PROTECTION; + info.origin = ((frame->cs & 0x3) == 0x3) ? FAULT_ORIGIN_USER : FAULT_ORIGIN_KERNEL; + + if (thr) { + info.thread_id = thr->id; + strncpy(info.thread_name, thr->name, 15); + } + if (proc) { + info.process_id = proc->proc_id; + strncpy(info.process_name, proc->name, 15); + AuVMArea* vma = AuVMAreaGet(proc, frame->rip); + if (vma) { + info.vma_start = vma->start; + info.vma_end = vma->end; + } + } + + AuFaultLogDiagnostics(&info); + + if (info.origin == FAULT_ORIGIN_USER && proc && proc != AuGetRootProcess()) { + AuFaultTerminateProcess(proc, &info); + } else { + panic("General Protection Fault !! Unrecoverable Kernel Fault"); + for (;;); } - for (;;); } extern "C" bool _signal_debug; @@ -204,28 +322,15 @@ extern "C" bool syscall_debug; void page_fault(size_t vector, void* param){ x64_cli(); interrupt_stack_frame *frame = (interrupt_stack_frame*)param; - stack_frame *fr = (stack_frame*)param; - void* vaddr = (void*)x64_read_cr2(); - int present = !(frame->error & 0x1); - int rw = frame->error & 0x2; - int us = frame->error & 0x4; - int resv = frame->error & 0x8; - int id = frame->error & 0x10; - - AuThread* thr = AuGetCurrentThread(); - /* check for signal */ - if (!thr) { - goto skip; - } - if (thr->returnableSignal) { + /* check for signal returnable frame */ + if (thr && thr->returnableSignal) { Signal* sig = (Signal*)thr->returnableSignal; x86_64_cpu_regs_t* ctx = (x86_64_cpu_regs_t*)(thr->frame.kern_esp - sizeof(x86_64_cpu_regs_t)); - x86_64_cpu_regs_t* srcCtx = (x86_64_cpu_regs_t*)sig->signalStack; memcpy(ctx, sig->signalStack, sizeof(x86_64_cpu_regs_t)); memcpy(&thr->frame, sig->signalState, sizeof(AuThreadFrame)); kfree(sig->signalStack); @@ -241,50 +346,48 @@ void page_fault(size_t vector, void* param){ proc = AuProcessFindThread(thr); if (!proc) proc = AuProcessFindSubThread(thr); - - SeTextOut("Thread name -> %s \r\n", thr->name); - if (proc) { - SeTextOut("Process pid -> %d \r\n", proc->proc_id); - SeTextOut("Process name -> %s \r\n", proc->name); - } } - -skip: - panic("Page Fault !! \r\n"); - uint64_t vaddr_ = (uint64_t)vaddr; - uint64_t vaddr_aligned = VIRT_ADDR_ALIGN(vaddr_); - bool _mapped = false; - if (present) { - SeTextOut("Page Not Present \r\n"); - } - else if (rw) { - SeTextOut("Read/Write %x\r\n", vaddr); - SeTextOut("Virtual Address Aligned -> %x \r\n", vaddr_aligned); - //void* phys = AuGetPhysicalAddress(vaddr_aligned); + + AuFaultInfo info; + memset(&info, 0, sizeof(AuFaultInfo)); + info.fault_address = (uint64_t)vaddr; + info.fault_pc = frame->rip; + + if (!(frame->error & 0x1)) + info.fault_type = FAULT_TYPE_PAGE_NOT_PRESENT; + else if (frame->error & 0x2) + info.fault_type = FAULT_TYPE_WRITE_VIOLATION; + else if (frame->error & 0x4) + info.fault_type = FAULT_TYPE_USER_ACCESS; + else if (frame->error & 0x8) + info.fault_type = FAULT_TYPE_RESERVED_BIT; + else if (frame->error & 0x10) + info.fault_type = FAULT_TYPE_INSTRUCTION_FETCH; + else + info.fault_type = FAULT_TYPE_UNKNOWN; + + info.origin = ((frame->cs & 0x3) == 0x3) ? FAULT_ORIGIN_USER : FAULT_ORIGIN_KERNEL; + + if (thr) { + info.thread_id = thr->id; + strncpy(info.thread_name, thr->name, 15); } - else if (us) - SeTextOut("User bit not set \r\n"); - else if (resv) - SeTextOut("Reserved page \r\n"); - else if (id) - SeTextOut("Invalid page \r\n"); - - AuVMArea* vma = NULL; - if (proc) - vma = AuVMAreaGet(proc, frame->rip); - - SeTextOut("Virtual Address -> %x \r\n", vaddr_); - SeTextOut("Virtual Address aligned -> %x \r\n", vaddr_aligned); - SeTextOut("RSP -> %x \r\n", frame->rsp); - SeTextOut("RIP->%x\r\n", frame->rip); - if (vma) { - SeTextOut("VMA Start -> %x \r\n", vma->start); - uint64_t offset = (frame->rip - vma->start); - uint64_t realAddress = 0x600000 + offset; - SeTextOut("origin address -> %x %x\r\n", frame->rip, realAddress); + if (proc) { + info.process_id = proc->proc_id; + strncpy(info.process_name, proc->name, 15); + AuVMArea* vma = AuVMAreaGet(proc, frame->rip); + if (vma) { + info.vma_start = vma->start; + info.vma_end = vma->end; + } } - SeTextOut("CS -> %x, SS -> %x \r\n", frame->cs, frame->ss); - if (!_mapped) { + + AuFaultLogDiagnostics(&info); + + if (info.origin == FAULT_ORIGIN_USER && proc && proc != AuGetRootProcess()) { + AuFaultTerminateProcess(proc, &info); + } else { + panic("Page Fault !! Unrecoverable Kernel Fault"); for (;;); } } diff --git a/Kernel/Makefile b/Kernel/Makefile index e858877f8..9eeb1a24f 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -10,7 +10,7 @@ OBJDIR = obj CXX = g++ INCLUDES = -I../BaseHdr -I. -I../KernelAA64 # Note: Kernel requires strict higher-half memory flags and no-red-zone -CXXFLAGS = -Wno-error=pragmas -mno-red-zone -mcmodel=large -fPIE \ +CXXFLAGS = -Wno-error=pragmas -mno-red-zone -mcmodel=large -fPIE -fpermissive \ -Wall -Wextra -funsigned-char -fshort-wchar -fno-strict-aliasing \ -ffreestanding -fno-stack-protector -fno-stack-check -std=c++17 -DARCH_X64 $(INCLUDES) diff --git a/Kernel/string.cpp b/Kernel/string.cpp index 9f07efd64..f627a77f7 100644 --- a/Kernel/string.cpp +++ b/Kernel/string.cpp @@ -65,8 +65,9 @@ int memcmp(const void *first, const void *second, size_t length){ } -void memcpy(void *dest, void *src, size_t count){ +void* memcpy(void *dest, void *src, size_t count){ _fastcpy(dest, src, count); + return dest; } diff --git a/KernelAA64/Drivers/core.c b/KernelAA64/Drivers/core.c index d63fd9b58..546b73e19 100644 --- a/KernelAA64/Drivers/core.c +++ b/KernelAA64/Drivers/core.c @@ -175,7 +175,7 @@ int BordoisilaDriverRemove(BordoisilaDriver* driver) { if (ref) { driver->refcount--; - return; + return 0; } diff --git a/KernelAA64/Fs/vdisk.c b/KernelAA64/Fs/vdisk.c index 2a668ca42..839c53ddf 100644 --- a/KernelAA64/Fs/vdisk.c +++ b/KernelAA64/Fs/vdisk.c @@ -42,7 +42,7 @@ #include #include #include -#include +#include AuVDisk* VdiskArray[MAX_VDISK_DEVICES]; int _vdisk_num_; diff --git a/KernelAA64/Hal/vector.c b/KernelAA64/Hal/vector.c index 709021660..4cecf84f7 100644 --- a/KernelAA64/Hal/vector.c +++ b/KernelAA64/Hal/vector.c @@ -43,11 +43,54 @@ #include #include #include -#include +#include extern uint64_t read_sp(); extern uint64_t read_sp_el1(); +void AuFaultLogDiagnostics(AuFaultInfo* info) { + if (!info) + return; + UARTDebugOut("\r\n======================================================\r\n"); + UARTDebugOut("[AuFault]: *** EXCEPTION DIAGNOSTIC REPORT (ARM64) ***\r\n"); + UARTDebugOut("[AuFault]: Origin : %s\r\n", + info->origin == FAULT_ORIGIN_USER ? "USER-SPACE" : + (info->origin == FAULT_ORIGIN_DRIVER ? "DRIVER" : "KERNEL")); + + const char* type_str = "UNKNOWN"; + switch (info->fault_type) { + case FAULT_TYPE_PAGE_NOT_PRESENT: type_str = "TRANSLATION FAULT"; break; + case FAULT_TYPE_WRITE_VIOLATION: type_str = "PERMISSION / WRITE FAULT"; break; + case FAULT_TYPE_USER_ACCESS: type_str = "ACCESS FLAG FAULT"; break; + case FAULT_TYPE_INSTRUCTION_FETCH: type_str = "INSTRUCTION ABORT"; break; + default: type_str = "SYNCHRONOUS DATA/INSTR FAULT"; break; + } + UARTDebugOut("[AuFault]: Fault Type : %s (%d)\r\n", type_str, info->fault_type); + UARTDebugOut("[AuFault]: Fault Address : 0x%x\r\n", info->fault_address); + UARTDebugOut("[AuFault]: Faulting PC : 0x%x\r\n", info->fault_pc); + UARTDebugOut("[AuFault]: Process : %s (PID: %d)\r\n", info->process_name[0] ? info->process_name : "N/A", info->process_id); + UARTDebugOut("[AuFault]: Thread : %s (TID: %d)\r\n", info->thread_name[0] ? info->thread_name : "N/A", info->thread_id); + if (info->vma_start) { + UARTDebugOut("[AuFault]: VMA Range : 0x%x - 0x%x\r\n", info->vma_start, info->vma_end); + } + UARTDebugOut("======================================================\r\n\r\n"); +} + +void AuFaultTerminateProcess(AuProcess* proc, AuFaultInfo* info) { + AA64Thread* curr_thr = AuGetCurrentThread(); + + if (proc && proc != AuGetRootProcess()) { + UARTDebugOut("[AuFault]: Gracefully terminating user process '%s' (PID: %d)\r\n", proc->name, proc->proc_id); + AuProcessExit(proc, 0); + } else if (curr_thr) { + UARTDebugOut("[AuFault]: Terminating user thread '%s'\r\n", curr_thr->name); + curr_thr->state = THREAD_STATE_KILLABLE; + AuThreadMoveToTrash(curr_thr); + } + + AuForceScheduler(); +} + void AuDumpRegisters(AA64Thread* thr, AA64Registers* regs) { UARTDebugOut("===REGISTER DUMP===\r\n"); UARTDebugOut("x0: %x x1: %x \r\n", regs->x0, regs->x1); @@ -71,77 +114,24 @@ void AuDumpRegisters(AA64Thread* thr, AA64Registers* regs) { } void sync_el1_handler(AA64Registers *regs) { - uint64_t esr = read_esr_el1(); if ((esr >> 26) == 0x15) { AuAA64SyscallHandler(regs); - // enable_irqs(); return; } uint32_t ec = (esr >> 26) & 0x3F; + uint64_t far_val = read_far_el1(); + uint64_t pc_val = read_elr_el1(); - // AuTextOut("======Synch exception=======\r\n"); - // AuTextOut("FAR: %x, PC: %x \r\n", read_far_el1(), read_elr_el1()); - - - - uint32_t dfsc = esr & 0x3F; - - /* switch (dfsc) { - case 0b000000: AuTextOut("Address size, fault level 0 \r\n"); break; - case 0b000001: AuTextOut("Address Size, fault level 1 \r\n"); break; - case 0b000010: AuTextOut("Address size, fault level 2 \r\n"); break; - case 0b000011: AuTextOut("Address size, fault level 3 \r\n"); break; - case 0b000100: AuTextOut("translation, fault level 0 \r\n"); break; - case 0b000101: AuTextOut("translation, fault level 1 \r\n"); break; - case 0b000110: AuTextOut("translation, fault level 2 \r\n"); break; - case 0b000111: AuTextOut("translation, fault level 3 \r\n"); break; - case 0b001001: AuTextOut("access flag, fault level 1 \r\n"); break; - case 0b001010: AuTextOut("access flag, fault level 2 \r\n"); break; - case 0b001011: AuTextOut("access flag, fault level 3 \r\n"); break; - case 0b001101: AuTextOut("permission fault, level 1 \r\n"); break; - case 0b001110: AuTextOut("permission fault, level 2 \r\n"); break; - case 0b001111: AuTextOut("permission fault, level 3 \r\n"); break; - default: AuTextOut("Unknown fault code \r\n"); break; - }*/ - UARTDebugOut("=======Synchronous Exception occured========= \r\n"); - //AuTextOut("Fault Address (FAR_EL1): %x \r\n", read_far_el1()); - UARTDebugOut("Fault Address (FAR_EL1): %x \r\n", read_far_el1()); - //UARTDebugOut("Fault Address String (FAR_EL1): %s \n", read_far_el1()); - //AuTextOut("Fault Instruction (ELR_EL1): %x \r\n", read_elr_el1()); - UARTDebugOut("Fault Instruction (ELR_EL1): %x \r\n", read_elr_el1()); - // AuTextOut("SP_EL1: %x \r\n", read_sp()); - // AuTextOut("SP_EL0 : %x \r\n", regs->EL0SP); - UARTDebugOut("Current SPSel : %d \r\n", read_spsel()); - UARTDebugOut("EC class : %x \r\n", ec); - - /** check if the fault occured on drivers **/ - AuDriver* drv = AuDrvManagerCheckFault(read_elr_el1()); + AuDriver* drv = AuDrvManagerCheckFault(pc_val); if (drv) { UARTDebugOut("======CRASH in Kernel Driver====== \r\n"); - AuDrvCatchFault(drv, read_elr_el1()); + AuDrvCatchFault(drv, pc_val); } - AA64Thread* currthr = AuGetCurrentThread(); - if (currthr) { - UARTDebugOut("Current Thread: %s \r\n", currthr->name); - // AuTextOut("Current Thread: %s \r\n", currthr->name); - AuDumpRegisters(currthr, regs); - } - - if (ec == 0x25) { - // AuTextOut("Stack alignment fault \r\n"); - AuDumpRegisters(currthr, regs); - } - - size_t totalRam = (AuPmmngrGetTotalMem()*0x1000) / 1024 / 1024; - size_t usedRam = (AuPmmngrGetUsedMem()*0x1000) / 1024 / 1024; - size_t freeRam = (AuPmmngrGetFreeMem()*0x1000) / 1024 / 1024; - // AuTextOut("Total RAM : %d MiB, Used RAM : %d MiB , Free RAM : %d MiB\r\n", totalRam, usedRam, freeRam); - AuProcess* proc = NULL; if (currthr) { proc = AuProcessFindThread(currthr); @@ -149,36 +139,57 @@ void sync_el1_handler(AA64Registers *regs) { proc = AuProcessFindSubThread(currthr); } - AuVMArea* vma = NULL; - if (proc) - vma = AuVMAreaGet(proc, read_elr_el1()); - if (vma) { - UARTDebugOut("VMA Start -> %x \r\n", vma->start); - uint64_t offset = (read_elr_el1() - vma->start); - uint64_t realAddress = 0x600000000 + offset; - UARTDebugOut("original address of the process -> %x %x\r\n", read_elr_el1(), realAddress); + AuFaultInfo info; + memset(&info, 0, sizeof(AuFaultInfo)); + info.fault_address = far_val; + info.fault_pc = pc_val; + + uint32_t dfsc = esr & 0x3F; + if ((dfsc & 0x3C) == 0x04) + info.fault_type = FAULT_TYPE_PAGE_NOT_PRESENT; + else if ((dfsc & 0x3C) == 0x0C) + info.fault_type = FAULT_TYPE_WRITE_VIOLATION; + else if ((dfsc & 0x3C) == 0x08) + info.fault_type = FAULT_TYPE_USER_ACCESS; + else if (ec == 0x20 || ec == 0x21) + info.fault_type = FAULT_TYPE_INSTRUCTION_FETCH; + else + info.fault_type = FAULT_TYPE_UNKNOWN; + + if (ec == 0x20 || ec == 0x24) + info.origin = FAULT_ORIGIN_USER; + else if (drv) + info.origin = FAULT_ORIGIN_DRIVER; + else + info.origin = FAULT_ORIGIN_KERNEL; + + if (currthr) { + info.thread_id = (uint16_t)currthr->thread_id; + strncpy(info.thread_name, currthr->name, 7); + info.thread_name[7] = '\0'; + } + if (proc) { + info.process_id = proc->proc_id; + strncpy(info.process_name, proc->name, 15); + info.process_name[15] = '\0'; + AuVMArea* vma = AuVMAreaGet(proc, pc_val); + if (vma) { + info.vma_start = vma->start; + info.vma_end = vma->end; + } } - dfsc = esr & 0x3F; + AuFaultLogDiagnostics(&info); - switch (dfsc) { - case 0b000000: UARTDebugOut("Address size, fault level 0 \r\n"); break; - case 0b000001: UARTDebugOut("Address Size, fault level 1 \r\n"); break; - case 0b000010: UARTDebugOut("Address size, fault level 2 \r\n"); break; - case 0b000011: UARTDebugOut("Address size, fault level 3 \r\n"); break; - case 0b000100: UARTDebugOut("translation, fault level 0 \r\n"); break; - case 0b000101: UARTDebugOut("translation, fault level 1 \r\n"); break; - case 0b000110: UARTDebugOut("translation, fault level 2 \r\n"); break; - case 0b000111: UARTDebugOut("translation, fault level 3 \r\n"); break; - case 0b001001: UARTDebugOut("access flag, fault level 1 \r\n"); break; - case 0b001010: UARTDebugOut("access flag, fault level 2 \r\n"); break; - case 0b001011: UARTDebugOut("access flag, fault level 3 \r\n"); break; - case 0b001101: UARTDebugOut("permission fault, level 1 \r\n"); break; - case 0b001110: UARTDebugOut("permission fault, level 2 \r\n"); break; - case 0b001111: UARTDebugOut("permission fault, level 3 \r\n"); break; - default: UARTDebugOut("Unknown fault code \r\n"); break; + if (info.origin == FAULT_ORIGIN_USER && proc && proc != AuGetRootProcess()) { + AuFaultTerminateProcess(proc, &info); + } else { + UARTDebugOut("=======Synchronous Exception Kernel Crash=========\r\n"); + if (currthr) { + AuDumpRegisters(currthr, regs); + } + while (1) {} } - while (1) {} } extern bool aa64_restore_context(AA64Thread* thr); diff --git a/KernelAA64/Makefile b/KernelAA64/Makefile index 3955e8338..ed4390c23 100644 --- a/KernelAA64/Makefile +++ b/KernelAA64/Makefile @@ -19,7 +19,7 @@ else BOARD_FLAG = -D__TARGET_BOARD_QEMU_VIRT__ endif -INCLUDES = -I../BaseHdr -I../Acpica/include -I../Acpica -I. +INCLUDES = -I../BaseHdr -I../Acpica/include -I../Acpica -I../DCL/includes -I. ifeq ($(TOOLCHAIN), llvm) diff --git a/KernelAA64/process.c b/KernelAA64/process.c index bdde191e9..e8f26e579 100644 --- a/KernelAA64/process.c +++ b/KernelAA64/process.c @@ -59,6 +59,13 @@ static int pid = 1; AuProcess* proc_first; AuProcess* proc_last; AuProcess* root_proc; + +/** + * @brief AuGetRootProcess -- returns the root process + */ +AuProcess* AuGetRootProcess() { + return root_proc; +} /* * @brief AuAddProcess -- adds process to kernel data structure * @param root -- pointer to the root process @@ -403,7 +410,7 @@ void AuProcessFreeKeResource(AA64Thread* thr) { * @param proc -- process to exit * @param schedulable -- schedule to next thread */ -void AuProcessExit(AuProcess* proc, BOOL schedulable) { +void AuProcessExit(AuProcess* proc, bool schedulable) { if (proc == root_proc) { UARTDebugOut("[aurora]: cannot exit root process \r\n"); return; From 7ba651b5b962b0a5fa6b494078309d338654248d Mon Sep 17 00:00:00 2001 From: yash20720 Date: Fri, 31 Jul 2026 22:53:00 +0530 Subject: [PATCH 2/5] build(kernel): update KernelAA64.lib binary build output --- KernelAA64/KernelAA64.lib | Bin 33458 -> 28910 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/KernelAA64/KernelAA64.lib b/KernelAA64/KernelAA64.lib index 7d7c28a2a1d557ced5af7d0cb1b7e51bcdc7fea6..274cc453b10737a6248c7f0d703070e968c20798 100644 GIT binary patch delta 2762 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 From a168bb105dfa07f35b55ffb6b618c6c78d2bf7e3 Mon Sep 17 00:00:00 2001 From: yash20720 Date: Mon, 3 Aug 2026 21:53:48 +0530 Subject: [PATCH 3/5] fix(build): resolve BootAA64 clang va_list error and MSVC NASM action failure --- .github/workflows/build-check.yml | 3 +++ BaseHdr/stdarg.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 2632e1f27..6049bc577 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -59,6 +59,9 @@ jobs: foreach ($path in $customizationsPaths) { Copy-Item nasmprops\* -Destination $path -Force -Recurse } + $nasmPath = (Get-Command nasm.exe).Source + $vcDir = Join-Path $vsPath "VC" + Copy-Item $nasmPath -Destination $vcDir -Force - name: Build Solution (Aurora.sln) run: | diff --git a/BaseHdr/stdarg.h b/BaseHdr/stdarg.h index e6e27c662..46f3b8e8b 100644 --- a/BaseHdr/stdarg.h +++ b/BaseHdr/stdarg.h @@ -38,7 +38,7 @@ extern "C" #endif -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) typedef __builtin_va_list va_list; #else /* va list parameter list */ From 4fdcd24633d266d1071bf1663d3c22adec199788 Mon Sep 17 00:00:00 2001 From: yash20720 Date: Tue, 4 Aug 2026 18:13:11 +0530 Subject: [PATCH 4/5] Fix MSVC compilation errors in project files and codebase --- BaseHdr/Serv/sysserv.h | 2 +- Boot/Boot.vcxproj | 2 +- Boot/include/Common.hpp | 2 ++ Boot/xnldr.cpp | 2 +- Kernel/Fs/Ext2/ext2.cpp | 4 +++- Kernel/Hal/serial.cpp | 2 +- Kernel/process.cpp | 2 +- KernelAA64/KernelAA64.vcxproj | 4 ++++ 8 files changed, 14 insertions(+), 6 deletions(-) diff --git a/BaseHdr/Serv/sysserv.h b/BaseHdr/Serv/sysserv.h index 67af9b304..fbe6fe59d 100644 --- a/BaseHdr/Serv/sysserv.h +++ b/BaseHdr/Serv/sysserv.h @@ -46,7 +46,7 @@ #include /* maximum supported system calls */ -//#define AURORA_MAX_SYSCALL 58 +#define AURORA_MAX_SYSCALL 58 #define AURORA_SYSCALL_MAGIC 0x15062023 /* ========================================== diff --git a/Boot/Boot.vcxproj b/Boot/Boot.vcxproj index 17e2590dc..3463162fd 100644 --- a/Boot/Boot.vcxproj +++ b/Boot/Boot.vcxproj @@ -166,7 +166,7 @@ false StreamingSIMDExtensions2 ..\BaseHdr;$(ProjectDir)include;$(ProjectDir)include\AArch64;%(AdditionalIncludeDirectories) - false + true stdc17 stdcpp17 diff --git a/Boot/include/Common.hpp b/Boot/include/Common.hpp index e962a8309..b686f1cf9 100644 --- a/Boot/include/Common.hpp +++ b/Boot/include/Common.hpp @@ -20,6 +20,7 @@ struct is_ptr_or_uint64 : std::disjunction< std::is_same> > {}; +/* // raw_diff for pointers and uint64_t template ::value, int> = 0> @@ -66,6 +67,7 @@ T mem_after(T p1) return p1 + 1; } } +*/ // Macros for the same #define RAW_OFFSET(type, x, offset) (type)((size_t)x + offset) diff --git a/Boot/xnldr.cpp b/Boot/xnldr.cpp index e41d74c73..9f6dcbd16 100644 --- a/Boot/xnldr.cpp +++ b/Boot/xnldr.cpp @@ -260,7 +260,7 @@ EFI_STATUS efi_main_handler(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTabl *------------------------------------------------------------------- */ void* xdsp_address = NULL; -#ifdef __MSC_VER +#ifdef _MSC_VER static EFI_GUID acpi_guid = EFI_ACPI_20_TABLE_GUID; #else static EFI_GUID acpi_guid = ACPI_20_TABLE_GUID; diff --git a/Kernel/Fs/Ext2/ext2.cpp b/Kernel/Fs/Ext2/ext2.cpp index 12356edcc..3ecd5ed48 100644 --- a/Kernel/Fs/Ext2/ext2.cpp +++ b/Kernel/Fs/Ext2/ext2.cpp @@ -36,7 +36,7 @@ /* * Ext2Initialise -- mount the file system */ -void Ext2Initialise(AuVDisk* vdisk, char* mountname) { +AuVFSNode* Ext2Initialise(AuVDisk* vdisk, char* mountname) { uint64_t* buffer = (uint64_t*)AuPmmngrAlloc(); memset(buffer, 0, 4096); AuVDiskRead(vdisk, 0, 1, buffer); @@ -44,4 +44,6 @@ void Ext2Initialise(AuVDisk* vdisk, char* mountname) { Ext2Superblock* ext2sb = (Ext2Superblock*)buffer; AuTextOut("Ext2 block count -> %d CreatorOS -> %d \n", ext2sb->blocks_count, ext2sb->creator_os); + + return NULL; } \ No newline at end of file diff --git a/Kernel/Hal/serial.cpp b/Kernel/Hal/serial.cpp index a95cdf29e..ee65d8274 100644 --- a/Kernel/Hal/serial.cpp +++ b/Kernel/Hal/serial.cpp @@ -80,7 +80,7 @@ void DebugSerial(char* string) { */ AU_EXTERN AU_EXPORT void SeTextOut(char* format, ...) { - _va_list_ args; + va_list args; va_start(args, format); while (*format) diff --git a/Kernel/process.cpp b/Kernel/process.cpp index 802068f59..1ee579fb5 100644 --- a/Kernel/process.cpp +++ b/Kernel/process.cpp @@ -416,7 +416,7 @@ int AuProcessWaitForTermination(AuProcess *proc, int pid) { else { AuProcess* proc = AuProcessFindByPID(0,pid); if (!proc) - return; + return 0; AuThread* thr = AuGetCurrentThread(); AuBlockThread(thr); list_add(proc->waitlist, thr); diff --git a/KernelAA64/KernelAA64.vcxproj b/KernelAA64/KernelAA64.vcxproj index 984305420..e9ed8bdfe 100644 --- a/KernelAA64/KernelAA64.vcxproj +++ b/KernelAA64/KernelAA64.vcxproj @@ -153,6 +153,8 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + ..\BaseHdr;..\Acpica\include;..\Acpica;$(SolutionDir)DCL\includes;%(AdditionalIncludeDirectories) + true Console @@ -214,6 +216,8 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + ..\BaseHdr;..\Acpica\include;..\Acpica;$(SolutionDir)DCL\includes;%(AdditionalIncludeDirectories) + true Console From 503e6a9814466125f4f6fe517d5254c674592e96 Mon Sep 17 00:00:00 2001 From: yash20720 Date: Tue, 4 Aug 2026 18:16:01 +0530 Subject: [PATCH 5/5] Revert "Fix MSVC compilation errors in project files and codebase" This reverts commit 4fdcd24633d266d1071bf1663d3c22adec199788. --- BaseHdr/Serv/sysserv.h | 2 +- Boot/Boot.vcxproj | 2 +- Boot/include/Common.hpp | 2 -- Boot/xnldr.cpp | 2 +- Kernel/Fs/Ext2/ext2.cpp | 4 +--- Kernel/Hal/serial.cpp | 2 +- Kernel/process.cpp | 2 +- KernelAA64/KernelAA64.vcxproj | 4 ---- 8 files changed, 6 insertions(+), 14 deletions(-) diff --git a/BaseHdr/Serv/sysserv.h b/BaseHdr/Serv/sysserv.h index fbe6fe59d..67af9b304 100644 --- a/BaseHdr/Serv/sysserv.h +++ b/BaseHdr/Serv/sysserv.h @@ -46,7 +46,7 @@ #include /* maximum supported system calls */ -#define AURORA_MAX_SYSCALL 58 +//#define AURORA_MAX_SYSCALL 58 #define AURORA_SYSCALL_MAGIC 0x15062023 /* ========================================== diff --git a/Boot/Boot.vcxproj b/Boot/Boot.vcxproj index 3463162fd..17e2590dc 100644 --- a/Boot/Boot.vcxproj +++ b/Boot/Boot.vcxproj @@ -166,7 +166,7 @@ false StreamingSIMDExtensions2 ..\BaseHdr;$(ProjectDir)include;$(ProjectDir)include\AArch64;%(AdditionalIncludeDirectories) - true + false stdc17 stdcpp17 diff --git a/Boot/include/Common.hpp b/Boot/include/Common.hpp index b686f1cf9..e962a8309 100644 --- a/Boot/include/Common.hpp +++ b/Boot/include/Common.hpp @@ -20,7 +20,6 @@ struct is_ptr_or_uint64 : std::disjunction< std::is_same> > {}; -/* // raw_diff for pointers and uint64_t template ::value, int> = 0> @@ -67,7 +66,6 @@ T mem_after(T p1) return p1 + 1; } } -*/ // Macros for the same #define RAW_OFFSET(type, x, offset) (type)((size_t)x + offset) diff --git a/Boot/xnldr.cpp b/Boot/xnldr.cpp index 9f6dcbd16..e41d74c73 100644 --- a/Boot/xnldr.cpp +++ b/Boot/xnldr.cpp @@ -260,7 +260,7 @@ EFI_STATUS efi_main_handler(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTabl *------------------------------------------------------------------- */ void* xdsp_address = NULL; -#ifdef _MSC_VER +#ifdef __MSC_VER static EFI_GUID acpi_guid = EFI_ACPI_20_TABLE_GUID; #else static EFI_GUID acpi_guid = ACPI_20_TABLE_GUID; diff --git a/Kernel/Fs/Ext2/ext2.cpp b/Kernel/Fs/Ext2/ext2.cpp index 3ecd5ed48..12356edcc 100644 --- a/Kernel/Fs/Ext2/ext2.cpp +++ b/Kernel/Fs/Ext2/ext2.cpp @@ -36,7 +36,7 @@ /* * Ext2Initialise -- mount the file system */ -AuVFSNode* Ext2Initialise(AuVDisk* vdisk, char* mountname) { +void Ext2Initialise(AuVDisk* vdisk, char* mountname) { uint64_t* buffer = (uint64_t*)AuPmmngrAlloc(); memset(buffer, 0, 4096); AuVDiskRead(vdisk, 0, 1, buffer); @@ -44,6 +44,4 @@ AuVFSNode* Ext2Initialise(AuVDisk* vdisk, char* mountname) { Ext2Superblock* ext2sb = (Ext2Superblock*)buffer; AuTextOut("Ext2 block count -> %d CreatorOS -> %d \n", ext2sb->blocks_count, ext2sb->creator_os); - - return NULL; } \ No newline at end of file diff --git a/Kernel/Hal/serial.cpp b/Kernel/Hal/serial.cpp index ee65d8274..a95cdf29e 100644 --- a/Kernel/Hal/serial.cpp +++ b/Kernel/Hal/serial.cpp @@ -80,7 +80,7 @@ void DebugSerial(char* string) { */ AU_EXTERN AU_EXPORT void SeTextOut(char* format, ...) { - va_list args; + _va_list_ args; va_start(args, format); while (*format) diff --git a/Kernel/process.cpp b/Kernel/process.cpp index 1ee579fb5..802068f59 100644 --- a/Kernel/process.cpp +++ b/Kernel/process.cpp @@ -416,7 +416,7 @@ int AuProcessWaitForTermination(AuProcess *proc, int pid) { else { AuProcess* proc = AuProcessFindByPID(0,pid); if (!proc) - return 0; + return; AuThread* thr = AuGetCurrentThread(); AuBlockThread(thr); list_add(proc->waitlist, thr); diff --git a/KernelAA64/KernelAA64.vcxproj b/KernelAA64/KernelAA64.vcxproj index e9ed8bdfe..984305420 100644 --- a/KernelAA64/KernelAA64.vcxproj +++ b/KernelAA64/KernelAA64.vcxproj @@ -153,8 +153,6 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - ..\BaseHdr;..\Acpica\include;..\Acpica;$(SolutionDir)DCL\includes;%(AdditionalIncludeDirectories) - true Console @@ -216,8 +214,6 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true - ..\BaseHdr;..\Acpica\include;..\Acpica;$(SolutionDir)DCL\includes;%(AdditionalIncludeDirectories) - true Console