( micsa | 2024. 07. 24., sze – 12:33 )

Akkor miszter nagyszájú, legyél kedves megmutatni, hol történik ez az állítólagos mindent mentés az alábbi forrásban, amikor a megszakítás konkrétan bekövetkezik:
 

a regiszterekről beszéltem...

csak úgy halkan mondom, hogy pl. az asm_sysvec_apic_timer_interrupt így kezdődik:

push    0FFFFFFFFFFFFFFFFh
call    error_entry
mov     rsp, rax
mov     rdi, rsp
call    sysvec_apic_timer_interrupt
jmp     error_return
 

az error_entry pedig (entry_64.S):

SYM_CODE_START(error_entry)
ANNOTATE_NOENDBR
UNWIND_HINT_FUNC

PUSH_AND_CLEAR_REGS save_ret=1
ENCODE_FRAME_POINTER 8

push    rsi
mov     rsi, [rsp+8]
mov     [rsp+8], rdi
push    rdx
push    rcx
push    rax
push    r8
push    r9
push    r10
push    r11
push    rbx
push    rbp
push    r12
push    r13
push    r14
push    r15
push    rsi
...

tudod, ezekből lesz a struct pt_regs *regs ...  🤭

DEFINE_IDTENTRY_SYSVEC(sysvec_apic_timer_interrupt)
{
       struct pt_regs *old_regs = set_irq_regs(regs);

        apic_eoi();
        trace_local_timer_entry(LOCAL_TIMER_VECTOR);
        local_apic_timer_interrupt();
        trace_local_timer_exit(LOCAL_TIMER_VECTOR);

        set_irq_regs(old_regs);
}