From 83ddcbcf977fdbd6a9065042bbb5384b95089345 Mon Sep 17 00:00:00 2001 From: christos Date: Sat, 18 Jan 2003 21:42:07 +0000 Subject: [PATCH] merge nathanw_sa --- gnu/dist/toolchain/gdb/alphanbsd-nat.c | 64 +++++-- gnu/dist/toolchain/gdb/armnbsd-nat.c | 91 +++++++--- gnu/dist/toolchain/gdb/config/nm-nbsd.h | 10 ++ gnu/dist/toolchain/gdb/configure.in | 11 ++ gnu/dist/toolchain/gdb/corelow.c | 3 +- gnu/dist/toolchain/gdb/i386nbsd-nat.c | 211 ++++++++++++++---------- gnu/dist/toolchain/gdb/kcore-nbsd.c | 3 +- gnu/dist/toolchain/gdb/ppcnbsd-nat.c | 88 +++++++--- 8 files changed, 344 insertions(+), 137 deletions(-) diff --git a/gnu/dist/toolchain/gdb/alphanbsd-nat.c b/gnu/dist/toolchain/gdb/alphanbsd-nat.c index 7c417dfd3ec6..a977fa92728a 100644 --- a/gnu/dist/toolchain/gdb/alphanbsd-nat.c +++ b/gnu/dist/toolchain/gdb/alphanbsd-nat.c @@ -90,6 +90,14 @@ supply_regs (regs) supply_register (PC_REGNUM, regs + (31 * 8)); } +static void +unsupply_regs (regs) + struct reg *regs; +{ + memcpy (®s->r_regs[0], ®isters[REGISTER_BYTE (V0_REGNUM)], 31 * 8); + memcpy (®s->r_regs[31], ®isters[REGISTER_BYTE (PC_REGNUM)], 8); +} + static void supply_fpregs (fregs) char *fregs; @@ -102,6 +110,42 @@ supply_fpregs (fregs) supply_register (FPCR_REGNUM, fregs + (32 * 8)); } +static void +unsupply_fpregs (fregs) + struct fpreg *fregs; +{ + memcpy (&fregs->fpr_regs[0], ®isters[REGISTER_BYTE (FP0_REGNUM)], 31 * 8); + memcpy (&fregs->fpr_cr, ®isters[REGISTER_BYTE (FPCR_REGNUM)], 8); +} + +void +nbsd_reg_to_internal (regs) + char *regs; +{ + supply_regs (regs); +} + +void +nbsd_fpreg_to_internal (fregs) + char *fregs; +{ + supply_fpregs (fregs); +} + +void +nbsd_internal_to_reg (regs) + char *regs; +{ + unsupply_regs (regs); +} + +void +nbsd_internal_to_fpreg (fregs) + char *fregs; +{ + unsupply_fpregs (fregs); +} + void fetch_inferior_registers (regno) int regno; @@ -111,15 +155,15 @@ fetch_inferior_registers (regno) if (regno == -1 || GETREGS_SUPPLIES (regno)) { - ptrace (PT_GETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_registers, 0); + ptrace (PT_GETREGS, GET_PROCESS (inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_registers, GET_LWP (inferior_pid)); supply_regs ((char *) &inferior_registers); } if (regno == -1 || regno >= FP0_REGNUM) { - ptrace (PT_GETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_fp_registers, 0); + ptrace (PT_GETFPREGS, GET_PROCESS (inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_fp_registers, GET_LWP (inferior_pid)); supply_fpregs ((char *) &inferior_fp_registers); } @@ -144,20 +188,20 @@ store_inferior_registers (regno) inferior_registers.r_regs[R_ZERO] = *(long *) ®isters[REGISTER_BYTE (PC_REGNUM)]; - ptrace (PT_SETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_registers, 0); + ptrace (PT_SETREGS, GET_PROCESS (inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_registers, GET_LWP (inferior_pid)); } if (regno == -1 || regno >= FP0_REGNUM) { memcpy (&inferior_fp_registers.fpr_regs[0], ®isters[REGISTER_BYTE (FP0_REGNUM)], - sizeof(inferior_fp_registers.fpr_regs)); + sizeof (inferior_fp_registers.fpr_regs)); memcpy (&inferior_fp_registers.fpr_cr, ®isters[REGISTER_BYTE (FPCR_REGNUM)], - sizeof(inferior_fp_registers.fpr_cr)); - ptrace (PT_SETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_fp_registers, 0); + sizeof (inferior_fp_registers.fpr_cr)); + ptrace (PT_SETFPREGS, GET_PROCESS (inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_fp_registers, GET_LWP (inferior_pid)); } } diff --git a/gnu/dist/toolchain/gdb/armnbsd-nat.c b/gnu/dist/toolchain/gdb/armnbsd-nat.c index 7ce2f3422671..58f9faae7e0c 100644 --- a/gnu/dist/toolchain/gdb/armnbsd-nat.c +++ b/gnu/dist/toolchain/gdb/armnbsd-nat.c @@ -59,44 +59,97 @@ supply_struct_reg (struct reg *reg) arm_apcs_32 = (read_register (PS_REGNUM) & PSR_MODE_32) != 0; } +static void +unsupply_struct_reg (struct reg *reg) +{ + int i; + + for (i = 0; i < 13; i++) + read_register_gen (A1_REGNUM + i, (char *)®->r[i]); + read_register_gen (SP_REGNUM, (char *)®->r_sp); + read_register_gen (LR_REGNUM, (char *)®->r_lr); + read_register_gen (PS_REGNUM, (char *)®->r_cpsr); + if ((reg->r_cpsr & PSR_MODE_32)) + read_register_gen (PC_REGNUM, (char *)®->r_pc); + else + arm_read_26bit_r15 ((char *)®->r_pc); +} + +static void +supply_struct_fpreg (struct fpreg *freg) +{ + int i; + + for (i = 0; i < 8; i++) + supply_register (F0_REGNUM + i, (char *)&freg->fpr[i]); + supply_register (FPS_REGNUM, (char *)&freg->fpr_fpsr); +} + +static void +unsupply_struct_fpreg (struct fpreg *freg) +{ + memcpy (&freg->fpr[0], ®isters[REGISTER_BYTE (F0_REGNUM)], sizeof (freg->fpr)); + memcpy (&freg->fpr_fpsr, ®isters[REGISTER_BYTE (FPS_REGNUM)], sizeof (freg->fpr_fpsr)); +} + +void +nbsd_reg_to_internal (regs) + char *regs; +{ + supply_struct_reg ((struct reg *)regs); +} + +void +nbsd_fpreg_to_internal (fregs) + char *fregs; +{ + supply_struct_fpreg ((struct fpreg *)fregs); +} + +void +nbsd_internal_to_reg (regs) + char *regs; +{ + unsupply_struct_reg ((struct reg *)regs); +} + +void +nbsd_internal_to_fpreg (fregs) + char *fregs; +{ + unsupply_struct_fpreg ((struct fpreg *)fregs); +} void fetch_inferior_registers (int regno) { struct reg inferior_registers; struct fpreg inferior_fpregisters; - int i; /* Integer registers */ - ptrace (PT_GETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_registers, 0); + ptrace (PT_GETREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_registers, GET_LWP(inferior_pid)); supply_struct_reg (&inferior_registers); /* FPA registers */ - ptrace (PT_GETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_fpregisters, - 0); - for (i = 0; i < 8; i++) - supply_register (F0_REGNUM + i, (char *)&inferior_fpregisters.fpr[i]); - supply_register (FPS_REGNUM, (char *)&inferior_fpregisters.fpr_fpsr); + ptrace (PT_GETFPREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_fpregisters, GET_LWP(inferior_pid)); + supply_struct_fpreg(&inferior_fpregisters); } void store_inferior_registers (int regno) { struct reg inferior_registers; - int i; + struct fpreg inferior_fpregisters; - for (i = 0; i < 13; i++) - read_register_gen (A1_REGNUM + i, (char *)&inferior_registers.r[i]); - read_register_gen (SP_REGNUM, (char *)&inferior_registers.r_sp); - read_register_gen (LR_REGNUM, (char *)&inferior_registers.r_lr); - if ((inferior_registers.r_cpsr & PSR_MODE_32)) - read_register_gen (PC_REGNUM, (char *)&inferior_registers.r_pc); - else - arm_read_26bit_r15 ((char *)&inferior_registers.r_pc); - read_register_gen (PS_REGNUM, (char *)&inferior_registers.r_cpsr); - ptrace (PT_SETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inferior_registers, 0); + unsupply_struct_reg (&inferior_registers); + ptrace (PT_SETREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_registers, GET_LWP(inferior_pid)); - /* XXX Set FP regs. */ + unsupply_struct_fpreg (&inferior_fpregisters); + ptrace (PT_SETFPREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_registers, GET_LWP(inferior_pid)); } struct md_core diff --git a/gnu/dist/toolchain/gdb/config/nm-nbsd.h b/gnu/dist/toolchain/gdb/config/nm-nbsd.h index 3c711a250729..79cde49dd513 100644 --- a/gnu/dist/toolchain/gdb/config/nm-nbsd.h +++ b/gnu/dist/toolchain/gdb/config/nm-nbsd.h @@ -38,6 +38,16 @@ #define PTRACE_ARG3_TYPE char* +/* Macros for manipulating pid/lwpid/threadid aggregates in archnbsd-nat.c and + nbsd-thread.c */ +#define THREAD_FLAG 0x80000000 +#define IS_THREAD(ARG) (((ARG) & THREAD_FLAG) != 0) +#define GET_THREAD(PID) (((PID) >> 16) & 0x7fff) +#define GET_LWP(PID) (((PID) >> 16) & 0x7fff) +#define GET_PROCESS(PID) ((PID) & 0xffff) +#define BUILD_THREAD(TID, PID) ((TID) << 16 | (PID) | THREAD_FLAG) +#define BUILD_LWP(TID, PID) ((TID) << 16 | (PID)) + #if !defined(NO_SOLIB) #include "solib.h" /* Support for shared libraries. */ diff --git a/gnu/dist/toolchain/gdb/configure.in b/gnu/dist/toolchain/gdb/configure.in index 25ed3650fc2e..643780fc519d 100644 --- a/gnu/dist/toolchain/gdb/configure.in +++ b/gnu/dist/toolchain/gdb/configure.in @@ -409,6 +409,17 @@ if test ${build} = ${host} -a ${host} = ${target} ; then AC_MSG_RESULT(no) fi ;; + netbsd*) + AC_MSG_CHECKING(for NetBSD thread debugging library) + if test -f /usr/include/pthread_dbg.h ; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_THREAD_DB_LIB) + CONFIG_OBS="${CONFIG_OBS} nbsd-thread.o" + CONFIG_SRCS="${CONFIG_SRCS} nbsd-thread.c" + CONFIG_LDFLAGS="${CONFIG_LDFLAGS} -lpthread_dbg" + else + AC_MSG_RESULT(no) + fi esac AC_SUBST(CONFIG_LDFLAGS) fi diff --git a/gnu/dist/toolchain/gdb/corelow.c b/gnu/dist/toolchain/gdb/corelow.c index d5998f4c42df..78c5899d5705 100644 --- a/gnu/dist/toolchain/gdb/corelow.c +++ b/gnu/dist/toolchain/gdb/corelow.c @@ -333,9 +333,10 @@ core_open (filename, from_tty) /* Build up thread list from BFD sections. */ init_thread_list (); +#if 0 /* XXX nathanw */ bfd_map_over_sections (core_bfd, add_to_thread_list, bfd_get_section_by_name (core_bfd, ".reg")); - +#endif if (ontop) { /* Fetch all registers from core file. */ diff --git a/gnu/dist/toolchain/gdb/i386nbsd-nat.c b/gnu/dist/toolchain/gdb/i386nbsd-nat.c index 98ce62f2491c..30dc2526d64d 100644 --- a/gnu/dist/toolchain/gdb/i386nbsd-nat.c +++ b/gnu/dist/toolchain/gdb/i386nbsd-nat.c @@ -59,8 +59,8 @@ struct xmmctx { unsigned short control; unsigned short status; - unsigned char tag; /* abridged */ unsigned char r0; + unsigned char tag; /* abridged */ unsigned short opcode; unsigned long eip; unsigned short code_seg; @@ -105,6 +105,28 @@ supply_regs (regs) RF (15, regs->r_gs); } +static void +unsupply_regs (regs) + struct reg *regs; +{ + RS ( 0, regs->r_eax); + RS ( 1, regs->r_ecx); + RS ( 2, regs->r_edx); + RS ( 3, regs->r_ebx); + RS ( 4, regs->r_esp); + RS ( 5, regs->r_ebp); + RS ( 6, regs->r_esi); + RS ( 7, regs->r_edi); + RS ( 8, regs->r_eip); + RS ( 9, regs->r_eflags); + RS (10, regs->r_cs); + RS (11, regs->r_ss); + RS (12, regs->r_ds); + RS (13, regs->r_es); + RS (14, regs->r_fs); + RS (15, regs->r_gs); +} + static void supply_387regs (s87) struct env387 *s87; @@ -126,6 +148,27 @@ supply_387regs (s87) RF (FOP_REGNUM, s87->opcode); } +static void +unsupply_387regs(s87) + struct env387 *s87; +{ + int i; + + for (i = 0; i < 8; i++) + { + RF (FP0_REGNUM + i, s87->regs[i]); + } + + RS (FCTRL_REGNUM, s87->control); + RS (FSTAT_REGNUM, s87->status); + RS (FTAG_REGNUM, s87->tag); + RS (FCS_REGNUM, s87->code_seg); + RS (FCOFF_REGNUM, s87->eip); + RS (FDS_REGNUM, s87->operand_seg); + RS (FDOFF_REGNUM, s87->operand); + RS (FOP_REGNUM, s87->opcode); +} + #ifdef PT_GETXMMREGS static void supply_xmmregs (sxmm) @@ -209,8 +252,74 @@ supply_xmmregs (sxmm) RF (MXCSR_REGNUM, sxmm->mxcsr); } + +static void +unsupply_xmmregs (sxmm) + struct xmmctx *sxmm; +{ + unsigned short tag; + int i; + + for (i = 0; i < 8; i++) + { + RS (FP0_REGNUM + i, sxmm->fpregs[i].fp_bytes); + RS (XMM0_REGNUM + i, sxmm->sseregs[i].sse_bytes); + } + + /* Note: even though there's no padding after the 16-bit + registers, because we copy only as much as the destination + will hold *and* we're little-endian, this all works out + fine. */ + + RS (FCTRL_REGNUM, sxmm->control); + RS (FSTAT_REGNUM, sxmm->status); + RS (FCS_REGNUM, sxmm->code_seg); + RS (FCOFF_REGNUM, sxmm->eip); + RS (FDS_REGNUM, sxmm->operand_seg); + RS (FDOFF_REGNUM, sxmm->operand); + + /* GDB has provided as the "tag" info in i387 format, but the + kernel expects it to be in XMM format; convert it. */ + RS (FTAG_REGNUM, tag); + for (sxmm->tag = 0, i = 0; i < 8; i++) + { + if (((tag >> (i * 2)) & 3) != 3) + { + sxmm->tag |= (1U << i); + } + } + + RS (MXCSR_REGNUM, sxmm->mxcsr); +} #endif +void +nbsd_reg_to_internal(regs) + char *regs; +{ + supply_regs(regs); +} +void +nbsd_fpreg_to_internal(fregs) + char *fregs; +{ + supply_387regs(fregs); +} + +void +nbsd_internal_to_reg(regs) + char *regs; +{ + unsupply_regs(regs); +} + +void +nbsd_internal_to_fpreg(regs) + char *regs; +{ + unsupply_387regs(regs); +} + void fetch_inferior_registers (regno) int regno; @@ -221,25 +330,25 @@ fetch_inferior_registers (regno) struct xmmctx inferior_xmmregisters; #endif - ptrace (PT_GETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_registers, 0); + ptrace (PT_GETREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_registers, GET_LWP(inferior_pid)); #ifdef PT_GETXMMREGS if (have_ptrace_xmmregs != 0 && - ptrace(PT_GETXMMREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_xmmregisters, 0) == 0) + ptrace(PT_GETXMMREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_xmmregisters, GET_LWP(inferior_pid)) == 0) { have_ptrace_xmmregs = 1; } else { - ptrace (PT_GETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0); + ptrace (PT_GETFPREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_fpregisters, GET_LWP(inferior_pid)); have_ptrace_xmmregs = 0; } #else - ptrace (PT_GETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0); + ptrace (PT_GETFPREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_fpregisters, GET_LWP(inferior_pid)); #endif supply_regs (&inferior_registers); @@ -267,92 +376,26 @@ store_inferior_registers (regno) #ifdef PT_GETXMMREGS struct xmmctx inferior_xmmregisters; #endif - int i; - RS ( 0, inferior_registers.r_eax); - RS ( 1, inferior_registers.r_ecx); - RS ( 2, inferior_registers.r_edx); - RS ( 3, inferior_registers.r_ebx); - RS ( 4, inferior_registers.r_esp); - RS ( 5, inferior_registers.r_ebp); - RS ( 6, inferior_registers.r_esi); - RS ( 7, inferior_registers.r_edi); - RS ( 8, inferior_registers.r_eip); - RS ( 9, inferior_registers.r_eflags); - RS (10, inferior_registers.r_cs); - RS (11, inferior_registers.r_ss); - RS (12, inferior_registers.r_ds); - RS (13, inferior_registers.r_es); - RS (14, inferior_registers.r_fs); - RS (15, inferior_registers.r_gs); + unsupply_regs(&inferior_registers); #ifdef PT_GETXMMREGS if (have_ptrace_xmmregs != 0) - { - unsigned short tag; - - for (i = 0; i < 8; i++) - { - RS (FP0_REGNUM + i, inferior_xmmregisters.fpregs[i].fp_bytes); - RS (XMM0_REGNUM + i, inferior_xmmregisters.sseregs[i].sse_bytes); - } - - /* Note: even though there's no padding after the 16-bit - registers, because we copy only as much as the destination - will hold *and* we're little-endian, this all works out - fine. */ - - RS (FCTRL_REGNUM, inferior_xmmregisters.control); - RS (FSTAT_REGNUM, inferior_xmmregisters.status); - RS (FCS_REGNUM, inferior_xmmregisters.code_seg); - RS (FCOFF_REGNUM, inferior_xmmregisters.eip); - RS (FDS_REGNUM, inferior_xmmregisters.operand_seg); - RS (FDOFF_REGNUM, inferior_xmmregisters.operand); - RS (FOP_REGNUM, inferior_xmmregisters.opcode); - - /* GDB has provided as the "tag" info in i387 format, but the - kernel expects it to be in XMM format; convert it. */ - RS (FTAG_REGNUM, tag); - for (inferior_xmmregisters.tag = 0, i = 0; i < 8; i++) - { - if (((tag >> (i * 2)) & 3) != 3) - { - inferior_xmmregisters.tag |= (1U << i); - } - } - - RS (MXCSR_REGNUM, inferior_xmmregisters.mxcsr); - } + unsupply_xmmregs(&inferior_xmmregisters); else - { #endif - for (i = 0; i < 8; i++) - { - RS (FP0_REGNUM + i, inferior_fpregisters.regs[i]); - } + unsupply_387regs(&inferior_fpregisters); - RS (FCTRL_REGNUM, inferior_fpregisters.control); - RS (FSTAT_REGNUM, inferior_fpregisters.status); - RS (FTAG_REGNUM, inferior_fpregisters.tag); - RS (FCS_REGNUM, inferior_fpregisters.code_seg); - RS (FCOFF_REGNUM, inferior_fpregisters.eip); - RS (FDS_REGNUM, inferior_fpregisters.operand_seg); - RS (FDOFF_REGNUM, inferior_fpregisters.operand); - RS (FOP_REGNUM, inferior_fpregisters.opcode); -#ifdef PT_GETXMMREGS - } -#endif - - ptrace (PT_SETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_registers, 0); + ptrace (PT_SETREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_registers, GET_LWP(inferior_pid)); #ifdef PT_GETXMMREGS if (have_ptrace_xmmregs != 0) - ptrace (PT_SETXMMREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_xmmregisters, 0); + ptrace (PT_SETXMMREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_xmmregisters, GET_LWP(inferior_pid)); else #endif - ptrace (PT_SETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0); + ptrace (PT_SETFPREGS, GET_PROCESS(inferior_pid), + (PTRACE_ARG3_TYPE) &inferior_fpregisters, GET_LWP(inferior_pid)); } struct md_core diff --git a/gnu/dist/toolchain/gdb/kcore-nbsd.c b/gnu/dist/toolchain/gdb/kcore-nbsd.c index effc0f9b59fe..32cf01d62000 100644 --- a/gnu/dist/toolchain/gdb/kcore-nbsd.c +++ b/gnu/dist/toolchain/gdb/kcore-nbsd.c @@ -31,6 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include +#include #include #include #include @@ -380,7 +381,7 @@ set_proc_cmd(arg) addr = (CORE_ADDR)parse_and_eval_address(arg); /* Read the PCB address in proc structure. */ - addr += (int) &((struct proc *)0)->p_addr; + addr += (int) &((struct lwp *)0)->l_addr; if (kvread(addr, &val)) error("cannot read u area ptr"); diff --git a/gnu/dist/toolchain/gdb/ppcnbsd-nat.c b/gnu/dist/toolchain/gdb/ppcnbsd-nat.c index 8b1a165d637a..d4d5b9ac6ff4 100644 --- a/gnu/dist/toolchain/gdb/ppcnbsd-nat.c +++ b/gnu/dist/toolchain/gdb/ppcnbsd-nat.c @@ -45,6 +45,25 @@ supply_regs (regs) supply_register (PC_REGNUM, regs + (36 * 4)); } +static void +unsupply_regs (regs) + struct reg *regs; +{ + memcpy (regs->fixreg, ®isters[REGISTER_BYTE (GP0_REGNUM)], + sizeof (regs->fixreg)); + memcpy (®s->pc, ®isters[REGISTER_BYTE (PC_REGNUM)], + sizeof (regs->pc)); + memcpy (®s->cr, ®isters[REGISTER_BYTE (CR_REGNUM)], + sizeof (regs->cr)); + memcpy (®s->lr, ®isters[REGISTER_BYTE (LR_REGNUM)], + sizeof (regs->lr)); + memcpy (®s->ctr, ®isters[REGISTER_BYTE (CTR_REGNUM)], + sizeof (regs->ctr)); + memcpy (®s->xer, ®isters[REGISTER_BYTE (XER_REGNUM)], + sizeof (regs->xer)); + +} + static void supply_fpregs (fregs) char *fregs; @@ -55,6 +74,43 @@ supply_fpregs (fregs) supply_register (FP0_REGNUM + i, fregs + (i * 8)); } +static void +unsupply_fpregs (fregs) + struct fpreg *fregs; +{ + memset (fregs, 0, sizeof (*fregs)); + memcpy (fregs->fpreg, ®isters[REGISTER_BYTE (FP0_REGNUM)], sizeof (fregs->fpreg)); +} + +void +nbsd_reg_to_internal (regs) + char *regs; +{ + supply_regs (regs); +} + +void +nbsd_fpreg_to_internal (fregs) + char *fregs; +{ + supply_fpregs (fregs); +} + +void +nbsd_internal_to_reg (regs) + char *regs; +{ + unsupply_regs (regs); +} + + +void +nbsd_internal_to_fpreg (regs) + char *regs; +{ + unsupply_fpregs (regs); +} + void fetch_inferior_registers (regno) int regno; @@ -63,11 +119,13 @@ fetch_inferior_registers (regno) struct fpreg inffpreg; /* Integer registers */ - ptrace(PT_GETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &infreg, 0); + ptrace (PT_GETREGS, GET_PROCESS (inferior_pid), (PTRACE_ARG3_TYPE) &infreg, + GET_LWP (inferior_pid)); supply_regs ((char *) &infreg); /* Floating point registers */ - ptrace(PT_GETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inffpreg, 0); + ptrace (PT_GETFPREGS, GET_PROCESS (inferior_pid), (PTRACE_ARG3_TYPE) &inffpreg, + GET_LWP (inferior_pid)); supply_fpregs ((char *) &inffpreg); } @@ -78,28 +136,14 @@ store_inferior_registers (regno) struct reg infreg; struct fpreg inffpreg; - /* Integer registers */ - memcpy (infreg.fixreg, ®isters[REGISTER_BYTE (GP0_REGNUM)], - sizeof (infreg.fixreg)); - memcpy (&infreg.pc, ®isters[REGISTER_BYTE (PC_REGNUM)], - sizeof (infreg.pc)); - memcpy (&infreg.cr, ®isters[REGISTER_BYTE (CR_REGNUM)], - sizeof (infreg.cr)); - memcpy (&infreg.lr, ®isters[REGISTER_BYTE (LR_REGNUM)], - sizeof (infreg.lr)); - memcpy (&infreg.ctr, ®isters[REGISTER_BYTE (CTR_REGNUM)], - sizeof (infreg.ctr)); - memcpy (&infreg.xer, ®isters[REGISTER_BYTE (XER_REGNUM)], - sizeof (infreg.xer)); - - ptrace(PT_SETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &infreg, 0); + unsupply_regs ((char *)&infreg); + ptrace(PT_SETREGS, GET_PROCESS (inferior_pid), (PTRACE_ARG3_TYPE) &infreg, + GET_LWP (inferior_pid)); /* Floating point registers */ - memset(&inffpreg, 0, sizeof(inffpreg)); - memcpy(inffpreg.fpreg, ®isters[REGISTER_BYTE (FP0_REGNUM)], - sizeof(inffpreg.fpreg)); - - ptrace(PT_SETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &inffpreg, 0); + unsupply_fpregs (&inffpreg); + ptrace (PT_SETFPREGS, GET_PROCESS (inferior_pid), (PTRACE_ARG3_TYPE) &inffpreg, + GET_LWP (inferior_pid)); } static void