* traps.c (cris_break_13_handler): Pass lseek
authorHans-Peter Nilsson <hp@axis.com>
Wed, 6 Oct 2010 23:44:33 +0000 (23:44 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Wed, 6 Oct 2010 23:44:33 +0000 (23:44 +0000)
offset parameter as sign-extended.

sim/cris/ChangeLog
sim/cris/traps.c

index 699e9e8fac9ca53f5f3de319147360039ffc7054..2963b90dcc532514794ef7e12313a2aa259e30f5 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-07  Hans-Peter Nilsson  <hp@axis.com>
+
+       * traps.c (cris_break_13_handler): Pass lseek
+       offset parameter as sign-extended.
+
 2010-05-26  Ozkan Sezer  <sezeroz@gmail.com>
 
        * dv-rv.c (hw_rv_init_socket): Check error return from socket() call
index dfaaeeda82a8ccac088f9b71f5153c125f39fafd..1e17ce3be6b372c0b8881d8cc8afb7995d849283 100644 (file)
@@ -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))
     {