From 7cf1d8af2f630bd1959cb16a6ddc50650239d0de Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Wed, 6 Oct 2010 23:44:33 +0000 Subject: [PATCH] * traps.c (cris_break_13_handler): Pass lseek offset parameter as sign-extended. --- sim/cris/ChangeLog | 5 +++++ sim/cris/traps.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/sim/cris/ChangeLog b/sim/cris/ChangeLog index 699e9e8fac9..2963b90dcc5 100644 --- a/sim/cris/ChangeLog +++ b/sim/cris/ChangeLog @@ -1,3 +1,8 @@ +2010-10-07 Hans-Peter Nilsson + + * traps.c (cris_break_13_handler): Pass lseek + offset parameter as sign-extended. + 2010-05-26 Ozkan Sezer * dv-rv.c (hw_rv_init_socket): Check error return from socket() call diff --git a/sim/cris/traps.c b/sim/cris/traps.c index dfaaeeda82a..1e17ce3be6b 100644 --- a/sim/cris/traps.c +++ b/sim/cris/traps.c @@ -1478,6 +1478,14 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1, s.arg2 = arg2; s.arg3 = arg3; + /* The type of s.arg2 is long, so for hosts with 64-bit longs, we need + to sign-extend the lseek offset to be passed as a signed number, + else we'll truncate it to something > 2GB on hosts where sizeof + long > sizeof USI. We avoid doing it for all syscalls, as arg2 is + e.g. an address for some syscalls. */ + if (callnum == TARGET_SYS_lseek) + s.arg2 = (SI) arg2; + if (callnum == TARGET_SYS_exit_group || (callnum == TARGET_SYS_exit && current_cpu->m1threads == 0)) { -- 2.30.2