BITS 32

global io_hlt, io_cli, io_sti, io_stihlt
global io_in8, io_out8
global io_load_eflags, io_store_eflags
global load_gdtr, load_idtr

section .text

io_hlt:
    HLT
    RET

io_cli:
    CLI
    RET

io_sti:
    STI
    RET

io_stihlt:
    STI
    HLT
    RET

io_in8:
    MOV EDX, [ESP+4]
    MOV EAX, 0
    IN AL, DX
    RET

io_out8:
    MOV EDX, [ESP+4]
    MOV AL, [ESP+8]
    OUT DX, AL
    RET

io_load_eflags:
    PUSHFD
    POP EAX
    RET

io_store_eflags:
    MOV EAX, [ESP+4]
    PUSH EAX
    POPFD
    RET

load_gdtr:
    MOV AX, [ESP+4]
    MOV [ESP+6], AX
    LGDT [ESP+6]
    RET

load_idtr:
    MOV AX, [ESP+4]
    MOV [ESP+6], AX
    LIDT [ESP+6]
    RET

global get_cs
get_cs:
    XOR EAX, EAX
    MOV AX, CS
    RET