Home | History | Annotate | Line # | Download | only in include
frame_regs.h revision 1.3.6.3
      1  1.3.6.3  yamt /*	$NetBSD: frame_regs.h,v 1.3.6.3 2008/02/11 14:59:26 yamt Exp $	*/
      2  1.3.6.2  yamt 
      3  1.3.6.2  yamt #ifndef _AMD64_FRAME_REGS_H_
      4  1.3.6.2  yamt #define _AMD64_FRAME_REGS_H_
      5  1.3.6.2  yamt 
      6  1.3.6.2  yamt /*
      7  1.3.6.2  yamt  * amd64 registers (and friends) ordered as in a trap/interrupt/syscall frame.
      8  1.3.6.2  yamt  * Also the indexes into the 'general register state' (__greg_t) passed to
      9  1.3.6.2  yamt  * userland.
     10  1.3.6.2  yamt  * Historically they were in the same order, but the order in the frames
     11  1.3.6.2  yamt  * has been changed to improve syscall efficiency.
     12  1.3.6.2  yamt  *
     13  1.3.6.2  yamt  * Notes:
     14  1.3.6.2  yamt  * 1) gdb (src/gnu/dist/gdb6/gdb/amd64nbsd-tdep.c) has a lookup table that
     15  1.3.6.2  yamt  *    assumes the __greg_t ordering.
     16  1.3.6.2  yamt  * 2) src/lib/libc/arch/x86_64/gen/makecontext.c assumes that the first
     17  1.3.6.2  yamt  *    6 entries in the __greg_t array match the registers used to pass
     18  1.3.6.2  yamt  *    function arguments.
     19  1.3.6.3  yamt  * 3) The 'struct reg' from machine/reg.h has to match __greg_t.
     20  1.3.6.3  yamt  *    Since they are both arrays and indexed with the same tokens this
     21  1.3.6.3  yamt  *    shouldn't be a problem, but is rather confusing.
     22  1.3.6.3  yamt  *    This assumption is made in a lot of places!
     23  1.3.6.2  yamt  * 4) There might be other code out there that relies on the ordering.
     24  1.3.6.2  yamt  *
     25  1.3.6.2  yamt  * The first entries below match the registers used for syscall arguments
     26  1.3.6.3  yamt  * (%rcx is destroyed by the syscall instruction, the libc system call
     27  1.3.6.3  yamt  * stubs copy %rcx to %r10).
     28  1.3.6.2  yamt  * arg6-arg9 are copied from the user stack for system calls with more
     29  1.3.6.2  yamt  * than 6 args (SYS_MAXSYSARGS is 8, + 2 entries for SYS___SYSCALL).
     30  1.3.6.2  yamt  */
     31  1.3.6.2  yamt #define _FRAME_REG(greg, freg) 	\
     32  1.3.6.2  yamt 	greg(rdi, RDI, 0)	\
     33  1.3.6.2  yamt 	greg(rsi, RSI, 1)	\
     34  1.3.6.2  yamt 	greg(rdx, RDX, 2)	\
     35  1.3.6.2  yamt 	greg(r10, R10, 6)	\
     36  1.3.6.2  yamt 	greg(r8,  R8,  4)	\
     37  1.3.6.2  yamt 	greg(r9,  R9,  5)	\
     38  1.3.6.2  yamt 	freg(arg6, @,  @)	/* syscall arg from stack */ \
     39  1.3.6.2  yamt 	freg(arg7, @,  @)	/* syscall arg from stack */ \
     40  1.3.6.2  yamt 	freg(arg8, @,  @)	/* syscall arg from stack */ \
     41  1.3.6.2  yamt 	freg(arg9, @,  @)	/* syscall arg from stack */ \
     42  1.3.6.2  yamt 	greg(rcx, RCX, 3)	\
     43  1.3.6.2  yamt 	greg(r11, R11, 7)	\
     44  1.3.6.2  yamt 	greg(r12, R12, 8)	\
     45  1.3.6.2  yamt 	greg(r13, R13, 9)	\
     46  1.3.6.2  yamt 	greg(r14, R14, 10)	\
     47  1.3.6.2  yamt 	greg(r15, R15, 11)	\
     48  1.3.6.2  yamt 	greg(rbp, RBP, 12)	\
     49  1.3.6.2  yamt 	greg(rbx, RBX, 13)	\
     50  1.3.6.2  yamt 	greg(rax, RAX, 14)	\
     51  1.3.6.2  yamt 	greg(gs,  GS,  15)	\
     52  1.3.6.2  yamt 	greg(fs,  FS,  16)	\
     53  1.3.6.2  yamt 	greg(es,  ES,  17)	\
     54  1.3.6.2  yamt 	greg(ds,  DS,  18)	\
     55  1.3.6.2  yamt 	greg(trapno, TRAPNO, 19)	\
     56  1.3.6.2  yamt 	/* below portion defined in hardware */ \
     57  1.3.6.2  yamt 	greg(err, ERR, 20)	/* Dummy inserted if not defined */ \
     58  1.3.6.2  yamt 	greg(rip, RIP, 21)	\
     59  1.3.6.2  yamt 	greg(cs,  CS,  22)	\
     60  1.3.6.2  yamt 	greg(rflags, RFLAGS, 23)	\
     61  1.3.6.2  yamt 	/* These are pushed unconditionally on the x86-64 */ \
     62  1.3.6.2  yamt 	greg(rsp, RSP, 24)	\
     63  1.3.6.2  yamt 	greg(ss,  SS,  25)
     64  1.3.6.2  yamt 
     65  1.3.6.2  yamt #define _FRAME_NOREG(reg, REG, idx)
     66  1.3.6.2  yamt 
     67  1.3.6.2  yamt #define _FRAME_GREG(greg) _FRAME_REG(greg, _FRAME_NOREG)
     68  1.3.6.2  yamt 
     69  1.3.6.2  yamt #endif
     70