snapshot before regression test
This commit is contained in:
153
includes/asm.py
Normal file
153
includes/asm.py
Normal file
@@ -0,0 +1,153 @@
|
||||
import t, c
|
||||
|
||||
|
||||
def cli():
|
||||
c.Asm("cli", [t.ASM_DESCR.CLOBBER_MEMORY])
|
||||
|
||||
def sti():
|
||||
c.Asm("sti", [t.ASM_DESCR.CLOBBER_MEMORY])
|
||||
|
||||
def hlt():
|
||||
c.Asm("hlt", [t.ASM_DESCR.CLOBBER_MEMORY])
|
||||
|
||||
def nop():
|
||||
c.Asm("nop", [t.ASM_DESCR.CLOBBER_MEMORY])
|
||||
|
||||
def pause():
|
||||
c.Asm("pause", op=[t.ASM_DESCR.CLOBBER_MEMORY])
|
||||
|
||||
def inb(port: t.CUInt16T) -> t.CUInt8T:
|
||||
value: t.CUInt32T
|
||||
c.Asm(f"""mov edx, {c.AsmInp(t.CUInt32T(port), t.ASM_DESCR.REG_ANY)}
|
||||
in al, dx
|
||||
movzx eax, al""",
|
||||
out = [c.AsmOut(value, t.ASM_DESCR.OUTPUT_REG)],
|
||||
op =[t.ASM_DESCR.CLOBBER_RDX])
|
||||
return t.CUInt8T(value)
|
||||
|
||||
def outb(port: t.CUInt16T, value: t.CUInt8T):
|
||||
c.Asm(f"""mov edx, {c.AsmInp(t.CUInt32T(port), t.ASM_DESCR.REG_ANY)}
|
||||
mov eax, {c.AsmInp(t.CUInt32T(value), t.ASM_DESCR.REG_ANY)}
|
||||
out dx, al""",
|
||||
op = [t.ASM_DESCR.CLOBBER_RDX, t.ASM_DESCR.CLOBBER_RAX])
|
||||
|
||||
|
||||
def inw(port: t.CUInt16T) -> t.CUInt16T:
|
||||
value: t.CUInt32T
|
||||
c.Asm(f"""mov edx, {c.AsmInp(t.CUInt32T(port), t.ASM_DESCR.REG_ANY)}
|
||||
in ax, dx
|
||||
movzx eax, ax""",
|
||||
out = [c.AsmOut(value, t.ASM_DESCR.OUTPUT_REG)],
|
||||
op =[t.ASM_DESCR.CLOBBER_RDX])
|
||||
return t.CUInt16T(value)
|
||||
|
||||
def outw(port: t.CUInt16T, value: t.CUInt16T):
|
||||
c.Asm(f"""mov edx, {c.AsmInp(t.CUInt32T(port), t.ASM_DESCR.REG_ANY)}
|
||||
mov eax, {c.AsmInp(t.CUInt32T(value), t.ASM_DESCR.REG_ANY)}
|
||||
out dx, ax""",
|
||||
op = [t.ASM_DESCR.CLOBBER_RDX, t.ASM_DESCR.CLOBBER_RAX])
|
||||
|
||||
def inl(port: t.CUInt16T) -> t.CUInt32T:
|
||||
value: t.CUInt32T
|
||||
c.Asm(f"""mov edx, {c.AsmInp(t.CUInt32T(port), t.ASM_DESCR.REG_ANY)}
|
||||
in eax, dx""",
|
||||
out = [c.AsmOut(value, t.ASM_DESCR.OUTPUT_REG)],
|
||||
op =[t.ASM_DESCR.CLOBBER_RDX])
|
||||
return value
|
||||
|
||||
def outl(port: t.CUInt16T, value: t.CUInt32T):
|
||||
c.Asm(f"""mov edx, {c.AsmInp(t.CUInt32T(port), t.ASM_DESCR.REG_ANY)}
|
||||
mov eax, {c.AsmInp(value, t.ASM_DESCR.REG_ANY)}
|
||||
out dx, eax""",
|
||||
op = [t.ASM_DESCR.CLOBBER_RDX, t.ASM_DESCR.CLOBBER_RAX])
|
||||
|
||||
def io_wait():
|
||||
c.Asm(f"mov dx, 0x80; out dx, al",
|
||||
op = [t.ASM_DESCR.CLOBBER_MEMORY, t.ASM_DESCR.CLOBBER_DX])
|
||||
|
||||
def pushall() -> t.CInline | t.CVoid:
|
||||
c.Asm(f"""
|
||||
push rax
|
||||
push rbx
|
||||
push rcx
|
||||
push rdx
|
||||
push rsi
|
||||
push rdi
|
||||
push rbp
|
||||
push r8
|
||||
push r9
|
||||
push r10
|
||||
push r11
|
||||
push r12
|
||||
push r13
|
||||
push r14
|
||||
push r15""",
|
||||
[t.ASM_DESCR.CLOBBER_MEMORY]
|
||||
)
|
||||
|
||||
def popall() -> t.CInline | t.CVoid:
|
||||
c.Asm(f"""
|
||||
pop r15
|
||||
pop r14
|
||||
pop r13
|
||||
pop r12
|
||||
pop r11
|
||||
pop r10
|
||||
pop r9
|
||||
pop r8
|
||||
pop rbp
|
||||
pop rdi
|
||||
pop rsi
|
||||
pop rdx
|
||||
pop rcx
|
||||
pop rbx
|
||||
pop rax""",
|
||||
[t.ASM_DESCR.CLOBBER_MEMORY]
|
||||
)
|
||||
|
||||
def cpu_switch_context(old_stack: t.CUInt64T | t.CPtr, new_stack: t.CUInt64T):
|
||||
c.Asm(f"""
|
||||
push rax
|
||||
push rbx
|
||||
push rcx
|
||||
push rdx
|
||||
push rsi
|
||||
push rdi
|
||||
push rbp
|
||||
push r8
|
||||
push r9
|
||||
push r10
|
||||
push r11
|
||||
push r12
|
||||
push r13
|
||||
push r14
|
||||
push r15
|
||||
mov [{c.AsmInp(old_stack, t.ASM_DESCR.REG_ANY)}], rsp
|
||||
mov rsp, {c.AsmInp(new_stack, t.ASM_DESCR.REG_ANY)}
|
||||
pop r15
|
||||
pop r14
|
||||
pop r13
|
||||
pop r12
|
||||
pop r11
|
||||
pop r10
|
||||
pop r9
|
||||
pop r8
|
||||
pop rbp
|
||||
pop rdi
|
||||
pop rsi
|
||||
pop rdx
|
||||
pop rcx
|
||||
pop rbx
|
||||
pop rax""",
|
||||
op=[t.ASM_DESCR.CLOBBER_MEMORY])
|
||||
|
||||
def BSSClean():
|
||||
c.Asm(
|
||||
"lea rdi, [rip + __bss_start]\n"
|
||||
"lea rcx, [rip + __bss_end]\n"
|
||||
"sub rcx, rdi\n"
|
||||
"xor eax, eax\n"
|
||||
"cld\n"
|
||||
"rep stosb",
|
||||
op=[t.ASM_DESCR.CLOBBER_MEMORY, t.ASM_DESCR.CLOBBER_RDI, t.ASM_DESCR.CLOBBER_RCX, t.ASM_DESCR.CLOBBER_RAX]
|
||||
)
|
||||
Reference in New Issue
Block a user