From 7df94786e4723ba93d8982e55fc5e652b4b80142 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 14 Jul 2016 10:38:07 +0100 Subject: [PATCH] Small improvements to the ARM simulator to cope with illegal binaries. * armemu.c (Multiply64): Only issue error messages about invalid arguments if debugging is enabled. * armos.c (ARMul_OSHandleSWI): Ignore invalid flags. --- sim/arm/ChangeLog | 6 ++++++ sim/arm/armemu.c | 6 +++--- sim/arm/armos.c | 5 ++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/sim/arm/ChangeLog b/sim/arm/ChangeLog index cae6f528d9..2ce9429242 100644 --- a/sim/arm/ChangeLog +++ b/sim/arm/ChangeLog @@ -1,3 +1,9 @@ +2016-07-14 Nick Clifton + + * armemu.c (Multiply64): Only issue error messages about invalid + arguments if debugging is enabled. + * armos.c (ARMul_OSHandleSWI): Ignore invalid flags. + 2016-01-10 Mike Frysinger * config.in, configure: Regenerate. diff --git a/sim/arm/armemu.c b/sim/arm/armemu.c index 5fde3fd259..76f398b3d7 100644 --- a/sim/arm/armemu.c +++ b/sim/arm/armemu.c @@ -5950,10 +5950,10 @@ Multiply64 (ARMul_State * state, ARMword instr, int msigned, int scc) ; else #endif - if (nRdHi == nRm || nRdLo == nRm) + /* BAD code can trigger this result. So only complain if debugging. */ + if (state->Debug && (nRdHi == nRm || nRdLo == nRm)) fprintf (stderr, "sim: MULTIPLY64 - INVALID ARGUMENTS: %d %d %d\n", nRdHi, nRdLo, nRm); - if (msigned) { /* Compute sign of result and adjust operands if necessary. */ @@ -5998,7 +5998,7 @@ Multiply64 (ARMul_State * state, ARMword instr, int msigned, int scc) state->Reg[nRdLo] = RdLo; state->Reg[nRdHi] = RdHi; } - else + else if (state->Debug) fprintf (stderr, "sim: MULTIPLY64 - INVALID ARGUMENTS\n"); if (scc) diff --git a/sim/arm/armos.c b/sim/arm/armos.c index c49036f122..ea3d22979a 100644 --- a/sim/arm/armos.c +++ b/sim/arm/armos.c @@ -260,7 +260,10 @@ SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags) return; /* Now we need to decode the Demon open mode. */ - flags = translate_open_mode[SWIflags]; + if (SWIflags >= sizeof (translate_open_mode) / sizeof (translate_open_mode[0])) + flags = 0; + else + flags = translate_open_mode[SWIflags]; /* Filename ":tt" is special: it denotes stdin/out. */ if (strcmp (buf, ":tt") == 0)