NetBSD/sys/arch/x86_64/include/frameasm.h

75 lines
1.6 KiB
C

/* $NetBSD: frameasm.h,v 1.4 2002/07/14 12:20:45 fvdl Exp $ */
#ifndef _X86_64_MACHINE_FRAMEASM_H
#define _X86_64_MACHINE_FRAMEASM_H
/*
* Macros to define pushing/popping frames for interrupts, traps
* and system calls. Currently all the same; will diverge later.
*/
/*
* These are used on interrupt or trap entry or exit.
*/
#define INTR_SAVE_GPRS \
subq $120,%rsp ; \
movq %r15,0(%rsp) ; \
movq %r14,8(%rsp) ; \
movq %r13,16(%rsp) ; \
movq %r12,24(%rsp) ; \
movq %r11,32(%rsp) ; \
movq %r10,40(%rsp) ; \
movq %r9,48(%rsp) ; \
movq %r8,56(%rsp) ; \
movq %rdi,64(%rsp) ; \
movq %rsi,72(%rsp) ; \
movq %rbp,80(%rsp) ; \
movq %rbx,88(%rsp) ; \
movq %rdx,96(%rsp) ; \
movq %rcx,104(%rsp) ; \
movq %rax,112(%rsp)
#define INTR_RESTORE_GPRS \
movq 0(%rsp),%r15 ; \
movq 8(%rsp),%r14 ; \
movq 16(%rsp),%r13 ; \
movq 24(%rsp),%r12 ; \
movq 32(%rsp),%r11 ; \
movq 40(%rsp),%r10 ; \
movq 48(%rsp),%r9 ; \
movq 56(%rsp),%r8 ; \
movq 64(%rsp),%rdi ; \
movq 72(%rsp),%rsi ; \
movq 80(%rsp),%rbp ; \
movq 88(%rsp),%rbx ; \
movq 96(%rsp),%rdx ; \
movq 104(%rsp),%rcx ; \
movq 112(%rsp),%rax ; \
addq $120,%rsp
#define INTRENTRY \
subq $32,%rsp ; \
testq $SEL_UPL,56(%rsp) ; \
je 98f ; \
swapgs ; \
movw %gs,0(%rsp) ; \
movw %fs,8(%rsp) ; \
movw %ds,16(%rsp) ; \
movw %es,24(%rsp) ; \
98: INTR_SAVE_GPRS
#define INTRFASTEXIT \
INTR_RESTORE_GPRS ; \
testq $SEL_UPL,56(%rsp) ; \
je 99f ; \
cli ; \
swapgs ; \
movw 0(%rsp),%gs ; \
movw 8(%rsp),%fs ; \
movw 16(%rsp),%ds ; \
movw 24(%rsp),%es ; \
99: addq $48,%rsp ; \
iretq
#endif /* _X86_64_MACHINE_FRAMEASM_H */