1212# Installs ds / es selectors in 32 - bit mode
1313ASM_ GLOBAL (installSelectors , @function)
1414 mov r8 , rsp # save host stack
15- mov rdx , qword ptr [ rdi + TEB_SP ] # fetch guest stack
15+ mov rsp , qword ptr [ rdi + TEB_SP ] # switch to guest stack
1616 mov ax , cs # fetch host code segment selector
1717 mov word ptr [ rdi + TEB_HOST_CS_SEL ], ax # store host code segment selector
1818 mov ax , word ptr [ rdi + TEB_DS_SEL ] # user data segment selector
1919 LJMP32 rdi # far jump into 32 - bit code
2020 mov ds , ax # setup data segment
2121 mov es , ax # setup extra segment
22- mov esp , edx # switch to guest stack
2322 LJMP64 edi # far jump into 64 - bit code
2423 mov rsp , r8 # switch to host stack
2524 ret
@@ -30,9 +29,8 @@ ASM_END(installSelectors)
3029ASM_ GLOBAL (setThreadArea64 , @function)
3130 push rbx # save rbx
3231 mov r8 , rsp # save host stack
33- mov rdx , qword ptr [ rsi + TEB_SP ] # fetch guest stack
32+ mov rsp , qword ptr [ rsi + TEB_SP ] # switch to guest stack
3433 LJMP32 rsi # far jump into 32 - bit code
35- mov esp , edx # switch to guest stack
3634 sub esp , 0x10 # sizeof(user_desc)
3735 mov dword ptr [ esp ], edi # entry_number (arg 0 )
3836 mov dword ptr [ esp + 4 ], esi # base_addr (arg 1 )
@@ -59,6 +57,8 @@ ASM_END(setThreadArea64)
5957
6058# bool installSelectors(TEB * teb)
6159ASM_ GLOBAL (installSelectors , @function)
60+ mov r8 , rsp # save host stack
61+ mov rsp , qword ptr [ rsi + TEB_SP ] # fetch guest stack
6262 mov ax , cs # fetch host code segment selector
6363 mov word ptr [ rdi + TEB_HOST_CS_SEL ], ax # store host code segment selector
6464 mov ax , word ptr [ rdi + TEB_DS_SEL ] # fetch data segment selector
@@ -68,6 +68,7 @@ ASM_GLOBAL(installSelectors, @function)
6868 mov es , ax # setup extra segment
6969 mov fs , dx # setup fs segment
7070 LJMP64 edi # far jump into 64 - bit code
71+ mov rsp , r8 # switch to host stack
7172 mov rax , 1 # return true
7273 ret
7374ASM_END(installSelectors)
0 commit comments