Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@bitrange.com>2018-09-13 18:45:39 +0300
committerHans-Peter Nilsson <hp@bitrange.com>2018-09-13 18:57:11 +0300
commita6837ca34f9aebe1bada63334eaedb5866beaa4f (patch)
treee204da41d1026c477c1dc53424b014ee8a502f09 /libgloss/cris
parentd83404e41808421442c8257392ecd095042cbfbf (diff)
Committed, CRIS port: fix fallout from time_t defaulting to 64 bits, part 1
It's been a while... I see the CRIS port broke with the time_t-default-to-64-bit change, observable by a few test-cases in the gcc fortran(!) tests failing, regressing when trying a recent newlib. This is a two-part belt-and-suspenders change: adjust the CRIS port gettimeofday syscall (the only one in newlib/CRIS passing a time_t or struct timeval) to handle a userspace 64-bit time_t and secondly default time_t to 32-bit long anyway. I considered making the local "kernel_timeval" copy in _gettimeofday conditional on (userspace) time_t being 64 bits, but thought it not worth bothering with the few move insns. The effect of a 64-bit time_t is however observable as longer simulation time when running the gcc testsuite and as bigger binaries without any actual upside from the larger time_t size, so I thought better make the default for this port go back to being a "long" again. Tested by running the gcc testsuite over the three combinations of two parts of the patch and observing the expected changes. Committed. libgloss: Adjust for syscall and userspace having different time_t or timeval. * cris/linunistd.h (kernel_time_t, kernel_suseconds_t, kernel_timeval): New types. (gettimeofday): Change the type of the first argument to be a pointer to a struct kernel_timeval. * cris/gensyscalls (_gettimeofday): Use an intermediate struct kernel_timeval for the syscall and initialize the result from that. Signed-off-by: Hans-Peter Nilsson <hp@axis.com>
Diffstat (limited to 'libgloss/cris')
-rw-r--r--libgloss/cris/gensyscalls14
-rw-r--r--libgloss/cris/linunistd.h12
2 files changed, 21 insertions, 5 deletions
diff --git a/libgloss/cris/gensyscalls b/libgloss/cris/gensyscalls
index b885a20cb..3e2f9af8c 100644
--- a/libgloss/cris/gensyscalls
+++ b/libgloss/cris/gensyscalls
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2005 Axis Communications.
+# Copyright (C) 2005, 2018 Axis Communications.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -93,8 +93,16 @@ cat > gettod.c <<EOF
$lu#include <sys/time.h>
#include <sys/times.h>
int
-_gettimeofday (struct timeval *tp, void *tzp
-${r}gettimeofday (tp, tzp))
+_gettimeofday (struct timeval *tp, void *tzp)
+{
+ struct kernel_timeval kt;
+ int retval = _Sys_gettimeofday(&kt, tzp);
+ if (retval == 0)
+ {
+ tp->tv_sec = kt.tv_sec;
+ tp->tv_usec = kt.tv_usec;
+ }
+ R (retval)
EOF
cat > isatty.c <<EOF
$lu
diff --git a/libgloss/cris/linunistd.h b/libgloss/cris/linunistd.h
index 4d664a251..310e4702f 100644
--- a/libgloss/cris/linunistd.h
+++ b/libgloss/cris/linunistd.h
@@ -1,5 +1,5 @@
/* Support for syscalls for cris*-axis-linux-gnu and simulators
- Copyright (C) 1998-2005 Axis Communications.
+ Copyright (C) 1998-2005, 2018 Axis Communications.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -402,6 +402,14 @@ struct new_stat {
unsigned long __unused5;
};
+typedef long int kernel_time_t;
+typedef long int kernel_suseconds_t;
+
+struct kernel_timeval {
+ kernel_time_t tv_sec;
+ kernel_suseconds_t tv_usec;
+};
+
static inline _syscall2(int,stat,const char *,path,struct new_stat *,statbuf)
static inline _syscall2(int,fstat,int,fd,struct new_stat *,statbuf)
static inline _syscall0(int,getpid)
@@ -412,7 +420,7 @@ static inline _syscall1(long,times,struct tms *,tbuf)
static inline _syscall1(long,mmap,long *, buf)
struct timeval;
struct timezone;
-static inline _syscall2(int,gettimeofday,struct timeval *,tp,
+static inline _syscall2(int,gettimeofday,struct kernel_timeval *,tp,
void *, tzp)
static inline _syscall2(int,link,const char *,old,const char *,new)
static inline _syscall1(int,unlink,const char *, f)