diff mbox

[v3,6/7] disas: cris: Fix 0 buffer length case

Message ID 0279412b5ad90c5aa113c349941b319b28672f1b.1432506704.git.crosthwaite.peter@gmail.com
State New
Headers show

Commit Message

Peter Crosthwaite May 24, 2015, 10:47 p.m. UTC
Cris has the complication of variable length instructions and has
a check in place to clamp memory reads in case the disas request
doesn't have enough bytes for the instruction being disas'd. This
breaks down in the case where disassembling for the monitor where
the buffer length is defaulted to 0.

The buffer length should never be zero for a regular target_disas,
so we can safely assume the 0 case is for the monitor in which case
consider the buffer length to be the max for cris instructions.

Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 disas/cris.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Edgar E. Iglesias May 29, 2015, 5:21 a.m. UTC | #1
On Sun, May 24, 2015 at 03:47:19PM -0700, Peter Crosthwaite wrote:
> Cris has the complication of variable length instructions and has
> a check in place to clamp memory reads in case the disas request
> doesn't have enough bytes for the instruction being disas'd. This
> breaks down in the case where disassembling for the monitor where
> the buffer length is defaulted to 0.
> 
> The buffer length should never be zero for a regular target_disas,
> so we can safely assume the 0 case is for the monitor in which case
> consider the buffer length to be the max for cris instructions.
> 
> Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>

Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>



> ---
>  disas/cris.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/disas/cris.c b/disas/cris.c
> index e6cff7a..1b76a09 100644
> --- a/disas/cris.c
> +++ b/disas/cris.c
> @@ -2575,9 +2575,9 @@ print_insn_cris_generic (bfd_vma memaddr,
>       If we can't get any data, or we do not get enough data, we print
>       the error message.  */
>  
> -  nbytes = info->buffer_length;
> -  if (nbytes > MAX_BYTES_PER_CRIS_INSN)
> -	  nbytes = MAX_BYTES_PER_CRIS_INSN;
> +  nbytes = info->buffer_length ? info->buffer_length
> +                               : MAX_BYTES_PER_CRIS_INSN;
> +  nbytes = MIN(nbytes, MAX_BYTES_PER_CRIS_INSN);
>    status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);  
>  
>    /* If we did not get all we asked for, then clear the rest.
> -- 
> 1.9.1
> 
>
diff mbox

Patch

diff --git a/disas/cris.c b/disas/cris.c
index e6cff7a..1b76a09 100644
--- a/disas/cris.c
+++ b/disas/cris.c
@@ -2575,9 +2575,9 @@  print_insn_cris_generic (bfd_vma memaddr,
      If we can't get any data, or we do not get enough data, we print
      the error message.  */
 
-  nbytes = info->buffer_length;
-  if (nbytes > MAX_BYTES_PER_CRIS_INSN)
-	  nbytes = MAX_BYTES_PER_CRIS_INSN;
+  nbytes = info->buffer_length ? info->buffer_length
+                               : MAX_BYTES_PER_CRIS_INSN;
+  nbytes = MIN(nbytes, MAX_BYTES_PER_CRIS_INSN);
   status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);  
 
   /* If we did not get all we asked for, then clear the rest.