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

Last change on this file since 625 was 625, checked in by alain, 2 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: 2.3 KB
Line 
1/*
2 * sys_get_core.c - get calling core cluster and local index.
3 *
4 * Author    Alain Greiner (2016,2017)
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_core( uint32_t * cxy,
39                  uint32_t * lid )
40{
41        error_t   error;
42    vseg_t  * vseg;
43    uint32_t  k_cxy;
44    uint32_t  k_lid;
45
46    thread_t  * this    = CURRENT_THREAD;
47    process_t * process = this->process;
48
49    // check cxy buffer in user space
50    error = vmm_get_vseg( process , (intptr_t)cxy , &vseg );
51
52        if( error )
53        {
54
55#if DEBUG_SYSCALLS_ERROR
56printk("\n[ERROR] in %s : cxy buffer unmapped %x / thread %x / process %x\n",
57__FUNCTION__ , (intptr_t)cxy , this->trdid , process->pid );
58hal_vmm_display( process , false );
59#endif
60        this->errno = EFAULT;
61                return -1;
62        }
63
64    // check lid buffer in user space
65    error = vmm_get_vseg( process , (intptr_t)lid , &vseg );
66
67        if( error )
68        {
69
70#if DEBUG_SYSCALLS_ERROR
71printk("\n[ERROR] in %s : lid buffer unmapped %x / thread %x / process %x\n",
72__FUNCTION__ , (intptr_t)lid , this->trdid , process->pid );
73hal_vmm_display( process , false );
74#endif
75        this->errno = EFAULT;
76                return -1;
77        }
78
79    // get parameters
80        k_cxy = local_cxy;
81        k_lid = this->core->lid;
82
83    // copy to user space
84        hal_copy_to_uspace( cxy , &k_cxy , sizeof(uint32_t) );
85        hal_copy_to_uspace( lid , &k_lid , sizeof(uint32_t) );
86
87        return 0; 
88
89}  // end sys_get_core()
Note: See TracBrowser for help on using the repository browser.