/* OBSOLETE /* Low level interface to ns532 running mach 3.0. */ /* OBSOLETE Copyright 1992, 1993, 1998, 2000, 2001 Free Software Foundation, Inc. */ /* OBSOLETE */ /* OBSOLETE This file is part of GDB. */ /* OBSOLETE */ /* OBSOLETE This program is free software; you can redistribute it and/or modify */ /* OBSOLETE it under the terms of the GNU General Public License as published by */ /* OBSOLETE the Free Software Foundation; either version 2 of the License, or */ /* OBSOLETE (at your option) any later version. */ /* OBSOLETE */ /* OBSOLETE This program is distributed in the hope that it will be useful, */ /* OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* OBSOLETE GNU General Public License for more details. */ /* OBSOLETE */ /* OBSOLETE You should have received a copy of the GNU General Public License */ /* OBSOLETE along with this program; if not, write to the Free Software */ /* OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, */ /* OBSOLETE Boston, MA 02111-1307, USA. */ */ /* OBSOLETE */ /* OBSOLETE#include "defs.h" */ /* OBSOLETE#include "inferior.h" */ /* OBSOLETE#include "regcache.h" */ /* OBSOLETE */ /* OBSOLETE#include */ /* OBSOLETE */ /* OBSOLETE#include */ /* OBSOLETE#include */ /* OBSOLETE#include */ /* OBSOLETE#include */ /* OBSOLETE */ /* OBSOLETE#define private static */ /* OBSOLETE */ /* OBSOLETE */ /* OBSOLETE/* Find offsets to thread states at compile time. */ /* OBSOLETE * If your compiler does not grok this, calculate offsets */ /* OBSOLETE * offsets yourself and use them (or get a compatible compiler :-) */ /* OBSOLETE */ */ /* OBSOLETE */ /* OBSOLETE#define REG_N_OFFSET(reg) (int)(&((struct ns532_combined_state *)0)->ts.reg) */ /* OBSOLETE#define REG_F_OFFSET(reg) (int)(&((struct ns532_combined_state *)0)->fs.reg) */ /* OBSOLETE */ /* OBSOLETE/* at reg_offset[i] is the offset to the ns532_combined_state */ /* OBSOLETE * location where the gdb registers[i] is stored. */ /* OBSOLETE */ */ /* OBSOLETE */ /* OBSOLETEstatic int reg_offset[] = */ /* OBSOLETE{ */ /* OBSOLETE REG_N_OFFSET (r0), REG_N_OFFSET (r1), REG_N_OFFSET (r2), REG_N_OFFSET (r3), */ /* OBSOLETE REG_N_OFFSET (r4), REG_N_OFFSET (r5), REG_N_OFFSET (r6), REG_N_OFFSET (r7), */ /* OBSOLETE REG_F_OFFSET (l0a), REG_F_OFFSET (l0b), REG_F_OFFSET (l2a), REG_F_OFFSET (l2b), */ /* OBSOLETE REG_F_OFFSET (l4a), REG_F_OFFSET (l4b), REG_F_OFFSET (l6a), REG_F_OFFSET (l6b), */ /* OBSOLETEREG_N_OFFSET (sp), REG_N_OFFSET (fp), REG_N_OFFSET (pc), REG_N_OFFSET (psr), */ /* OBSOLETE REG_F_OFFSET (fsr), */ /* OBSOLETE REG_F_OFFSET (l0a), REG_F_OFFSET (l1a), REG_F_OFFSET (l2a), REG_F_OFFSET (l3a), */ /* OBSOLETE REG_F_OFFSET (l4a), REG_F_OFFSET (l5a), REG_F_OFFSET (l6a), REG_F_OFFSET (l7a), */ /* OBSOLETE}; */ /* OBSOLETE */ /* OBSOLETE#define REG_ADDRESS(state,regnum) ((char *)(state)+reg_offset[regnum]) */ /* OBSOLETE */ /* OBSOLETE/* Fetch COUNT contiguous registers from thread STATE starting from REGNUM */ /* OBSOLETE * Caller knows that the regs handled in one transaction are of same size. */ /* OBSOLETE */ */ /* OBSOLETE#define FETCH_REGS(state, regnum, count) \ */ /* OBSOLETE memcpy (®isters[REGISTER_BYTE (regnum)], \ */ /* OBSOLETE (char *)state+reg_offset[ regnum ], \ */ /* OBSOLETE count*REGISTER_SIZE) */ /* OBSOLETE */ /* OBSOLETE/* Store COUNT contiguous registers to thread STATE starting from REGNUM */ */ /* OBSOLETE#define STORE_REGS(state, regnum, count) \ */ /* OBSOLETE memcpy ((char *)state+reg_offset[ regnum ], \ */ /* OBSOLETE ®isters[REGISTER_BYTE (regnum)], \ */ /* OBSOLETE count*REGISTER_SIZE) */ /* OBSOLETE */ /* OBSOLETE/* */ /* OBSOLETE * Fetch inferiors registers for gdb. */ /* OBSOLETE * REGNO specifies which (as gdb views it) register, -1 for all. */ /* OBSOLETE */ */ /* OBSOLETE */ /* OBSOLETEvoid */ /* OBSOLETEfetch_inferior_registers (int regno) */ /* OBSOLETE{ */ /* OBSOLETE kern_return_t ret; */ /* OBSOLETE thread_state_data_t state; */ /* OBSOLETE unsigned int stateCnt = NS532_COMBINED_STATE_COUNT; */ /* OBSOLETE int index; */ /* OBSOLETE */ /* OBSOLETE if (!MACH_PORT_VALID (current_thread)) */ /* OBSOLETE error ("fetch inferior registers: Invalid thread"); */ /* OBSOLETE */ /* OBSOLETE if (must_suspend_thread) */ /* OBSOLETE setup_thread (current_thread, 1); */ /* OBSOLETE */ /* OBSOLETE ret = thread_get_state (current_thread, */ /* OBSOLETE NS532_COMBINED_STATE, */ /* OBSOLETE state, */ /* OBSOLETE &stateCnt); */ /* OBSOLETE */ /* OBSOLETE if (ret != KERN_SUCCESS) */ /* OBSOLETE warning ("fetch_inferior_registers: %s ", */ /* OBSOLETE mach_error_string (ret)); */ /* OBSOLETE#if 0 */ /* OBSOLETE /* It may be more effective to store validate all of them, */ /* OBSOLETE * since we fetched them all anyway */ /* OBSOLETE */ */ /* OBSOLETE else if (regno != -1) */ /* OBSOLETE supply_register (regno, (char *) state + reg_offset[regno]); */ /* OBSOLETE#endif */ /* OBSOLETE else */ /* OBSOLETE { */ /* OBSOLETE for (index = 0; index < NUM_REGS; index++) */ /* OBSOLETE supply_register (index, (char *) state + reg_offset[index]); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE if (must_suspend_thread) */ /* OBSOLETE setup_thread (current_thread, 0); */ /* OBSOLETE} */ /* OBSOLETE */ /* OBSOLETE/* Store our register values back into the inferior. */ /* OBSOLETE * If REGNO is -1, do this for all registers. */ /* OBSOLETE * Otherwise, REGNO specifies which register */ /* OBSOLETE * */ /* OBSOLETE * On mach3 all registers are always saved in one call. */ /* OBSOLETE */ */ /* OBSOLETEvoid */ /* OBSOLETEstore_inferior_registers (int regno) */ /* OBSOLETE{ */ /* OBSOLETE kern_return_t ret; */ /* OBSOLETE thread_state_data_t state; */ /* OBSOLETE unsigned int stateCnt = NS532_COMBINED_STATE_COUNT; */ /* OBSOLETE register int index; */ /* OBSOLETE */ /* OBSOLETE if (!MACH_PORT_VALID (current_thread)) */ /* OBSOLETE error ("store inferior registers: Invalid thread"); */ /* OBSOLETE */ /* OBSOLETE if (must_suspend_thread) */ /* OBSOLETE setup_thread (current_thread, 1); */ /* OBSOLETE */ /* OBSOLETE /* Fetch the state of the current thread */ */ /* OBSOLETE ret = thread_get_state (current_thread, */ /* OBSOLETE NS532_COMBINED_STATE, */ /* OBSOLETE state, */ /* OBSOLETE &stateCnt); */ /* OBSOLETE */ /* OBSOLETE if (ret != KERN_SUCCESS) */ /* OBSOLETE { */ /* OBSOLETE warning ("store_inferior_registers (get): %s", */ /* OBSOLETE mach_error_string (ret)); */ /* OBSOLETE if (must_suspend_thread) */ /* OBSOLETE setup_thread (current_thread, 0); */ /* OBSOLETE return; */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE /* move gdb's registers to thread's state */ /* OBSOLETE */ /* OBSOLETE * Since we save all registers anyway, save the ones */ /* OBSOLETE * that gdb thinks are valid (e.g. ignore the regno */ /* OBSOLETE * parameter) */ /* OBSOLETE */ */ /* OBSOLETE#if 0 */ /* OBSOLETE if (regno != -1) */ /* OBSOLETE STORE_REGS (state, regno, 1); */ /* OBSOLETE else */ /* OBSOLETE#endif */ /* OBSOLETE { */ /* OBSOLETE for (index = 0; index < NUM_REGS; index++) */ /* OBSOLETE STORE_REGS (state, index, 1); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE /* Write gdb's current view of register to the thread */ /* OBSOLETE */ */ /* OBSOLETE ret = thread_set_state (current_thread, */ /* OBSOLETE NS532_COMBINED_STATE, */ /* OBSOLETE state, */ /* OBSOLETE NS532_COMBINED_STATE_COUNT); */ /* OBSOLETE */ /* OBSOLETE if (ret != KERN_SUCCESS) */ /* OBSOLETE warning ("store_inferior_registers (set): %s", */ /* OBSOLETE mach_error_string (ret)); */ /* OBSOLETE */ /* OBSOLETE if (must_suspend_thread) */ /* OBSOLETE setup_thread (current_thread, 0); */ /* OBSOLETE} */