source: trunk/kernel/mm/vseg.h @ 631

Last change on this file since 631 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: 7.9 KB
RevLine 
[1]1/*
2 * vseg.h - virtual segment (vseg) related operations
3 *
4 * Authors   Ghassan Almaless (2008,2009,2010,2011, 2012)
5 *           Mohamed Lamine Karaoui (2015)
[623]6 *           Alain Greiner (2016,2017,2018,2019)
[1]7 *
8 * Copyright (c) UPMC Sorbonne Universites
9 *
10 * This file is part of ALMOS-MKH.
11 *
12 * ALMOS-MKH is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; version 2.0 of the License.
15 *
16 * ALMOS-MKH is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
23 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
26#ifndef _VSEG_H_
27#define _VSEG_H_
28
[457]29#include <hal_kernel_types.h>
[1]30#include <vfs.h>
31
32/****  Forward declarations  ****/
33
34struct vmm_s;
35
[409]36/*******************************************************************************************
[623]37 * This enum defines the vseg types.
38 * Note : the KDATA and KDEV types are not used by the TSAR HAL, because the accesses
39 *        to kernel data or kernel devices are done through the DATA extension address
40 *        register, but these types are probably required by the I86 HAL [AG].
[595]41 ******************************************************************************************/
[1]42
[407]43typedef enum
[1]44{
[623]45    VSEG_TYPE_CODE   = 0,          /*! executable user code     / private / localized     */
46    VSEG_TYPE_DATA   = 1,          /*! initialized user data    / public  / distributed   */
47    VSEG_TYPE_STACK  = 2,          /*! execution user stack     / private / localized     */
48    VSEG_TYPE_ANON   = 3,          /*! anonymous mmap           / public  / localized     */
49    VSEG_TYPE_FILE   = 4,          /*! file mmap                / public  / localized     */
50    VSEG_TYPE_REMOTE = 5,          /*! remote mmap              / public  / localized     */
51
52    VSEG_TYPE_KCODE  = 6,          /*! executable kernel code   / private / localized     */
53    VSEG_TYPE_KDATA  = 7,          /*! initialized kernel data  / private / localized     */
54    VSEG_TYPE_KDEV   = 8,          /*! kernel peripheral device / public  / localized     */
[407]55}
56vseg_type_t;
[1]57
58
[409]59/*******************************************************************************************
[18]60 * These masks define the vseg generic (hardware independent) flags.
[409]61 ******************************************************************************************/
[1]62
[409]63#define VSEG_USER     0x0001       /*! user accessible                                    */
64#define VSEG_WRITE    0x0002       /*! writeable                                          */
65#define VSEG_EXEC     0x0004       /*! executable                                         */
66#define VSEG_CACHE    0x0008       /*! cachable                                           */
67#define VSEG_PRIVATE  0x0010       /*! should not be accessed from another cluster        */
68#define VSEG_DISTRIB  0x0020       /*! physically distributed on all clusters             */
[1]69
[409]70/*******************************************************************************************
[1]71 * This structure defines a virtual segment descriptor.
[625]72 * The VSL contains only local vsegs, but is implemented as an xlist, because it can be
73 * accessed by a thread running in a remote cluster.
74 * The xlist field is also used to implement the zombi lists used by the MMAP allocator.
[409]75 ******************************************************************************************/
[1]76
77typedef struct vseg_s
78{
[611]79    xlist_entry_t     xlist;        /*! all vsegs in same VSL                             */
[454]80    struct vmm_s    * vmm;          /*! pointer on associated VM manager                  */
[409]81    uint32_t          type;         /*! vseg type                                         */
[454]82    intptr_t          min;          /*! segment min virtual address                       */
83    intptr_t          max;          /*! segment max virtual address (excluded)            */
84    vpn_t             vpn_base;     /*! first page of vseg                                */
85    vpn_t             vpn_size;     /*! number of pages occupied                          */
86    uint32_t          flags;        /*! vseg attributes                                   */
87    xptr_t            mapper_xp;    /*! xptr on remote mapper (for types CODE/DATA/FILE)  */
88    intptr_t          file_offset;  /*! vseg offset in file (for types CODE/DATA/FILE)    */
[409]89    intptr_t          file_size;    /*! max segment size in mapper (for type CODE/DATA)   */
90    cxy_t             cxy;          /*! physical mapping (for non distributed vseg)       */ 
[1]91}
92vseg_t;
93
[409]94/*******************************************************************************************
[101]95 * This function returns a printable string for the vseg type.
[409]96 *******************************************************************************************
[101]97 * @ vseg_type  : type of vseg
98 * @ return pointer on string
[409]99 ******************************************************************************************/
[101]100char * vseg_type_str( uint32_t vseg_type );
101
[409]102/*******************************************************************************************
[1]103 * This function allocates physical memory for a new vseg descriptor from the local cluster
104 * physical memory allocator.
[409]105 *******************************************************************************************
[1]106 * @ return pointer on allocated vseg descriptor if success / return NULL if failure.
[409]107 ******************************************************************************************/
[503]108vseg_t * vseg_alloc( void );
[1]109
[409]110/*******************************************************************************************
111 * This function releases the physical memory allocated for a vseg descriptor
112 * to the local cluster physical memory allocator.
113 *******************************************************************************************
[1]114 * @ vseg   : local pointer on released vseg descriptor.
[409]115 ******************************************************************************************/
[1]116void vseg_free( vseg_t * vseg );
117
[409]118/*******************************************************************************************
[1]119 * This function initializes a local vseg descriptor, from the arguments values.
120 * It does NOT register the vseg in the local VMM.
[409]121 *******************************************************************************************
[1]122 * @ vseg      : pointer on the vseg descriptor.
123 * @ base      : vseg base address.
124 * @ size      : vseg size (bytes).
125 * @ vpn_base  : first page index.
126 * @ vpn_size  : number of pages.
127 * @ type      : vseg type.
128 * @ cxy       : target cluster for physical mapping.
[409]129 ******************************************************************************************/
[1]130void vseg_init( vseg_t      * vseg,
[407]131                    vseg_type_t   type,
[18]132                intptr_t      base,
[407]133                    uint32_t      size,
[1]134                vpn_t         vpn_base,
135                vpn_t         vpn_size,
[407]136                uint32_t      file_offset,
137                uint32_t      file_size,
138                xptr_t        mapper_xp,
[315]139                cxy_t         cxy );
[1]140
[409]141/*******************************************************************************************
[1]142 * This function initializes a local vseg descriptor from values contained in a reference
143 * remote vseg descriptor. It does NOT register the vseg in the local VMM.
[409]144 *******************************************************************************************
[1]145 * @ vseg      : pointer on the vseg descriptor.
[16]146 * @ ref_xp    : extended pointer on the reference vseg descriptor.
[409]147 ******************************************************************************************/
[1]148void vseg_init_from_ref( vseg_t * vseg,
[16]149                         xptr_t   ref_xp );
[1]150
151
152#endif /* _VSEG_H_ */
Note: See TracBrowser for help on using the repository browser.