[PATCH v4 3/4] AArch64: KGDB: Add step debugging support

Will Deacon will.deacon at arm.com
Fri Nov 8 09:18:41 EST 2013


On Tue, Nov 05, 2013 at 08:45:45AM +0000, vijay.kilari at gmail.com wrote:
> From: Vijaya Kumar K <Vijaya.Kumar at caviumnetworks.com>
> 
> Add KGDB software step debugging support for EL1 debug
> in AArch64 mode.
> 
> KGDB registers step debug handler with debug monitor.
> On receiving 'step' command from GDB tool, target enables
> software step debugging and step address is updated.
> If no step address is received from GDB tool, target assumes
> next step address is current PC.
> 
> Software Step debugging is disabled when 'continue' command
> is received
> 
> Signed-off-by: Vijaya Kumar K <Vijaya.Kumar at caviumnetworks.com>
> ---
>  arch/arm64/kernel/kgdb.c |   67 +++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 58 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/arm64/kernel/kgdb.c b/arch/arm64/kernel/kgdb.c
> index ec624bc..f10f2ba 100644
> --- a/arch/arm64/kernel/kgdb.c
> +++ b/arch/arm64/kernel/kgdb.c
> @@ -137,13 +137,26 @@ void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc)
>  
>  static int compiled_break;
>  
> +static void kgdb_arch_update_addr(struct pt_regs *regs,
> +				char *remcom_in_buffer)
> +{
> +	unsigned long addr;
> +	char *ptr;
> +
> +	ptr = &remcom_in_buffer[1];
> +	if (kgdb_hex2long(&ptr, &addr))
> +		kgdb_arch_set_pc(regs, addr);
> +	else if (compiled_break == 1)
> +		kgdb_arch_set_pc(regs, regs->pc + 4);
> +
> +	compiled_break = 0;
> +}
> +
>  int kgdb_arch_handle_exception(int exception_vector, int signo,
>  			       int err_code, char *remcom_in_buffer,
>  			       char *remcom_out_buffer,
>  			       struct pt_regs *linux_regs)
>  {
> -	unsigned long addr;
> -	char *ptr;
>  	int err;
>  
>  	switch (remcom_in_buffer[0]) {
> @@ -153,6 +166,8 @@ int kgdb_arch_handle_exception(int exception_vector, int signo,
>  		 * Packet D (Detach), k (kill). No special handling
>  		 * is required here
>  		 */
> +		atomic_set(&kgdb_cpu_doing_single_step, -1);
> +		kgdb_single_step =  0;

This looks really weird: you have two variables, which you attempt to keep
in sync, only one of them is an atomic access and you don't have any
locking or memory barriers between them, so it must be ok if they're not
in-sync. In which case, why do we have two variables?

Will



More information about the linux-arm-kernel mailing list