Commit 9901a6bd authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'riscv-for-linus-5.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux

Pull RISC-V fixes from Palmer Dabbelt:
 "I have a few KGDB-related fixes. They're mostly fixes for build
  warnings, but there's also:

   - Support for the qSupported and qXfer packets, which are necessary
     to pass around GDB XML information which we need for the RISC-V GDB
     port to fully function.

   - Users can now select STRICT_KERNEL_RWX instead of forcing it on"

* tag 'riscv-for-linus-5.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
  riscv: Avoid kgdb.h including gdb_xml.h to solve unused-const-variable warning
  kgdb: Move the extern declaration kgdb_has_hit_break() to generic kgdb.h
  riscv: Fix "no previous prototype" compile warning in kgdb.c file
  riscv: enable the Kconfig prompt of STRICT_KERNEL_RWX
  kgdb: enable arch to support XML packet.
parents 9599e9e7 70ee5731
...@@ -23,6 +23,8 @@ config RISCV ...@@ -23,6 +23,8 @@ config RISCV
select ARCH_HAS_SET_DIRECT_MAP select ARCH_HAS_SET_DIRECT_MAP
select ARCH_HAS_SET_MEMORY select ARCH_HAS_SET_MEMORY
select ARCH_HAS_STRICT_KERNEL_RWX if MMU select ARCH_HAS_STRICT_KERNEL_RWX if MMU
select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX
select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_FRAME_POINTERS
select ARCH_WANT_HUGE_PMD_SHARE if 64BIT select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
......
...@@ -3,8 +3,7 @@ ...@@ -3,8 +3,7 @@
#ifndef __ASM_GDB_XML_H_ #ifndef __ASM_GDB_XML_H_
#define __ASM_GDB_XML_H_ #define __ASM_GDB_XML_H_
#define kgdb_arch_gdb_stub_feature riscv_gdb_stub_feature const char riscv_gdb_stub_feature[64] =
static const char riscv_gdb_stub_feature[64] =
"PacketSize=800;qXfer:features:read+;"; "PacketSize=800;qXfer:features:read+;";
static const char gdb_xfer_read_target[31] = "qXfer:features:read:target.xml:"; static const char gdb_xfer_read_target[31] = "qXfer:features:read:target.xml:";
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
extern int kgdb_has_hit_break(unsigned long addr);
extern unsigned long kgdb_compiled_break; extern unsigned long kgdb_compiled_break;
static inline void arch_kgdb_breakpoint(void) static inline void arch_kgdb_breakpoint(void)
...@@ -106,7 +105,9 @@ static inline void arch_kgdb_breakpoint(void) ...@@ -106,7 +105,9 @@ static inline void arch_kgdb_breakpoint(void)
#define DBG_REG_BADADDR_OFF 34 #define DBG_REG_BADADDR_OFF 34
#define DBG_REG_CAUSE_OFF 35 #define DBG_REG_CAUSE_OFF 35
#include <asm/gdb_xml.h> extern const char riscv_gdb_stub_feature[64];
#define kgdb_arch_gdb_stub_feature riscv_gdb_stub_feature
#endif #endif
#endif #endif
...@@ -44,18 +44,18 @@ DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) ...@@ -44,18 +44,18 @@ DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ)
DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ)
DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) DECLARE_INSN(sret, MATCH_SRET, MASK_SRET)
int decode_register_index(unsigned long opcode, int offset) static int decode_register_index(unsigned long opcode, int offset)
{ {
return (opcode >> offset) & 0x1F; return (opcode >> offset) & 0x1F;
} }
int decode_register_index_short(unsigned long opcode, int offset) static int decode_register_index_short(unsigned long opcode, int offset)
{ {
return ((opcode >> offset) & 0x7) + 8; return ((opcode >> offset) & 0x7) + 8;
} }
/* Calculate the new address for after a step */ /* Calculate the new address for after a step */
int get_step_address(struct pt_regs *regs, unsigned long *next_addr) static int get_step_address(struct pt_regs *regs, unsigned long *next_addr)
{ {
unsigned long pc = regs->epc; unsigned long pc = regs->epc;
unsigned long *regs_ptr = (unsigned long *)regs; unsigned long *regs_ptr = (unsigned long *)regs;
...@@ -136,7 +136,7 @@ int get_step_address(struct pt_regs *regs, unsigned long *next_addr) ...@@ -136,7 +136,7 @@ int get_step_address(struct pt_regs *regs, unsigned long *next_addr)
return 0; return 0;
} }
int do_single_step(struct pt_regs *regs) static int do_single_step(struct pt_regs *regs)
{ {
/* Determine where the target instruction will send us to */ /* Determine where the target instruction will send us to */
unsigned long addr = 0; unsigned long addr = 0;
...@@ -320,7 +320,7 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code, ...@@ -320,7 +320,7 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code,
return err; return err;
} }
int kgdb_riscv_kgdbbreak(unsigned long addr) static int kgdb_riscv_kgdbbreak(unsigned long addr)
{ {
if (stepped_address == addr) if (stepped_address == addr)
return KGDB_SW_SINGLE_STEP; return KGDB_SW_SINGLE_STEP;
......
...@@ -176,6 +176,17 @@ kgdb_arch_handle_exception(int vector, int signo, int err_code, ...@@ -176,6 +176,17 @@ kgdb_arch_handle_exception(int vector, int signo, int err_code,
char *remcom_out_buffer, char *remcom_out_buffer,
struct pt_regs *regs); struct pt_regs *regs);
/**
* kgdb_arch_handle_qxfer_pkt - Handle architecture specific GDB XML
* packets.
* @remcom_in_buffer: The buffer of the packet we have read.
* @remcom_out_buffer: The buffer of %BUFMAX bytes to write a packet into.
*/
extern void
kgdb_arch_handle_qxfer_pkt(char *remcom_in_buffer,
char *remcom_out_buffer);
/** /**
* kgdb_call_nmi_hook - Call kgdb_nmicallback() on the current CPU * kgdb_call_nmi_hook - Call kgdb_nmicallback() on the current CPU
* @ignored: This parameter is only here to match the prototype. * @ignored: This parameter is only here to match the prototype.
...@@ -314,6 +325,7 @@ extern int kgdb_hex2mem(char *buf, char *mem, int count); ...@@ -314,6 +325,7 @@ extern int kgdb_hex2mem(char *buf, char *mem, int count);
extern int kgdb_isremovedbreak(unsigned long addr); extern int kgdb_isremovedbreak(unsigned long addr);
extern void kgdb_schedule_breakpoint(void); extern void kgdb_schedule_breakpoint(void);
extern int kgdb_has_hit_break(unsigned long addr);
extern int extern int
kgdb_handle_exception(int ex_vector, int signo, int err_code, kgdb_handle_exception(int ex_vector, int signo, int err_code,
......
...@@ -792,6 +792,19 @@ static void gdb_cmd_query(struct kgdb_state *ks) ...@@ -792,6 +792,19 @@ static void gdb_cmd_query(struct kgdb_state *ks)
} }
break; break;
#endif #endif
#ifdef CONFIG_HAVE_ARCH_KGDB_QXFER_PKT
case 'S':
if (!strncmp(remcom_in_buffer, "qSupported:", 11))
strcpy(remcom_out_buffer, kgdb_arch_gdb_stub_feature);
break;
case 'X':
if (!strncmp(remcom_in_buffer, "qXfer:", 6))
kgdb_arch_handle_qxfer_pkt(remcom_in_buffer,
remcom_out_buffer);
break;
#endif
default:
break;
} }
} }
......
...@@ -3,6 +3,11 @@ ...@@ -3,6 +3,11 @@
config HAVE_ARCH_KGDB config HAVE_ARCH_KGDB
bool bool
# set if architecture has the its kgdb_arch_handle_qxfer_pkt
# function to enable gdb stub to address XML packet sent from GDB.
config HAVE_ARCH_KGDB_QXFER_PKT
bool
menuconfig KGDB menuconfig KGDB
bool "KGDB: kernel debugger" bool "KGDB: kernel debugger"
depends on HAVE_ARCH_KGDB depends on HAVE_ARCH_KGDB
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment