source: trunk/kernel/syscalls/sys_timeofday.c @ 625

Last change on this file since 625 was 624, checked in by alain, 5 years ago

Fix several bugs to use the instruction MMU in kernel mode
in replacement of the instruction address extension register,
and remove the "kentry" segment.

This version is running on the tsar_generic_iob" platform.

One interesting bug: the cp0_ebase defining the kernel entry point
(for interrupts, exceptions and syscalls) must be initialized
early in kernel_init(), because the VFS initialisation done by
kernel_ini() uses RPCs, and RPCs uses Inter-Processor-Interrup.

File size: 2.3 KB
Line 
1/*
2 * sys_timeofday.c - Get current time
3 *
4 * Author    Alain Greiner (2016,2017,2018,2019)
5 *
6 * Copyright (c) UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include <hal_kernel_types.h>
25#include <hal_uspace.h>
26#include <hal_vmm.h>
27#include <thread.h>
28#include <printk.h>
29#include <errno.h>
30#include <process.h>
31#include <vmm.h>
32#include <core.h>
33#include <shared_syscalls.h>
34
35#include <syscalls.h>
36
37////////////////////////////////////////
38int sys_timeofday( struct timeval  * tv,
39                   struct timezone * tz )
40{
41        error_t        error;
42    vseg_t       * vseg;
43
44        uint32_t       tm_s;
45    uint32_t       tm_us;
46
47        struct timeval k_tv;
48
49        thread_t  *    this    = CURRENT_THREAD;
50        process_t *    process = this->process;
51
52    // check tz (non supported / must be null)
53    if( tz )
54    {
55
56#if DEBUG_SYSCALLS_ERROR
57printk("\n[ERROR] in %s for thread %x in process %x : tz argument must be NULL\n",
58__FUNCTION__ , this->trdid , process->pid );
59#endif
60        this->errno = EINVAL;
61        return -1;
62    }
63 
64    // check tv
65    error = vmm_get_vseg( process , (intptr_t)tv , &vseg );
66
67    if( error )
68    {
69
70#if DEBUG_SYSCALLS_ERROR
71printk("\n[ERROR] in %s : user buffer tz unmapped / thread %x / process %x\n",
72__FUNCTION__ , (intptr_t)tz , this->trdid , process->pid );
73hal_vmm_display( process , false );
74#endif
75        this->errno = EINVAL;
76        return -1;
77    }
78
79    // get time from calling core descriptor
80    core_get_time( this->core , &tm_s , &tm_us );
81        k_tv.tv_sec  = tm_s;
82        k_tv.tv_usec = tm_us;
83
84    // copy values to user space
85        hal_copy_to_uspace( tv , &k_tv , sizeof(struct timeval) );
86
87    hal_fence();
88
89        return 0; 
90
91}  // end sys_timeofday()
Note: See TracBrowser for help on using the repository browser.