#include "server.h"
#include "linux-low.h"
#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
#endif
#define mips_num_regs 90
#include <asm/ptrace.h>
static int mips_regmap[] = {
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31,
-1, MMLO, MMHI, BADVADDR, CAUSE, PC,
FPR_BASE, FPR_BASE + 1, FPR_BASE + 2, FPR_BASE + 3,
FPR_BASE + 4, FPR_BASE + 5, FPR_BASE + 6, FPR_BASE + 7,
FPR_BASE + 8, FPR_BASE + 8, FPR_BASE + 10, FPR_BASE + 11,
FPR_BASE + 12, FPR_BASE + 13, FPR_BASE + 14, FPR_BASE + 15,
FPR_BASE + 16, FPR_BASE + 17, FPR_BASE + 18, FPR_BASE + 19,
FPR_BASE + 20, FPR_BASE + 21, FPR_BASE + 22, FPR_BASE + 23,
FPR_BASE + 24, FPR_BASE + 25, FPR_BASE + 26, FPR_BASE + 27,
FPR_BASE + 28, FPR_BASE + 29, FPR_BASE + 30, FPR_BASE + 31,
FPC_CSR, FPC_EIR,
-1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
static int
mips_cannot_fetch_register (int regno)
{
if (mips_regmap[regno] == -1)
return 1;
if (find_regno ("zero") == regno)
return 1;
return 0;
}
static int
mips_cannot_store_register (int regno)
{
if (mips_regmap[regno] == -1)
return 1;
if (find_regno ("zero") == regno)
return 1;
if (find_regno ("cause") == regno)
return 1;
if (find_regno ("bad") == regno)
return 1;
if (find_regno ("fir") == regno)
return 1;
return 0;
}
static CORE_ADDR
mips_get_pc ()
{
unsigned long pc;
collect_register_by_name ("pc", &pc);
return pc;
}
static void
mips_set_pc (CORE_ADDR pc)
{
unsigned long newpc = pc;
supply_register_by_name ("pc", &newpc);
}
static const unsigned long mips_breakpoint = 0x0005000d;
#define mips_breakpoint_len 4
static CORE_ADDR
mips_reinsert_addr ()
{
unsigned long pc;
collect_register_by_name ("ra", &pc);
return pc;
}
static int
mips_breakpoint_at (CORE_ADDR where)
{
unsigned long insn;
(*the_target->read_memory) (where, (char *) &insn, 4);
if (insn == mips_breakpoint)
return 1;
return 0;
}
struct linux_target_ops the_low_target = {
mips_num_regs,
mips_regmap,
mips_cannot_fetch_register,
mips_cannot_store_register,
mips_get_pc,
mips_set_pc,
(const char *) &mips_breakpoint,
mips_breakpoint_len,
mips_reinsert_addr,
0,
mips_breakpoint_at,
};