My code:
Code: Select all
cli
mov [tss_esp0],esp
mov eax,0x900000 ; example stack
mov [tss_esp],eax
mov eax,esp
push dword USER_DATA_SEL
push eax
push dword 0x00 ;eflags
push dword USER_CODE_SEL
lea eax,[ring3]
push eax
iret
ring3:
mov ax,USER_DATA_SEL
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
int 0x80
jmp $
syscall:
push gs
push fs
push es
push ds
pusha
mov ax,ss
mov ds,ax
mov es,ax
mov fs,ax
call print ;Function that prints a test message
popa
pop ds
pop es
pop fs
pop gs
iret
; The idt part of int 0x80:
dw syscall
dw SYS_CODE_SEL
db 0
db 0xEE ; DPL=3
dw 0
;;Following tss is also setup in the gdt correctly
tss: dw 0, 0 ; back link
tss_esp0:
dd 0 ; ESP0
dw SYS_DATA_SEL, 0 ; SS0, reserved
dd 0 ; ESP1
dw 0, 0 ; SS1, reserved
dd 0 ; ESP2
dw 0, 0 ; SS2, reserved
dd 0 ; CR3
dd 0, 0 ; EIP, EFLAGS (EFLAGS=0x200 for ints)
dd 0, 0, 0, 0 ; EAX, ECX, EDX, EBX
tss_esp:
dd 0, 0, 0, 0 ; ESP, EBP, ESI, EDI
dw 0, 0 ; ES, reserved
dw 0, 0 ; CS, reserved
dw USER_DATA_SEL, 0 ; SS, reserved
dw 0, 0 ; DS, reserved
dw 0, 0 ; FS, reserved
dw 0, 0 ; GS, reserved
dw 0, 0 ; LDT, reserved
dw 0, 0 ; debug, IO perm. bitmap
end: