Skip to content

Commit 3b89db1

Browse files
committed
setup.S: Fix guest/host stack switching
1 parent f012b22 commit 3b89db1

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

src/setup.S

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@
1212
# Installs ds/es selectors in 32-bit mode
1313
ASM_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)
3029
ASM_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)
6159
ASM_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
7374
ASM_END(installSelectors)

0 commit comments

Comments
 (0)