#include "server.h"
#include "linux-low.h"
#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
#endif
#define arm_num_regs 26
static int arm_regmap[] = {
0, 4, 8, 12, 16, 20, 24, 28,
32, 36, 40, 44, 48, 52, 56, 60,
-1, -1, -1, -1, -1, -1, -1, -1, -1,
64
};
static int
arm_cannot_store_register (int regno)
{
return (regno >= arm_num_regs);
}
static int
arm_cannot_fetch_register (int regno)
{
return (regno >= arm_num_regs);
}
extern int debug_threads;
static CORE_ADDR
arm_get_pc ()
{
unsigned long pc;
collect_register_by_name ("pc", &pc);
if (debug_threads)
fprintf (stderr, "stop pc is %08lx\n", pc);
return pc;
}
static void
arm_set_pc (CORE_ADDR pc)
{
unsigned long newpc = pc;
supply_register_by_name ("pc", &newpc);
}
static const unsigned long arm_breakpoint = 0xef9f0001;
#define arm_breakpoint_len 4
static int
arm_breakpoint_at (CORE_ADDR where)
{
unsigned long insn;
(*the_target->read_memory) (where, (char *) &insn, 4);
if (insn == arm_breakpoint)
return 1;
return 0;
}
static CORE_ADDR
arm_reinsert_addr ()
{
unsigned long pc;
collect_register_by_name ("lr", &pc);
return pc;
}
struct linux_target_ops the_low_target = {
arm_num_regs,
arm_regmap,
arm_cannot_fetch_register,
arm_cannot_store_register,
arm_get_pc,
arm_set_pc,
(const char *) &arm_breakpoint,
arm_breakpoint_len,
arm_reinsert_addr,
0,
arm_breakpoint_at,
};