aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/common/ChangeLog6
-rw-r--r--sim/common/cgen-scache.c24
2 files changed, 19 insertions, 11 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index fe25803..0483f8a 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -1,3 +1,9 @@
+2016-02-04 Nick Clifton <nickc@redhat.com>
+
+ * cgen-scache.c (scache_option_handler): Prevent possible
+ undefined behaviour computing the size of the scache by using
+ unsigned integers instead of signed integers.
+
2016-01-17 Joel Brobecker <brobecker@adacore.com>
* sim-fpu.c: Minor comment fixes throughout.
diff --git a/sim/common/cgen-scache.c b/sim/common/cgen-scache.c
index 3a79514..cd1aa11 100644
--- a/sim/common/cgen-scache.c
+++ b/sim/common/cgen-scache.c
@@ -121,24 +121,26 @@ scache_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
{
if (arg != NULL)
{
- int n = strtol (arg, NULL, 0);
+ unsigned int n = (unsigned int) strtoul (arg, NULL, 0);
if (n < MIN_SCACHE_SIZE)
{
- sim_io_eprintf (sd, "invalid scache size `%d', must be at least 4", n);
+ sim_io_eprintf (sd, "invalid scache size `%u', must be at least %u",
+ n, MIN_SCACHE_SIZE);
return SIM_RC_FAIL;
}
/* Ensure it's a multiple of 2. */
if ((n & (n - 1)) != 0)
{
- sim_io_eprintf (sd, "scache size `%d' not a multiple of 2\n", n);
- {
- /* round up to nearest multiple of 2 */
- int i;
- for (i = 1; i < n; i <<= 1)
- continue;
- n = i;
- }
- sim_io_eprintf (sd, "rounding scache size up to %d\n", n);
+ unsigned int i;
+ sim_io_eprintf (sd, "scache size `%u' not a multiple of 2\n", n);
+ /* Round up to nearest multiple of 2. */
+ for (i = 1; i && i < n; i <<= 1)
+ continue;
+ if (i)
+ {
+ n = i;
+ sim_io_eprintf (sd, "rounding scache size up to %u\n", n);
+ }
}
if (cpu == NULL)
STATE_SCACHE_SIZE (sd) = n;