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

Last change on this file since 625 was 625, checked in by alain, 5 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
RevLine 
[410]1/*
2 * sys_get_config.c - get hardware platform parameters.
3 *
[625]4 * Author    Alain Greiner (2016,2017,2018,2019)
[410]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
[457]24#include <hal_kernel_types.h>
[410]25#include <hal_uspace.h>
[625]26#include <hal_vmm.h>
[410]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
[506]35#include <syscalls.h>
36
[410]37//////////////////////////////////////
38int sys_get_config( uint32_t * x_size,
39                    uint32_t * y_size,
40                    uint32_t * ncores )
41{
[440]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;
[410]47
48    thread_t  * this    = CURRENT_THREAD;
49    process_t * process = this->process;
50
[625]51#if (DEBUG_SYS_GET_CONFIG || CONFIG_INSTRUMENTATION_SYSCALLS)
52uint64_t     tm_start = hal_get_cycles();
53#endif
54
[438]55#if DEBUG_SYS_GET_CONFIG
[435]56tm_start = hal_get_cycles();
[438]57if( DEBUG_SYS_GET_CONFIG < tm_start )
[435]58printk("\n[DBG] %s : thread %x enter / process %x / cycle %d\n",
59__FUNCTION__, this, process->pid, (uint32_t)tm_start );
60#endif
61
[440]62    // check x_size buffer in user space
63    error = vmm_get_vseg( process , (intptr_t)x_size  , &vseg );
[410]64
65        if( error )
66        {
[435]67
[438]68#if DEBUG_SYSCALLS_ERROR
[440]69printk("\n[ERROR] in %s : x_size buffer unmapped / thread %x / process %x\n",
70__FUNCTION__ , (intptr_t)x_size , this->trdid , process->pid );
[624]71hal_vmm_display( process , false );
[435]72#endif
[440]73        this->errno = EINVAL;
[410]74                return -1;
75        }
76
[440]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 );
[624]86hal_vmm_display( process , false );
[440]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 );
[624]101hal_vmm_display( process , false );
[440]102#endif
103        this->errno = EINVAL;
104                return -1;
105        }
106
[410]107    // get parameters
[421]108        k_x_size  = LOCAL_CLUSTER->x_size;
109        k_y_size  = LOCAL_CLUSTER->y_size;
110        k_ncores  = LOCAL_CLUSTER->cores_nr;
[410]111
112    // copy to user space
[421]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) );
[410]116
[435]117    hal_fence();
118
[625]119#if (DEBUG_SYS_GET_CONFIG || CONFIG_INSTRUMENTATION_SYSCALLS)
120uint64_t     tm_end = hal_get_cycles();
121#endif
122
[438]123#if DEBUG_SYS_GET_CONFIG
124if( DEBUG_SYS_GET_CONFIG < tm_end )
[436]125printk("\n[DBG] %s : thread %x exit / process %x / cost %d / cycle %d\n",
[435]126__FUNCTION__, this, process->pid, (uint32_t)(tm_end-tm_start), (uint32_t)tm_end );
127#endif
128
[625]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
[410]134        return 0; 
135
136}  // end sys_get_config()
Note: See TracBrowser for help on using the repository browser.