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>
This commit is contained in:
parent
d83404e418
commit
a6837ca34f
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue