355 lines
7.5 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include"../common/asm.h"
.code64
//.section .text
R15 = 0x00
R14 = 0x08
R13 = 0x10
R12 = 0x18
R11 = 0x20
R10 = 0x28
R9 = 0x30
R8 = 0x38
RBX = 0x40
RCX = 0x48
RDX = 0x50
RSI = 0x58
RDI = 0x60
RBP = 0x68
DS = 0x70
ES = 0x78
RAX = 0x80
FUNC = 0x88
ERRCODE = 0x90
RIP = 0x98
CS = 0xa0
RFLAGS = 0xa8
OLD_RSP = 0xb0
OLDSS = 0xb8
Restore_all:
// === ===
popq %r15
popq %r14
popq %r13
popq %r12
popq %r11
popq %r10
popq %r9
popq %r8
popq %rbx
popq %rcx
popq %rdx
popq %rsi
popq %rdi
popq %rbp
popq %rax // popds
movq %rax, %ds
popq %rax
movq %rax, %es
popq %rax
addq $0x10, %rsp // FUNCerrcode
sti
iretq
ret_from_exception:
// === ===
ENTRY(ret_from_intr)
jmp Restore_all
Err_Code:
// =====
pushq %rax
movq %es, %rax
pushq %rax
movq %ds, %rax
pushq %rax
xorq %rax, %rax
pushq %rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
pushq %rbx
pushq %r8
pushq %r9
pushq %r10
pushq %r11
pushq %r12
pushq %r13
pushq %r14
pushq %r15
cld
movq ERRCODE(%rsp), %rsi // rsi
movq FUNC(%rsp), %rdx
movq $0x10, %rdi //
movq %rdi, %ds
movq %rdi, %es
movq %rsp, %rdi // rdi
callq *%rdx // *
jmp ret_from_exception
//
//
ENTRY(system_call)
// sysenter
subq $0x38, %rsp
cld;
pushq %rax
movq %es, %rax
pushq %rax
movq %ds, %rax
pushq %rax
pushq %rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
pushq %rbx
pushq %r8
pushq %r9
pushq %r10
pushq %r11
pushq %r12
pushq %r13
pushq %r14
pushq %r15
movq $0x10, %rdx
movq %rdx, %ds
movq %rdx, %es
// rspsystem_call_function
movq %rsp, %rdi
callq system_call_function
//
ENTRY(ret_from_system_call)
popq %r15
popq %r14
popq %r13
popq %r12
popq %r11
popq %r10
popq %r9
popq %r8
popq %rbx
popq %rcx
popq %rdx
popq %rsi
popq %rdi
popq %rbp
popq %rax // popds
movq %rax, %ds
popq %rax
movq %rax, %es
popq %rax
addq $0x10, %rsp // FUNCerrcode
sti
iretq
// 0 #DE
ENTRY(divide_error)
pushq $0 //#DE0
pushq %rax // rax
leaq do_divide_error(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 1 #DB
ENTRY(debug)
pushq $0
pushq %rax
leaq do_debug(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 2
ENTRY(nmi)
//
//
pushq $0 //err_code
pushq %rax
leaq do_nmi(%rip), %rax
xchgq %rax, (%rsp)
jmp Err_Code
// 3 #BP
ENTRY(int3)
pushq $0
pushq %rax
leaq do_int3(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 4 #OF
ENTRY(overflow)
pushq $0
pushq %rax
leaq do_overflow(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 5 #BR
ENTRY(bounds)
pushq $0
pushq %rax
leaq do_bounds(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 6 #UD /
ENTRY(undefined_opcode)
pushq $0
pushq %rax
leaq do_undefined_opcode(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 7 #NM FPU
ENTRY(dev_not_avaliable)
pushq $0
pushq %rax
leaq do_dev_not_avaliable(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 8 #DF
ENTRY(double_fault)
pushq %rax
leaq do_double_fault(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 9
ENTRY(coprocessor_segment_overrun)
pushq $0
pushq %rax
leaq do_coprocessor_segment_overrun(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 10 #TS TSS
ENTRY(invalid_TSS)
// === #TS ==
// ,
pushq %rax
leaq do_invalid_TSS(%rip), %rax
xchgq %rax, (%rsp)
jmp Err_Code
// 11 #NP
ENTRY(segment_not_exists)
pushq %rax
leaq do_segment_not_exists(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 12 #SS
ENTRY(stack_segment_fault)
pushq %rax
leaq do_stack_segment_fault(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 13 #GP
ENTRY(general_protection)
pushq %rax
leaq do_general_protection(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 14 #PF
ENTRY(page_fault)
// === #PF ==
//
pushq %rax
leaq do_page_fault(%rip), %rax
xchgq %rax, (%rsp)
jmp Err_Code
// 15 Intel使
// 16 #MF X87 FPU
ENTRY(x87_FPU_error)
pushq $0
pushq %rax
leaq do_x87_FPU_error(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 17 #AC
ENTRY(alignment_check)
pushq %rax
leaq do_alignment_check(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 18 #MC
ENTRY(machine_check)
pushq $0
pushq %rax
leaq do_machine_check(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 19 #XM SIMD
ENTRY(SIMD_exception)
pushq $0
pushq %rax
leaq do_SIMD_exception(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 20 #VE
ENTRY(virtualization_exception)
pushq $0
pushq %rax
leaq do_virtualization_exception(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 0x80
ENTRY(syscall_int)
pushq $0
pushq %rax
leaq do_syscall_int(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code