aboutsummaryrefslogtreecommitdiff
path: root/arch_x86/gdbstub_int.nasm
diff options
context:
space:
mode:
authorMatt Borgerson <contact@mborgerson.com>2019-12-17 19:47:47 -0700
committerMatt Borgerson <contact@mborgerson.com>2019-12-17 19:47:47 -0700
commit77eb93ce4eaf9667e1261fa7be0a9e9f8cc4d949 (patch)
tree98752e56525f9978d033beaf38f1c1471cd5e09b /arch_x86/gdbstub_int.nasm
parentaf1a586beb952808238834a4d65531936a97f0de (diff)
downloadgdbstub-77eb93ce4eaf9667e1261fa7be0a9e9f8cc4d949.tar.gz
Rename x86 dir to arch_x86
Diffstat (limited to 'arch_x86/gdbstub_int.nasm')
-rw-r--r--arch_x86/gdbstub_int.nasm110
1 files changed, 110 insertions, 0 deletions
diff --git a/arch_x86/gdbstub_int.nasm b/arch_x86/gdbstub_int.nasm
new file mode 100644
index 0000000..2495971
--- /dev/null
+++ b/arch_x86/gdbstub_int.nasm
@@ -0,0 +1,110 @@
+;
+; Copyright (c) 2016-2019 Matt Borgerson
+;
+; Permission is hereby granted, free of charge, to any person obtaining a copy
+; of this software and associated documentation files (the "Software"), to deal
+; in the Software without restriction, including without limitation the rights
+; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+; copies of the Software, and to permit persons to whom the Software is
+; furnished to do so, subject to the following conditions:
+;
+; The above copyright notice and this permission notice shall be included in
+; all copies or substantial portions of the Software.
+;
+; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+; SOFTWARE.
+;
+
+bits 32
+
+%define NUM_HANDLERS 32
+
+section .data
+global dbg_int_handlers
+
+; Generate table of handlers
+dbg_int_handlers:
+%macro handler_addr 1
+ dd dbg_int_handler_%1
+%endmacro
+%assign i 0
+%rep NUM_HANDLERS
+ handler_addr i
+ %assign i i+1
+%endrep
+
+section .text
+extern dbg_int_handler
+
+%macro int 1
+dbg_int_handler_%1:
+ push 0 ; Dummy Error code
+ push %1 ; Interrupt Vector
+ jmp dbg_int_handler_common
+%endmacro
+
+%macro inte 1
+dbg_int_handler_%1:
+ ; Error code already on stack
+ push %1 ; Interrupt Vector
+ jmp dbg_int_handler_common
+%endmacro
+
+; Generate Interrupt Handlers
+%assign i 0
+%rep NUM_HANDLERS
+ %if (i == 8) || ((i >= 10) && (i <= 14)) || (i == 17)
+ inte i
+ %else
+ int i
+ %endif
+%assign i i+1
+%endrep
+
+; Common Interrupt Handler
+dbg_int_handler_common:
+ pushad
+ push ds
+ push es
+ push fs
+ push gs
+ push ss
+ mov ebp, esp
+
+ ; Stack:
+ ; - EFLAGS
+ ; - CS
+ ; - EIP
+ ; - ERROR CODE
+ ; - VECTOR
+ ; - EAX
+ ; - ECX
+ ; - EDX
+ ; - EBX
+ ; - ESP
+ ; - EBP
+ ; - ESI
+ ; - EDI
+ ; - DS
+ ; - ES
+ ; - FS
+ ; - GS
+ ; - SS
+
+ push ebp
+ call dbg_int_handler
+
+ mov esp, ebp
+ pop ss
+ pop gs
+ pop fs
+ pop es
+ pop ds
+ popad
+ add esp, 8 ; Pop error & vector
+ iret