diff options
| author | Matt Borgerson <contact@mborgerson.com> | 2019-12-17 19:47:47 -0700 |
|---|---|---|
| committer | Matt Borgerson <contact@mborgerson.com> | 2019-12-17 19:47:47 -0700 |
| commit | 77eb93ce4eaf9667e1261fa7be0a9e9f8cc4d949 (patch) | |
| tree | 98752e56525f9978d033beaf38f1c1471cd5e09b /arch_x86/gdbstub_int.nasm | |
| parent | af1a586beb952808238834a4d65531936a97f0de (diff) | |
| download | gdbstub-77eb93ce4eaf9667e1261fa7be0a9e9f8cc4d949.tar.gz | |
Rename x86 dir to arch_x86
Diffstat (limited to 'arch_x86/gdbstub_int.nasm')
| -rw-r--r-- | arch_x86/gdbstub_int.nasm | 110 |
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 |
