diff options
Diffstat (limited to 'gdb/gdbserver/nto-x86-low.c')
-rw-r--r-- | gdb/gdbserver/nto-x86-low.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/gdb/gdbserver/nto-x86-low.c b/gdb/gdbserver/nto-x86-low.c new file mode 100644 index 0000000..2bf1228 --- /dev/null +++ b/gdb/gdbserver/nto-x86-low.c @@ -0,0 +1,107 @@ +/* QNX Neutrino specific low level interface, for the remote server + for GDB. + Copyright (C) 2009 + Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + + +#include "nto-low.h" +#include "regdef.h" +#include "regcache.h" + +#include <x86/context.h> + + +/* Definition auto generated from reg-i386.dep. */ +extern void init_registers_i386 (); +extern struct reg *regs_i386; + +const unsigned char x86_breakpoint[] = { 0xCC }; +#define x86_breakpoint_len 1 + +/* Returns offset in appropriate Neutrino's context structure. + Defined in x86/context.h. + GDBREGNO is index into regs_i386 array. It is autogenerated and + hopefully doesn't change. */ +static int +nto_x86_register_offset (int gdbregno) +{ + if (gdbregno >= 0 && gdbregno < 16) + { + X86_CPU_REGISTERS *dummy = (void*)0; + /* GPRs */ + switch (gdbregno) + { + case 0: + return (int)&(dummy->eax); + case 1: + return (int)&(dummy->ecx); + case 2: + return (int)&(dummy->edx); + case 3: + return (int)&(dummy->ebx); + case 4: + return (int)&(dummy->esp); + case 5: + return (int)&(dummy->ebp); + case 6: + return (int)&(dummy->esi); + case 7: + return (int)&(dummy->edi); + case 8: + return (int)&(dummy->eip); + case 9: + return (int)&(dummy->efl); + case 10: + return (int)&(dummy->cs); + case 11: + return (int)&(dummy->ss); +#ifdef __SEGMENTS__ + case 12: + return (int)&(dummy->ds); + case 13: + return (int)&(dummy->es); + case 14: + return (int)&(dummy->fs); + case 15: + return (int)&(dummy->gs); +#endif + default: + return -1; + } + } + return -1; +} + +static void +nto_x86_arch_setup (void) +{ + init_registers_i386 (); + the_low_target.num_regs = 16; +} + +struct nto_target_ops the_low_target = +{ + nto_x86_arch_setup, + 0, /* num_regs */ + nto_x86_register_offset, + x86_breakpoint, + x86_breakpoint_len +}; + + + |