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

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

Fix a bug in the vmm_remove_vseg() function: the physical pages
associated to an user DATA vseg were released to the kernel when
the target process descriptor was in the reference cluster.
This physical pages release should be done only when the page
forks counter value is zero.
All other modifications are cosmetic.

File size: 3.8 KB
Line 
1/*
2 * sys_get_config.c - get hardware platform parameters.
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 <hal_special.h>
28#include <errno.h>
29#include <core.h>
30#include <thread.h>
31#include <process.h>
32#include <vmm.h>
33#include <printk.h>
34
35#include <syscalls.h>
36
37//////////////////////////////////////
38int sys_get_config( uint32_t * x_size,
39                    uint32_t * y_size,
40                    uint32_t * ncores )
41{
42        error_t    error;
43    vseg_t   * vseg;
44    uint32_t   k_x_size;
45    uint32_t   k_y_size;
46    uint32_t   k_ncores;
47
48    thread_t  * this    = CURRENT_THREAD;
49    process_t * process = this->process;
50
51#if (DEBUG_SYS_GET_CONFIG || CONFIG_INSTRUMENTATION_SYSCALLS)
52uint64_t     tm_start = hal_get_cycles();
53#endif
54
55#if DEBUG_SYS_GET_CONFIG
56tm_start = hal_get_cycles();
57if( DEBUG_SYS_GET_CONFIG < tm_start )
58printk("\n[DBG] %s : thread %x enter / process %x / cycle %d\n",
59__FUNCTION__, this, process->pid, (uint32_t)tm_start );
60#endif
61
62    // check x_size buffer in user space
63    error = vmm_get_vseg( process , (intptr_t)x_size  , &vseg );
64
65        if( error )
66        {
67
68#if DEBUG_SYSCALLS_ERROR
69printk("\n[ERROR] in %s : x_size buffer unmapped / thread %x / process %x\n",
70__FUNCTION__ , (intptr_t)x_size , this->trdid , process->pid );
71hal_vmm_display( process , false );
72#endif
73        this->errno = EINVAL;
74                return -1;
75        }
76
77    // check y_size buffer in user space
78    error = vmm_get_vseg( process , (intptr_t)y_size  , &vseg );
79
80        if( error )
81        {
82
83#if DEBUG_SYSCALLS_ERROR
84printk("\n[ERROR] in %s : y_size buffer unmapped / thread %x / process %x\n",
85__FUNCTION__ , (intptr_t)y_size , this->trdid , process->pid );
86hal_vmm_display( process , false );
87#endif
88        this->errno = EINVAL;
89                return -1;
90        }
91
92    // check ncores buffer in user space
93    error = vmm_get_vseg( process , (intptr_t)ncores  , &vseg );
94
95        if( error )
96        {
97
98#if DEBUG_SYSCALLS_ERROR
99printk("\n[ERROR] in %s : ncores buffer unmapped / thread %x / process %x\n",
100__FUNCTION__ , (intptr_t)ncores , this->trdid , process->pid );
101hal_vmm_display( process , false );
102#endif
103        this->errno = EINVAL;
104                return -1;
105        }
106
107    // get parameters
108        k_x_size  = LOCAL_CLUSTER->x_size;
109        k_y_size  = LOCAL_CLUSTER->y_size;
110        k_ncores  = LOCAL_CLUSTER->cores_nr;
111
112    // copy to user space
113        hal_copy_to_uspace( x_size  , &k_x_size  , sizeof(uint32_t) );
114        hal_copy_to_uspace( y_size  , &k_y_size  , sizeof(uint32_t) );
115        hal_copy_to_uspace( ncores  , &k_ncores  , sizeof(uint32_t) );
116
117    hal_fence();
118
119#if (DEBUG_SYS_GET_CONFIG || CONFIG_INSTRUMENTATION_SYSCALLS)
120uint64_t     tm_end = hal_get_cycles();
121#endif
122
123#if DEBUG_SYS_GET_CONFIG
124if( DEBUG_SYS_GET_CONFIG < tm_end )
125printk("\n[DBG] %s : thread %x exit / process %x / cost %d / cycle %d\n",
126__FUNCTION__, this, process->pid, (uint32_t)(tm_end-tm_start), (uint32_t)tm_end );
127#endif
128
129#if CONFIG_INSTRUMENTATION_SYSCALLS
130hal_atomic_add( &syscalls_cumul_cost[SYS_GET_CONFIG] , tm_end - tm_start );
131hal_atomic_add( &syscalls_occurences[SYS_GET_CONFIG] , 1 );
132#endif
133
134        return 0; 
135
136}  // end sys_get_config()
Note: See TracBrowser for help on using the repository browser.