Implement initial memory manager infrastructure #24
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user