2 * Interrupt handlers for GDB stub
5 #define SIZEOF_I386_REGS 32
6 #define SIZEOF_I386_FLAGS 4
8 /****************************************************************************
10 ****************************************************************************
12 .section ".text", "ax", @progbits
15 /* POSIX signal numbers for reporting traps to GDB */
26 .globl gdbmach_sigtrap
31 .globl gdbmach_sigstkflt
41 /* When invoked, the stack contains: eflags, cs, eip, signo. */
42 #define IH_OFFSET_GDB_REGS ( 0 )
43 #define IH_OFFSET_GDB_EIP ( IH_OFFSET_GDB_REGS + SIZEOF_I386_REGS )
44 #define IH_OFFSET_GDB_EFLAGS ( IH_OFFSET_GDB_EIP + 4 )
45 #define IH_OFFSET_GDB_SEG_REGS ( IH_OFFSET_GDB_EFLAGS + SIZEOF_I386_FLAGS )
46 #define IH_OFFSET_GDB_END ( IH_OFFSET_GDB_SEG_REGS + 6 * 4 )
47 #define IH_OFFSET_SIGNO ( IH_OFFSET_GDB_END )
48 #define IH_OFFSET_OLD_EIP ( IH_OFFSET_SIGNO + 4 )
49 #define IH_OFFSET_OLD_CS ( IH_OFFSET_OLD_EIP + 4 )
50 #define IH_OFFSET_OLD_EFLAGS ( IH_OFFSET_OLD_CS + 4 )
51 #define IH_OFFSET_END ( IH_OFFSET_OLD_EFLAGS + 4 )
53 /* We also access the stack whilst still storing or restoring
54 * the register snapshot. Since ESP is in flux, we need
57 #define IH_OFFSET_FLUX_OLD_CS ( IH_OFFSET_OLD_CS - 44 )
58 #define IH_OFFSET_FLUX_OLD_EFLAGS ( IH_OFFSET_OLD_EFLAGS - 40 )
59 #define IH_OFFSET_FLUX_OLD_EIP ( IH_OFFSET_OLD_EIP - 36 )
60 #define IH_OFFSET_FLUX_END ( IH_OFFSET_END - 20 )
62 /* Store CPU state in GDB register snapshot */
74 pushw IH_OFFSET_FLUX_OLD_CS + 2(%esp)
75 pushl IH_OFFSET_FLUX_OLD_EFLAGS(%esp)
76 pushl IH_OFFSET_FLUX_OLD_EIP(%esp)
80 leal IH_OFFSET_FLUX_END(%esp), %edi
81 pushl %edi /* old ESP */
87 /* Switch to virtual addressing */
90 /* Call GDB stub exception handler */
92 pushl (IH_OFFSET_SIGNO + 4)(%esp)
96 /* Copy register snapshot to new stack and switch to new stack */
98 movl (IH_OFFSET_GDB_SEG_REGS + 4)(%esp), %eax
100 movl (IH_OFFSET_GDB_REGS + 16)(%esp), %edi
101 subl $IH_OFFSET_END, %edi
102 movl $(IH_OFFSET_END / 4), %ecx
109 /* Restore CPU state from GDB register snapshot */
114 popl %ebp /* Skip %esp: already loaded */
118 popl IH_OFFSET_FLUX_OLD_EIP(%esp)
119 popl IH_OFFSET_FLUX_OLD_EFLAGS(%esp)
120 popl IH_OFFSET_FLUX_OLD_CS(%esp)
121 popl %ds /* Skip %ss: already loaded */
127 addl $4, %esp /* drop signo */