diff mbox series

[v2,20/39] gdbserver: enable POWER9 support

Message ID 20220420065013.222816-21-npiggin@gmail.com
State New
Headers show
Series gdbserver multi-threaded debugging and POWER9/10 support | expand

Commit Message

Nicholas Piggin April 20, 2022, 6:49 a.m. UTC
POWER9 has a strange problem with attn, but otherwise gdbserver
works well. Enable it.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 README.md       | 14 +++++++++++---
 src/pdbgproxy.c | 29 +++++++++++++++++++++++++----
 2 files changed, 36 insertions(+), 7 deletions(-)

Comments

Joel Stanley May 3, 2022, 7:09 a.m. UTC | #1
On Wed, 20 Apr 2022 at 06:51, Nicholas Piggin <npiggin@gmail.com> wrote:
>
> POWER9 has a strange problem with attn, but otherwise gdbserver
> works well. Enable it.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Reviewed-by: Joel Stanley <joel@jms.id.au>

> ---
>  README.md       | 14 +++++++++++---
>  src/pdbgproxy.c | 29 +++++++++++++++++++++++++----
>  2 files changed, 36 insertions(+), 7 deletions(-)
>
> diff --git a/README.md b/README.md
> index 9ece33f9..ba17c613 100644
> --- a/README.md
> +++ b/README.md
> @@ -534,8 +534,9 @@ There are also low level htm commands which can also be used:
>   - `dump` will dump the trace to a file.
>
>  ### GDBSERVER
> -At the moment gdbserver is only supported on P8 while the cores are in the
> -kernel.
> +At the moment gdbserver is only supported on P8 and P9.
> +
> +Memory access can only be performed on kernel memory.
>
>  To run a gdbserver on a P8 machine from a BMC running openbmc:
>
> @@ -547,7 +548,7 @@ $ ./pdbg -d p8 -p0 -c11 -t0 gdbserver 44
>
>  On your local machine:
>  $ gdb
> -(gdb)  set architecture powerpc:common64
> +(gdb) set architecture powerpc:common64
>  (gdb) target remote palm5-bmc:44
>
>  Debugging info:
> @@ -566,6 +567,13 @@ Notes:
>  happen.
>  2. If you want to view the kernel call trace then run gdb on the vmlinux that
>  the host is running (the kernel needs to be compiled with debug symbols).
> +3. The kernel HARDLOCKUP watchdog can interact badly with GDBSERVER (and all
> +pdbg direct controls for that matter). Disabling it before debugging is a
> +good idea.
> +4. Idle states have often had problems with pdbg direct controls. If things are
> +misbehaving, booting Linux with powersave=off is the first thing to try.
> +5. attn instructions seem to cause host hangs on POWER9. gdb breakpoints should
> +not be used.
>
>  ## Submitting patches
>
> diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c
> index 4c7b4a82..3028d418 100644
> --- a/src/pdbgproxy.c
> +++ b/src/pdbgproxy.c
> @@ -105,6 +105,9 @@ static void detach(uint64_t *stack, void *priv)
>
>  #define POWER8_HID_ENABLE_ATTN                 PPC_BIT(31)
>
> +#define POWER9_HID_ENABLE_ATTN                 PPC_BIT(3)
> +#define POWER9_HID_FLUSH_ICACHE                        PPC_BIT(2)
> +
>  static int set_attn(bool enable)
>  {
>         uint64_t hid;
> @@ -122,6 +125,17 @@ static int set_attn(bool enable)
>                                 return 0;
>                         hid &= ~POWER8_HID_ENABLE_ATTN;
>                 }
> +       } else if (pdbg_target_compatible(thread_target, "ibm,power9-thread")) {
> +               if (enable) {
> +                       if (hid & POWER9_HID_ENABLE_ATTN)
> +                               return 0;
> +                       hid |= POWER9_HID_ENABLE_ATTN;
> +               } else {
> +                       if (!(hid & POWER9_HID_ENABLE_ATTN))
> +                               return 0;
> +                       hid &= ~POWER9_HID_ENABLE_ATTN;
> +               }
> +               hid |= POWER9_HID_FLUSH_ICACHE;
>         } else {
>                 return -1;
>         }
> @@ -658,13 +672,20 @@ static int gdbserver(uint16_t port)
>                 return 0;
>         }
>
> -       //
> -       // Temporary until I can get this working a bit smoother on p9
> -       if (!pdbg_target_compatible(thread, "ibm,power8-thread")) {
> -               PR_ERROR("GDBSERVER is only available on POWER8\n");
> +       if (!pdbg_target_compatible(thread, "ibm,power8-thread") &&
> +           !pdbg_target_compatible(thread, "ibm,power9-thread")) {
> +               PR_ERROR("GDBSERVER is only available on POWER8 and POWER9\n");
>                 return -1;
>         }
>
> +       if (pdbg_target_compatible(thread, "ibm,power9-thread")) {
> +               /*
> +                * XXX: If we advertise no swbreak support on POWER9 does
> +                * that prevent the client using them?
> +                */
> +               PR_WARNING("Breakpoints may cause host crashes on POWER9 and should not be used\n");
> +       }
> +
>         /* Check endianess in MSR */
>         rc = thread_getmsr(thread, &msr);
>         if (rc) {
> --
> 2.35.1
>
> --
> Pdbg mailing list
> Pdbg@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/pdbg
diff mbox series

Patch

diff --git a/README.md b/README.md
index 9ece33f9..ba17c613 100644
--- a/README.md
+++ b/README.md
@@ -534,8 +534,9 @@  There are also low level htm commands which can also be used:
  - `dump` will dump the trace to a file.
 
 ### GDBSERVER
-At the moment gdbserver is only supported on P8 while the cores are in the
-kernel. 
+At the moment gdbserver is only supported on P8 and P9.
+
+Memory access can only be performed on kernel memory.
 
 To run a gdbserver on a P8 machine from a BMC running openbmc:
 
@@ -547,7 +548,7 @@  $ ./pdbg -d p8 -p0 -c11 -t0 gdbserver 44
 
 On your local machine:
 $ gdb
-(gdb)  set architecture powerpc:common64
+(gdb) set architecture powerpc:common64
 (gdb) target remote palm5-bmc:44
 
 Debugging info:
@@ -566,6 +567,13 @@  Notes:
 happen.
 2. If you want to view the kernel call trace then run gdb on the vmlinux that
 the host is running (the kernel needs to be compiled with debug symbols).
+3. The kernel HARDLOCKUP watchdog can interact badly with GDBSERVER (and all
+pdbg direct controls for that matter). Disabling it before debugging is a
+good idea.
+4. Idle states have often had problems with pdbg direct controls. If things are
+misbehaving, booting Linux with powersave=off is the first thing to try.
+5. attn instructions seem to cause host hangs on POWER9. gdb breakpoints should
+not be used.
 
 ## Submitting patches
 
diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c
index 4c7b4a82..3028d418 100644
--- a/src/pdbgproxy.c
+++ b/src/pdbgproxy.c
@@ -105,6 +105,9 @@  static void detach(uint64_t *stack, void *priv)
 
 #define POWER8_HID_ENABLE_ATTN			PPC_BIT(31)
 
+#define POWER9_HID_ENABLE_ATTN			PPC_BIT(3)
+#define POWER9_HID_FLUSH_ICACHE			PPC_BIT(2)
+
 static int set_attn(bool enable)
 {
 	uint64_t hid;
@@ -122,6 +125,17 @@  static int set_attn(bool enable)
 				return 0;
 			hid &= ~POWER8_HID_ENABLE_ATTN;
 		}
+	} else if (pdbg_target_compatible(thread_target, "ibm,power9-thread")) {
+		if (enable) {
+			if (hid & POWER9_HID_ENABLE_ATTN)
+				return 0;
+			hid |= POWER9_HID_ENABLE_ATTN;
+		} else {
+			if (!(hid & POWER9_HID_ENABLE_ATTN))
+				return 0;
+			hid &= ~POWER9_HID_ENABLE_ATTN;
+		}
+		hid |= POWER9_HID_FLUSH_ICACHE;
 	} else {
 		return -1;
 	}
@@ -658,13 +672,20 @@  static int gdbserver(uint16_t port)
 		return 0;
 	}
 
-	//
-	// Temporary until I can get this working a bit smoother on p9
-	if (!pdbg_target_compatible(thread, "ibm,power8-thread")) {
-		PR_ERROR("GDBSERVER is only available on POWER8\n");
+	if (!pdbg_target_compatible(thread, "ibm,power8-thread") &&
+	    !pdbg_target_compatible(thread, "ibm,power9-thread")) {
+		PR_ERROR("GDBSERVER is only available on POWER8 and POWER9\n");
 		return -1;
 	}
 
+	if (pdbg_target_compatible(thread, "ibm,power9-thread")) {
+		/*
+		 * XXX: If we advertise no swbreak support on POWER9 does
+		 * that prevent the client using them?
+		 */
+		PR_WARNING("Breakpoints may cause host crashes on POWER9 and should not be used\n");
+	}
+
 	/* Check endianess in MSR */
 	rc = thread_getmsr(thread, &msr);
 	if (rc) {