Merge branch 'master' into memmgr
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 23s
Builds / ExectOS (i686, release) (push) Successful in 26s
Builds / ExectOS (amd64, debug) (push) Successful in 41s
Builds / ExectOS (i686, debug) (push) Successful in 38s

This commit is contained in:
2026-03-21 18:30:45 +01:00
7 changed files with 32 additions and 10 deletions

View File

@@ -104,12 +104,20 @@ ArTrap\Vector:
/* Test previous mode and swap GS if needed */ /* Test previous mode and swap GS if needed */
movl $0, TrapPreviousMode(%rbp) movl $0, TrapPreviousMode(%rbp)
mov %cs, %ax mov %cs, %ax
and $1, %al and $3, %al
mov %al, TrapPreviousMode(%rbp) mov %al, TrapPreviousMode(%rbp)
jz KernelMode$\Vector jz KernelMode$\Vector
swapgs swapgs
jmp UserMode$\Vector
KernelMode$\Vector: KernelMode$\Vector:
/* Save kernel stack pointer (SS:RSP) */
movl %ss, %eax
mov %eax, TrapSegSs(%rbp)
lea TRAP_FRAME_SIZE(%rbp), %rax
mov %rax, TrapRsp(%rbp)
UserMode$\Vector:
/* Push Frame Pointer, clear direction flag and pass to trap dispatcher */ /* Push Frame Pointer, clear direction flag and pass to trap dispatcher */
mov %rsp, %rcx mov %rsp, %rcx
cld cld

View File

@@ -75,12 +75,20 @@ _ArTrap\Vector:
/* Test previous mode and swap GS if needed */ /* Test previous mode and swap GS if needed */
movl $0, TrapPreviousMode(%ebp) movl $0, TrapPreviousMode(%ebp)
mov %cs, %ax mov %cs, %ax
and $1, %al and $3, %al
mov %al, TrapPreviousMode(%ebp) mov %al, TrapPreviousMode(%ebp)
jz KernelMode$\Vector jz KernelMode$\Vector
swapgs swapgs
jmp UserMode$\Vector
KernelMode$\Vector: KernelMode$\Vector:
/* Save kernel stack pointer (SS:ESP) as CPU did not push them */
movl %ss, %eax
mov %eax, TrapSegSs(%ebp)
lea TrapEsp(%ebp), %eax
mov %eax, TrapEsp(%ebp)
UserMode$\Vector:
/* Push Frame Pointer, clear direction flag and pass to trap dispatcher */ /* Push Frame Pointer, clear direction flag and pass to trap dispatcher */
push %esp push %esp
cld cld
@@ -100,6 +108,7 @@ KernelModeReturn$\Vector:
mov TrapSegDs(%ebp), %ds mov TrapSegDs(%ebp), %ds
mov TrapSegEs(%ebp), %es mov TrapSegEs(%ebp), %es
mov TrapSegFs(%ebp), %fs mov TrapSegFs(%ebp), %fs
mov TrapSegGs(%ebp), %gs
/* Free stack space */ /* Free stack space */
add $(TRAP_FRAME_SIZE - TRAP_REGISTERS_SIZE), %esp add $(TRAP_FRAME_SIZE - TRAP_REGISTERS_SIZE), %esp

View File

@@ -56,6 +56,8 @@
#define TrapSegEs 330 #define TrapSegEs 330
#define TrapSegFs 332 #define TrapSegFs 332
#define TrapSegGs 334 #define TrapSegGs 334
#define TrapRsp 496
#define TrapSegSs 504
/* KTRAP_FRAME length related definitions */ /* KTRAP_FRAME length related definitions */
#define TRAP_FRAME_SIZE 512 #define TRAP_FRAME_SIZE 512

View File

@@ -24,9 +24,11 @@
#define TrapSegEs 38 #define TrapSegEs 38
#define TrapSegFs 40 #define TrapSegFs 40
#define TrapSegGs 42 #define TrapSegGs 42
#define TrapEsp 92
#define TrapSegSs 96
/* KTRAP_FRAME length related definitions */ /* KTRAP_FRAME length related definitions */
#define TRAP_FRAME_SIZE 100 #define TRAP_FRAME_SIZE 100
#define TRAP_REGISTERS_SIZE 56 #define TRAP_REGISTERS_SIZE 56
#endif /* __XTOSKRNL_AMD64_ASMSUP_H */ #endif /* __XTOSKRNL_I686_ASMSUP_H */

View File

@@ -69,17 +69,18 @@ namespace KE
class SpinLockGuard class SpinLockGuard
{ {
private: private:
PKSPIN_LOCK SpinLock; PKSPIN_LOCK Lock;
public: public:
SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock) SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock)
{ {
KE::SpinLock::AcquireSpinLock(SpinLock); Lock = SpinLock;
KE::SpinLock::AcquireSpinLock(Lock);
} }
~SpinLockGuard() ~SpinLockGuard()
{ {
KE::SpinLock::ReleaseSpinLock(SpinLock); KE::SpinLock::ReleaseSpinLock(Lock);
} }
SpinLockGuard(const SpinLockGuard&) = delete; SpinLockGuard(const SpinLockGuard&) = delete;

View File

@@ -74,7 +74,7 @@ __CxxFrameHandler3(IN PEXCEPTION_RECORD ExceptionRecord,
/* Disable interrupts and hang */ /* Disable interrupts and hang */
AR::CpuFunc::ClearInterruptFlag(); AR::CpuFunc::ClearInterruptFlag();
KE::Crash::Panic(0); // CXX_FRAME_HANDLER_CALLED KE::Crash::Panic(0);
/* Continue search */ /* Continue search */
return ExceptionContinueSearch; return ExceptionContinueSearch;
@@ -129,5 +129,5 @@ _purecall(VOID)
/* Disable interrupts and hang */ /* Disable interrupts and hang */
AR::CpuFunc::ClearInterruptFlag(); AR::CpuFunc::ClearInterruptFlag();
KE::Crash::Panic(0); // PURE_VIRTUAL_FUNCTION_CALL KE::Crash::Panic(0);
} }

View File

@@ -74,7 +74,7 @@ __CxxFrameHandler3(IN PEXCEPTION_RECORD ExceptionRecord,
/* Disable interrupts and hang */ /* Disable interrupts and hang */
AR::CpuFunc::ClearInterruptFlag(); AR::CpuFunc::ClearInterruptFlag();
KE::Crash::Panic(0); // CXX_FRAME_HANDLER_CALLED KE::Crash::Panic(0);
/* Continue search */ /* Continue search */
return ExceptionContinueSearch; return ExceptionContinueSearch;
@@ -129,5 +129,5 @@ _purecall(VOID)
/* Disable interrupts and hang */ /* Disable interrupts and hang */
AR::CpuFunc::ClearInterruptFlag(); AR::CpuFunc::ClearInterruptFlag();
KE::Crash::Panic(0); // PURE_VIRTUAL_FUNCTION_CALL KE::Crash::Panic(0);
} }