diff --git a/Kernel/Arch/x86/TrapFrame.h b/Kernel/Arch/x86/TrapFrame.h index 48c7815e15..4a6b1e6143 100644 --- a/Kernel/Arch/x86/TrapFrame.h +++ b/Kernel/Arch/x86/TrapFrame.h @@ -34,7 +34,7 @@ struct TrapFrame { static_assert(TRAP_FRAME_SIZE == sizeof(TrapFrame)); -extern "C" void enter_trap_no_irq(TrapFrame* trap); +extern "C" void enter_trap_no_irq(TrapFrame* trap) __attribute__((used)); extern "C" void enter_trap(TrapFrame*) __attribute__((used)); extern "C" void exit_trap(TrapFrame*) __attribute__((used)); diff --git a/Kernel/Arch/x86/common/Interrupts.cpp b/Kernel/Arch/x86/common/Interrupts.cpp index 5ddc6ed487..6f1ea32660 100644 --- a/Kernel/Arch/x86/common/Interrupts.cpp +++ b/Kernel/Arch/x86/common/Interrupts.cpp @@ -94,69 +94,69 @@ static EntropySource s_entropy_source_interrupts { EntropySource::Static::Interr " jmp common_trap_exit \n"); #elif ARCH(X86_64) -#define EH_ENTRY(ec, title) \ - extern "C" void title##_asm_entry(); \ - extern "C" void title##_handler(TrapFrame*); \ - asm( \ - ".globl " #title "_asm_entry\n" \ - "" #title "_asm_entry: \n" \ - " pushq %r15\n" \ - " pushq %r14\n" \ - " pushq %r13\n" \ - " pushq %r12\n" \ - " pushq %r11\n" \ - " pushq %r10\n" \ - " pushq %r9\n" \ - " pushq %r8\n" \ - " pushq %rax\n" \ - " pushq %rcx\n" \ - " pushq %rdx\n" \ - " pushq %rbx\n" \ - " pushq %rsp\n" \ - " pushq %rbp\n" \ - " pushq %rsi\n" \ - " pushq %rdi\n" \ - " pushq %rsp \n" /* set TrapFrame::regs */ \ - " subq $" __STRINGIFY(TRAP_FRAME_SIZE - 8) ", %rsp \n" \ - " subq $0x8, %rsp\n" /* align stack */ \ - " lea 0x8(%rsp), %rdi \n" \ - " cld\n" \ - " call enter_trap_no_irq \n" \ - " lea 0x8(%rsp), %rdi \n" \ - " call " #title "_handler\n" \ - " addq $0x8, %rsp\n" /* undo alignment */\ +#define EH_ENTRY(ec, title) \ + extern "C" void title##_asm_entry(); \ + extern "C" void title##_handler(TrapFrame*) __attribute__((used)); \ + asm( \ + ".globl " #title "_asm_entry\n" \ + "" #title "_asm_entry: \n" \ + " pushq %r15\n" \ + " pushq %r14\n" \ + " pushq %r13\n" \ + " pushq %r12\n" \ + " pushq %r11\n" \ + " pushq %r10\n" \ + " pushq %r9\n" \ + " pushq %r8\n" \ + " pushq %rax\n" \ + " pushq %rcx\n" \ + " pushq %rdx\n" \ + " pushq %rbx\n" \ + " pushq %rsp\n" \ + " pushq %rbp\n" \ + " pushq %rsi\n" \ + " pushq %rdi\n" \ + " pushq %rsp \n" /* set TrapFrame::regs */ \ + " subq $" __STRINGIFY(TRAP_FRAME_SIZE - 8) ", %rsp \n" \ + " subq $0x8, %rsp\n" /* align stack */ \ + " lea 0x8(%rsp), %rdi \n" \ + " cld\n" \ + " call enter_trap_no_irq \n" \ + " lea 0x8(%rsp), %rdi \n" \ + " call " #title "_handler\n" \ + " addq $0x8, %rsp\n" /* undo alignment */ \ " jmp common_trap_exit \n"); -#define EH_ENTRY_NO_CODE(ec, title) \ - extern "C" void title##_handler(TrapFrame*); \ - extern "C" void title##_asm_entry(); \ -asm( \ - ".globl " #title "_asm_entry\n" \ - "" #title "_asm_entry: \n" \ - " pushq $0x0\n" \ - " pushq %r15\n" \ - " pushq %r14\n" \ - " pushq %r13\n" \ - " pushq %r12\n" \ - " pushq %r11\n" \ - " pushq %r10\n" \ - " pushq %r9\n" \ - " pushq %r8\n" \ - " pushq %rax\n" \ - " pushq %rcx\n" \ - " pushq %rdx\n" \ - " pushq %rbx\n" \ - " pushq %rsp\n" \ - " pushq %rbp\n" \ - " pushq %rsi\n" \ - " pushq %rdi\n" \ - " pushq %rsp \n" /* set TrapFrame::regs */ \ - " subq $" __STRINGIFY(TRAP_FRAME_SIZE - 8) ", %rsp \n" \ - " movq %rsp, %rdi \n" \ - " cld\n" \ - " call enter_trap_no_irq \n" \ - " movq %rsp, %rdi \n" \ - " call " #title "_handler\n" \ +#define EH_ENTRY_NO_CODE(ec, title) \ + extern "C" void title##_handler(TrapFrame*) __attribute__((used)); \ + extern "C" void title##_asm_entry(); \ +asm( \ + ".globl " #title "_asm_entry\n" \ + "" #title "_asm_entry: \n" \ + " pushq $0x0\n" \ + " pushq %r15\n" \ + " pushq %r14\n" \ + " pushq %r13\n" \ + " pushq %r12\n" \ + " pushq %r11\n" \ + " pushq %r10\n" \ + " pushq %r9\n" \ + " pushq %r8\n" \ + " pushq %rax\n" \ + " pushq %rcx\n" \ + " pushq %rdx\n" \ + " pushq %rbx\n" \ + " pushq %rsp\n" \ + " pushq %rbp\n" \ + " pushq %rsi\n" \ + " pushq %rdi\n" \ + " pushq %rsp \n" /* set TrapFrame::regs */ \ + " subq $" __STRINGIFY(TRAP_FRAME_SIZE - 8) ", %rsp \n" \ + " movq %rsp, %rdi \n" \ + " cld\n" \ + " call enter_trap_no_irq \n" \ + " movq %rsp, %rdi \n" \ + " call " #title "_handler\n" \ " jmp common_trap_exit \n"); #endif