mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 09:25:44 +00:00
- Don't update CR3 in KTSS, it's not used.
- Don't read a useless stack pointer anymore. - Update KTSS_ESP0 near the end of context switching, not at the beginning anymore. - Same for IOPM and I/O Redirection Map Base Address. svn path=/trunk/; revision=24182
This commit is contained in:
parent
eaf28f0509
commit
8de07ee7b4
1 changed files with 24 additions and 32 deletions
|
@ -318,26 +318,6 @@ AfterTrace:
|
||||||
/* Update kernel stack */
|
/* Update kernel stack */
|
||||||
mov [edi+KTHREAD_KERNEL_STACK], esp
|
mov [edi+KTHREAD_KERNEL_STACK], esp
|
||||||
|
|
||||||
/* Get stack pointers */
|
|
||||||
mov eax, [esi+KTHREAD_INITIAL_STACK]
|
|
||||||
mov ecx, [esi+KTHREAD_STACK_LIMIT]
|
|
||||||
|
|
||||||
/* Make space for the NPX Frame */
|
|
||||||
sub eax, NPX_FRAME_LENGTH
|
|
||||||
|
|
||||||
/* Check if this isn't V86 Mode, so we can bias the Esp0 */
|
|
||||||
test dword ptr [eax - KTRAP_FRAME_SIZE + KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
|
||||||
jnz NoAdjust
|
|
||||||
|
|
||||||
/* Bias esp */
|
|
||||||
sub eax, KTRAP_FRAME_V86_GS - KTRAP_FRAME_SS
|
|
||||||
|
|
||||||
NoAdjust:
|
|
||||||
|
|
||||||
/* Set new ESP0 */
|
|
||||||
mov ecx, [ebx+KPCR_TSS]
|
|
||||||
mov [ecx+KTSS_ESP0], eax
|
|
||||||
|
|
||||||
/* Switch to new stack */
|
/* Switch to new stack */
|
||||||
mov esp, [esi+KTHREAD_KERNEL_STACK]
|
mov esp, [esi+KTHREAD_KERNEL_STACK]
|
||||||
|
|
||||||
|
@ -357,21 +337,10 @@ NoAdjust:
|
||||||
jnz LdtReload
|
jnz LdtReload
|
||||||
|
|
||||||
UpdateCr3:
|
UpdateCr3:
|
||||||
/* Get the address space */
|
|
||||||
mov edi, ebp
|
|
||||||
mov eax, [edi+KPROCESS_DIRECTORY_TABLE_BASE]
|
|
||||||
|
|
||||||
/* Get the IOPM and TSS */
|
|
||||||
mov ebp, [ebx+KPCR_TSS]
|
|
||||||
mov ecx, [edi+KPROCESS_IOPM_OFFSET]
|
|
||||||
|
|
||||||
/* Switch address space */
|
/* Switch address space */
|
||||||
mov [ebp+KTSS_CR3], eax
|
mov eax, [ebp+KPROCESS_DIRECTORY_TABLE_BASE]
|
||||||
mov cr3, eax
|
mov cr3, eax
|
||||||
|
|
||||||
/* Set current IOPM offset in the TSS */
|
|
||||||
mov [ebp+KTSS_IOMAPBASE], cx
|
|
||||||
|
|
||||||
SameProcess:
|
SameProcess:
|
||||||
/* Clear gs */
|
/* Clear gs */
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
|
@ -385,6 +354,29 @@ SameProcess:
|
||||||
mov [ecx+0x3C], al
|
mov [ecx+0x3C], al
|
||||||
mov [ecx+0x3F], ah
|
mov [ecx+0x3F], ah
|
||||||
|
|
||||||
|
/* Get stack pointer */
|
||||||
|
mov eax, [esi+KTHREAD_INITIAL_STACK]
|
||||||
|
|
||||||
|
/* Make space for the NPX Frame */
|
||||||
|
sub eax, NPX_FRAME_LENGTH
|
||||||
|
|
||||||
|
/* Check if this isn't V86 Mode, so we can bias the Esp0 */
|
||||||
|
test dword ptr [eax - KTRAP_FRAME_SIZE + KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
||||||
|
jnz NoAdjust
|
||||||
|
|
||||||
|
/* Bias esp */
|
||||||
|
sub eax, KTRAP_FRAME_V86_GS - KTRAP_FRAME_SS
|
||||||
|
|
||||||
|
NoAdjust:
|
||||||
|
|
||||||
|
/* Set new ESP0 */
|
||||||
|
mov ecx, [ebx+KPCR_TSS]
|
||||||
|
mov [ecx+KTSS_ESP0], eax
|
||||||
|
|
||||||
|
/* Set current IOPM offset in the TSS */
|
||||||
|
mov ax, [ebp+KPROCESS_IOPM_OFFSET]
|
||||||
|
mov [ecx+KTSS_IOMAPBASE], ax
|
||||||
|
|
||||||
/* Increase context switches */
|
/* Increase context switches */
|
||||||
inc dword ptr [esi+KTHREAD_CONTEXT_SWITCHES]
|
inc dword ptr [esi+KTHREAD_CONTEXT_SWITCHES]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue