X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdbserver%2Flinux-riscv-low.cc;h=1c6e8c44dd9e7333d4657700b6488c713c2d52e3;hb=3c5a0e025bf0163ce6a540ac0a18a91f97e215a3;hp=4a9cefed7b457b448b9f561d228fd11b738be9d2;hpb=797bcff595c5e161b333077299fcaca19bb4fd17;p=deliverable%2Fbinutils-gdb.git diff --git a/gdbserver/linux-riscv-low.cc b/gdbserver/linux-riscv-low.cc index 4a9cefed7b..1c6e8c44dd 100644 --- a/gdbserver/linux-riscv-low.cc +++ b/gdbserver/linux-riscv-low.cc @@ -36,15 +36,49 @@ class riscv_target : public linux_process_target { public: + const regs_info *get_regs_info () override; + + int breakpoint_kind_from_pc (CORE_ADDR *pcptr) override; + + const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override; + protected: void low_arch_setup () override; + + bool low_cannot_fetch_register (int regno) override; + + bool low_cannot_store_register (int regno) override; + + bool low_fetch_register (regcache *regcache, int regno) override; + + bool low_supports_breakpoints () override; + + CORE_ADDR low_get_pc (regcache *regcache) override; + + void low_set_pc (regcache *regcache, CORE_ADDR newpc) override; + + bool low_breakpoint_at (CORE_ADDR pc) override; }; /* The singleton target ops object. */ static riscv_target the_riscv_target; +bool +riscv_target::low_cannot_fetch_register (int regno) +{ + gdb_assert_not_reached ("linux target op low_cannot_fetch_register " + "is not implemented by the target"); +} + +bool +riscv_target::low_cannot_store_register (int regno) +{ + gdb_assert_not_reached ("linux target op low_cannot_store_register " + "is not implemented by the target"); +} + /* Implementation of linux target ops method "low_arch_setup". */ void @@ -160,31 +194,37 @@ static struct regs_info riscv_regs = &riscv_regsets_info, }; -/* Implementation of linux_target_ops method "regs_info". */ +/* Implementation of linux target ops method "get_regs_info". */ -static const struct regs_info * -riscv_regs_info () +const regs_info * +riscv_target::get_regs_info () { return &riscv_regs; } -/* Implementation of linux_target_ops method "fetch_register". */ +/* Implementation of linux target ops method "low_fetch_register". */ -static int -riscv_fetch_register (struct regcache *regcache, int regno) +bool +riscv_target::low_fetch_register (regcache *regcache, int regno) { const struct target_desc *tdesc = regcache->tdesc; if (regno != find_regno (tdesc, "zero")) - return 0; + return false; supply_register_zeroed (regcache, regno); - return 1; + return true; +} + +bool +riscv_target::low_supports_breakpoints () +{ + return true; } -/* Implementation of linux_target_ops method "get_pc". */ +/* Implementation of linux target ops method "low_get_pc". */ -static CORE_ADDR -riscv_get_pc (struct regcache *regcache) +CORE_ADDR +riscv_target::low_get_pc (regcache *regcache) { elf_gregset_t regset; @@ -194,10 +234,10 @@ riscv_get_pc (struct regcache *regcache) return linux_get_pc_32bit (regcache); } -/* Implementation of linux_target_ops method "set_pc". */ +/* Implementation of linux target ops method "low_set_pc". */ -static void -riscv_set_pc (struct regcache *regcache, CORE_ADDR newpc) +void +riscv_target::low_set_pc (regcache *regcache, CORE_ADDR newpc) { elf_gregset_t regset; @@ -211,10 +251,10 @@ riscv_set_pc (struct regcache *regcache, CORE_ADDR newpc) static const uint16_t riscv_ibreakpoint[] = { 0x0073, 0x0010 }; static const uint16_t riscv_cbreakpoint = 0x9002; -/* Implementation of linux_target_ops method "breakpoint_kind_from_pc". */ +/* Implementation of target ops method "breakpoint_kind_from_pc". */ -static int -riscv_breakpoint_kind_from_pc (CORE_ADDR *pcptr) +int +riscv_target::breakpoint_kind_from_pc (CORE_ADDR *pcptr) { union { @@ -230,10 +270,10 @@ riscv_breakpoint_kind_from_pc (CORE_ADDR *pcptr) return sizeof (riscv_cbreakpoint); } -/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ +/* Implementation of target ops method "sw_breakpoint_from_kind". */ -static const gdb_byte * -riscv_sw_breakpoint_from_kind (int kind, int *size) +const gdb_byte * +riscv_target::sw_breakpoint_from_kind (int kind, int *size) { *size = kind; switch (kind) @@ -245,10 +285,10 @@ riscv_sw_breakpoint_from_kind (int kind, int *size) } } -/* Implementation of linux_target_ops method "breakpoint_at". */ +/* Implementation of linux target ops method "low_breakpoint_at". */ -static int -riscv_breakpoint_at (CORE_ADDR pc) +bool +riscv_target::low_breakpoint_at (CORE_ADDR pc) { union { @@ -263,27 +303,11 @@ riscv_breakpoint_at (CORE_ADDR pc) && target_read_memory (pc + sizeof (buf.insn), buf.bytes, sizeof (buf.insn)) == 0 && buf.insn == riscv_ibreakpoint[1]))) - return 1; + return true; else - return 0; + return false; } -/* RISC-V/Linux target operations. */ -struct linux_target_ops the_low_target = -{ - riscv_regs_info, - NULL, /* cannot_fetch_register */ - NULL, /* cannot_store_register */ - riscv_fetch_register, - riscv_get_pc, - riscv_set_pc, - riscv_breakpoint_kind_from_pc, - riscv_sw_breakpoint_from_kind, - NULL, /* get_next_pcs */ - 0, /* decr_pc_after_break */ - riscv_breakpoint_at, -}; - /* The linux target ops object. */ linux_process_target *the_linux_target = &the_riscv_target;