source: trunk/kernel/syscalls/sys_is_fg.c @ 624

Last change on this file since 624 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: 3.3 KB
Line 
1/*
2 * sys_fg.c - Kernel function implementing the "is_fg" system call.
3 *
4 * Author    Alain Greiner (2016,2017,2018)
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 <kernel_config.h>
25#include <hal_kernel_types.h>
26#include <hal_uspace.h>
27#include <hal_special.h>
28#include <errno.h>
29#include <thread.h>
30#include <printk.h>
31#include <process.h>
32#include <vseg.h>
33#include <shared_syscalls.h>
34#include <cluster.h>
35
36#include <syscalls.h>
37
38//////////////////////////////
39int sys_is_fg( pid_t      pid,
40               uint32_t * is_fg )
41{
42    xptr_t      process_xp;       // extended pointer on process descriptor in owner cluster
43    uint32_t    is_txt_owner;     // kernel buffer for is_fg
44    vseg_t    * vseg;             // for buffer mapping check
45    error_t     error;
46
47    thread_t  * this    = CURRENT_THREAD;
48    process_t * process = this->process;
49
50#if (DEBUG_SYS_IS_FG || CONFIG_INSTRUMENTATION_SYSCALLS)
51uint64_t     tm_start = hal_get_cycles();
52#endif
53
54#if DEBUG_SYS_IS_FG
55tm_start = hal_get_cycles();
56if( DEBUG_SYS_IS_FG < tm_start )
57printk("\n[DBG] %s : thread %x in process %x enter for pid %x / cycle %d\n",
58__FUNCTION__ , this->trdid , process->pid, pid, (uint32_t)tm_start );
59#endif
60
61    // check buffer in user vspace
62        error = vmm_get_vseg( process , (intptr_t)is_fg , &vseg );
63    if( error )
64    {
65
66#if DEBUG_SYSCALLS_ERROR
67printk("\n[ERROR] in %s : unmapped owner buffer %x / thread %x in process %x\n",
68__FUNCTION__ , (intptr_t)is_fg, this->trdid, process->pid );
69hal_vmm_display( process , false );
70#endif
71         this->errno = EINVAL;
72         return -1;
73    }
74
75    // check target process existence
76    process_xp = cluster_get_owner_process_from_pid( pid );
77
78    if( process_xp == XPTR_NULL )
79    {
80
81#if DEBUG_SYSCALLS_ERROR
82printk("\n[ERROR] in %s : process %x not found\n", __FUNCTION__ , pid );
83#endif
84        this->errno = EINVAL;
85        return -1;
86    }
87   
88    // call relevant kernel function
89    is_txt_owner = process_txt_is_owner( process_xp );
90
91    // copy to user space
92    hal_copy_to_uspace( is_fg , &is_txt_owner , sizeof(uint32_t) );
93
94    hal_fence();
95
96#if (DEBUG_SYS_IS_FG || CONFIG_INSTRUMENTATION_SYSCALLS)
97uint64_t     tm_end = hal_get_cycles();
98#endif
99
100#if DEBUG_SYS_IS_FG
101tm_end = hal_get_cycles();
102if( DEBUG_SYS_IS_FG < tm_end )
103printk("\n[DBG] %s : thread %x in process %x exit / is_txt_owner %d / cycle %d\n",
104__FUNCTION__, this->trdid, process->pid, is_txt_owner, (uint32_t)tm_end );
105#endif
106
107#if CONFIG_INSTRUMENTATION_SYSCALLS
108hal_atomic_add( &syscalls_cumul_cost[SYS_IS_FG] , tm_end - tm_start );
109hal_atomic_add( &syscalls_occurences[SYS_IS_FG] , 1 );
110#endif
111
112return 0;
113
114}  // end sys_is_fg()
115
Note: See TracBrowser for help on using the repository browser.