diff --git a/reactos/include/ndk/amd64/asm.h b/reactos/include/ndk/amd64/asm.h index d80b35de136..4538e0c820a 100644 --- a/reactos/include/ndk/amd64/asm.h +++ b/reactos/include/ndk/amd64/asm.h @@ -255,7 +255,6 @@ Author: #define CBSTACK_RBP 0x18 #define CBSTACK_RESULT 0x20 #define CBSTACK_RESULT_LENGTH 0x28 -#define CBSTACK_FRAME_POINTER CBSTACK_RBP /* Following ones are ASM only! ***********************************************/ diff --git a/reactos/include/ndk/amd64/ketypes.h b/reactos/include/ndk/amd64/ketypes.h index 03ee79c4be0..b57242055d4 100644 --- a/reactos/include/ndk/amd64/ketypes.h +++ b/reactos/include/ndk/amd64/ketypes.h @@ -231,6 +231,23 @@ typedef struct _KTRAP_FRAME LONG CodePatchCycle; } KTRAP_FRAME, *PKTRAP_FRAME; +// +// Defines the Callback Stack Layout for User Mode Callbacks +// +typedef struct _KCALLOUT_FRAME +{ + ULONG64 InitialStack; + ULONG64 TrapFrame; + ULONG64 CallbackStack; + ULONG64 Rdi; + ULONG64 Rsi; + ULONG64 Rbx; + ULONG64 Rbp; + ULONG64 ReturnAddress; + ULONG64 Result; + ULONG64 ResultLength; +} KCALLOUT_FRAME, *PKCALLOUT_FRAME; + // // Dummy LDT_ENTRY // diff --git a/reactos/include/ndk/arm/ketypes.h b/reactos/include/ndk/arm/ketypes.h index 587e1b6b10d..2e63ea51fc9 100644 --- a/reactos/include/ndk/arm/ketypes.h +++ b/reactos/include/ndk/arm/ketypes.h @@ -84,6 +84,17 @@ typedef struct _KTRAP_FRAME ULONG PreviousTrapFrame; } KTRAP_FRAME, *PKTRAP_FRAME; +// +// Defines the Callback Stack Layout for User Mode Callbacks +// +// Just a stub with some required members for now +// +typedef struct _KCALLOUT_FRAME +{ + ULONG CallbackStack; + ULONG DummyFramePointer; +} KCALLOUT_FRAME, *PKCALLOUT_FRAME; + #ifndef NTOS_MODE_USER // diff --git a/reactos/include/ndk/i386/asm.h b/reactos/include/ndk/i386/asm.h index 095cb5d4b28..f0e1be8ab11 100644 --- a/reactos/include/ndk/i386/asm.h +++ b/reactos/include/ndk/i386/asm.h @@ -534,7 +534,6 @@ Author: #define CBSTACK_EBP 0x18 #define CBSTACK_RESULT 0x20 #define CBSTACK_RESULT_LENGTH 0x24 -#define CBSTACK_FRAME_POINTER CBSTACK_EBP // // NTSTATUS, Bugcheck Codes and Debug Codes diff --git a/reactos/include/ndk/i386/ketypes.h b/reactos/include/ndk/i386/ketypes.h index 78b47c446fd..ad2c5a53720 100644 --- a/reactos/include/ndk/i386/ketypes.h +++ b/reactos/include/ndk/i386/ketypes.h @@ -201,6 +201,23 @@ typedef struct _KTRAP_FRAME ULONG V86Gs; } KTRAP_FRAME, *PKTRAP_FRAME; +// +// Defines the Callback Stack Layout for User Mode Callbacks +// +typedef struct _KCALLOUT_FRAME +{ + ULONG InitialStack; + ULONG TrapFrame; + ULONG CallbackStack; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Ebp; + ULONG ReturnAddress; + ULONG Result; + ULONG ResultLength; +} KCALLOUT_FRAME, *PKCALLOUT_FRAME; + // // LDT Entry Definition // diff --git a/reactos/ntoskrnl/kd64/kddata.c b/reactos/ntoskrnl/kd64/kddata.c index 54e5b0d6cfb..c5db36d4f23 100644 --- a/reactos/ntoskrnl/kd64/kddata.c +++ b/reactos/ntoskrnl/kd64/kddata.c @@ -30,6 +30,7 @@ VOID NTAPI RtlpBreakWithStatusInstruction(VOID); #define KPCR_INITIAL_STACK_OFFSET 0 #define KPCR_STACK_LIMIT_OFFSET 0 #define KPRCB_PCR_PAGE_OFFSET 0 +#define CBSTACK_FRAME_POINTER Ebp #elif defined(_AMD64_) @@ -39,6 +40,7 @@ VOID NTAPI RtlpBreakWithStatusInstruction(VOID); #define KPCR_INITIAL_STACK_OFFSET 0 #define KPCR_STACK_LIMIT_OFFSET 0 #define KPRCB_PCR_PAGE_OFFSET 0 +#define CBSTACK_FRAME_POINTER Rbp #elif defined(_ARM_) @@ -48,6 +50,7 @@ VOID NTAPI RtlpBreakWithStatusInstruction(VOID); #define KPCR_INITIAL_STACK_OFFSET FIELD_OFFSET(KPCR, InitialStack) #define KPCR_STACK_LIMIT_OFFSET FIELD_OFFSET(KPCR, StackLimit) #define KPRCB_PCR_PAGE_OFFSET FIELD_OFFSET(KPRCB, PcrPage) +#define CBSTACK_FRAME_POINTER DummyFramePointer #else #error Unsupported Architecture @@ -392,8 +395,8 @@ KDDEBUGGER_DATA64 KdDebuggerDataBlock = {(ULONG_PTR)RtlpBreakWithStatusInstruction}, 0, FIELD_OFFSET(KTHREAD, CallbackStack), - CBSTACK_CALLBACK_STACK, - CBSTACK_FRAME_POINTER, + FIELD_OFFSET(KCALLOUT_FRAME, CallbackStack), + FIELD_OFFSET(KCALLOUT_FRAME, CBSTACK_FRAME_POINTER), FALSE, {(ULONG_PTR)KiCallUserMode}, 0, @@ -505,7 +508,7 @@ KDDEBUGGER_DATA64 KdDebuggerDataBlock = KPCR_STACK_LIMIT_OFFSET, KPRCB_PCR_PAGE_OFFSET, FIELD_OFFSET(KPRCB, ProcessorState.SpecialRegisters), -#if defined(_M_IX86) +#if defined(_X86_) // // x86 GDT/LDT/TSS constants // @@ -519,7 +522,7 @@ KDDEBUGGER_DATA64 KdDebuggerDataBlock = KGDT_TSS, 0, 0, -#elif defined(_M_AMD64) +#elif defined(_AMD64_) // // AMD64 GDT/LDT/TSS constants // diff --git a/reactos/ntoskrnl/ke/arm/stubs_asm.s b/reactos/ntoskrnl/ke/arm/stubs_asm.s index 11b8f3a9bc4..f7d4900457a 100644 --- a/reactos/ntoskrnl/ke/arm/stubs_asm.s +++ b/reactos/ntoskrnl/ke/arm/stubs_asm.s @@ -34,6 +34,7 @@ GENERATE_ARM_STUB KeSynchronizeExecution GENERATE_ARM_STUB KeSwitchKernelStack GENERATE_ARM_STUB RtlCreateUserThread GENERATE_ARM_STUB RtlInitializeContext -GENERATE_ARM_STUB KeUserModeCallback +GENERATE_ARM_STUB KeUserModeCallback +GENERATE_ARM_STUB KiCallUserMode GENERATE_ARM_STUB NtCallbackReturn GENERATE_ARM_STUB NtContinue