Hi, I was trying to launch KGDB kernel debugging on MSM 8255 platform. It works now but I needed to apply a few patches. Among other things I needed to neutralized AMSS' watchdog for the time the linux kernel spends on breakpoint. Please have a look at the patch below with code of a driver controlling modem's watchdog. It might be useful for everyone willing to debug the kernel on Qualcomm's platform. For it to work there's another patch needed. The patch I've posted on KGDB mailing list: http://sourceforge.net/mailarchive/message.php?msg_id=28955742 It adds hooks for architecture specific pre and post breakpoint handlers and invocations before and after the breakpoint. Best Regards Michal Frynas >From 077f79c950f15ba0f4af08381b16d093a17c3354 Mon Sep 17 00:00:00 2001 From: Michal Frynas <michal.frynas@xxxxxxxxx> Date: Wed, 7 Mar 2012 12:59:28 +0100 Subject: [PATCH] KGDB: modem watchdog immunization against kernel stopping On Qualcomm's MSM 8255 platform there are two processors running simultaneously and synchronizing constantly with each other. The ARM11 CPU executes Linux code while the ARM9 executes modem code. While debugging Linux code and stopping kernel on a breakpoint the synchronization breaks causing modem CPU to trigger hard reset. To avoid this modem_watchdog_control driver registers pre_exception handler where it instructs modem watchdog to ignore timing issues from Linux side. That handler is invoked every time the kernel enters breakpoint and then when leaving breakpoint post_exception handler is called restoring modem watchdog to its default behavior. Change-Id: I8ab73b1c8edcec1fe89b0d2f2dfbd03f0a617f57 Signed-off-by: Michal Frynas <michal.k.frynas@xxxxxxxxx> --- arch/arm/mach-msm/Makefile | 2 + arch/arm/mach-msm/modem_watchdog_control.c | 35 +++++++++++++++++++ arch/arm/mach-msm/modem_watchdog_control.h | 50 ++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-msm/modem_watchdog_control.c create mode 100644 arch/arm/mach-msm/modem_watchdog_control.h diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index 7ce284d..9984467 100755 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile @@ -208,3 +208,5 @@ endif obj-$(CONFIG_PMIC_TIME) += pmic_time.o obj-$(CONFIG_SEMC_MOGAMI_FELICA_SUPPORT) += semc_mogami_felica.o + +obj-$(CONFIG_KGDB) += modem_watchdog_control.o diff --git a/arch/arm/mach-msm/modem_watchdog_control.c b/arch/arm/mach-msm/modem_watchdog_control.c new file mode 100644 index 0000000..d64ae7e --- /dev/null +++ b/arch/arm/mach-msm/modem_watchdog_control.c @@ -0,0 +1,35 @@ +#include <proc_comm.h> +#include <modem_watchdog_control.h> + + +static int modem_watchdog_state; + +void modem_watchdog_disable(void) +{ + pr_info("kgdb: disabling modem watchdog on breakpoint\n"); + modem_watchdog_state = DOG_HALT_MONITORING; + msm_proc_comm(PCOM_SET_SW_WATCHDOG_STATE, &modem_watchdog_state, 0); +} + +void modem_watchdog_enable(void) +{ + pr_info("kgdb: reenabling modem watchdog\n"); + modem_watchdog_state = DOG_DEFAULT_STATE; + msm_proc_comm(PCOM_SET_SW_WATCHDOG_STATE, &modem_watchdog_state, 0); +} + +int get_modem_watchdog_state(void) +{ + return modem_watchdog_state; +} + +static int __init modem_watchdog_control_init(void) +{ + pr_info("kgdb: initializing modem watchdog control module\n"); + arch_kgdb_ops.pre_exception = modem_watchdog_disable; + arch_kgdb_ops.post_exception = modem_watchdog_enable; + + return 0; +} + +late_initcall(modem_watchdog_control_init); diff --git a/arch/arm/mach-msm/modem_watchdog_control.h b/arch/arm/mach-msm/modem_watchdog_control.h new file mode 100644 index 0000000..a42a350 --- /dev/null +++ b/arch/arm/mach-msm/modem_watchdog_control.h @@ -0,0 +1,50 @@ +#ifndef MODEM_WATCHDOG_CONTROL_H_ +#define MODEM_WATCHDOG_CONTROL_H_ + +#include <linux/kgdb.h> + +/*---------------------------------------------------------------------------- + Bits indicating watch dog state as set by remote processors + Copied from AMSS source codes: + amss/AMSS/products/7x30/core/debugtools/task/src/dog.c +----------------------------------------------------------------------------*/ + +/* + * Remote proc is requesting dog task to resume its default state + */ +#define DOG_DEFAULT_STATE 0x00000000 + +/* + * Remote proc is requesting dog monitoring to be halted/enabled + */ +#define DOG_HALT_MONITORING 0x00000001 + +/* Remote proc is requesting dog task to setup/clear conditions for + * entering modem halt state (timer based) + */ +#define DOG_HALT_MODEM 0x00000002 + +/* + * Needed for pre_breakpoint and post_breakpoing hooks. + */ +extern struct kgdb_arch arch_kgdb_ops; + +/* + * Sends DOG_HALT_MONITORING value to modem site causing the modem watchdog + * ignoring tasks timeouts while still kicking the hardware watchdog. + */ +extern void modem_watchdog_disable(void); + +/* + * Sends DOG_DEFAULT_STATE value to modem site causing the modem watchdog + * to resume its default tasks processing. + */ +extern void modem_watchdog_enable(void); + +/* + * Returns current status of modem watchdog. + */ +extern int get_modem_watchdog_state(void); + + +#endif /* MODEM_WATCHDOG_CONTROL_H_ */ -- 1.7.8.3 -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html