source: trunk/kernel/mm/page.h @ 608

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

Improve the FAT32 file system to support cat, rm, cp commands.

File size: 6.7 KB
RevLine 
[1]1/*
2 * page.h - physical page descriptor and related operations
3 *
4 * Authors Ghassan Almalles (2008,2009,2010,2011,2012)
5 *         Alain Greiner    (2016)
6 *
7 * Copyright (c) UPMC Sorbonne Universites
8 *
9 * This file is part of ALMOS-MKH.
10 *
11 * ALMOS-MKH is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; version 2.0 of the License.
14 *
15 * ALMOS-MKH is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25#ifndef _PAGE_H_
26#define _PAGE_H_
27
[14]28#include <kernel_config.h>
[457]29#include <hal_kernel_types.h>
[567]30#include <remote_busylock.h>
[1]31#include <list.h>
32
33/***   Forward declarations   ***/
34
35struct mapper_s;
[18]36
[1]37/*************************************************************************************
38 * This  defines the flags that can be attached to a physical page.
[606]39 * TODO : the PG_BUFFER and PG_IO_ERR flags semantic is not defined [AG]
[1]40 ************************************************************************************/
41
42#define PG_INIT             0x0001     // page descriptor has been initialised
43#define PG_RESERVED         0x0002     // cannot be allocated by PPM
44#define PG_FREE             0x0004     // page can be allocated by PPM
[567]45#define PG_IO_ERR           0x0010     // mapper signals access error    TODO ??? [AG]
46#define PG_BUFFER           0x0020     // used in blockio.c              TODO ??? [AG]
[1]47#define PG_DIRTY            0x0040     // page has been written
[567]48#define PG_COW          0x0080     // page is copy-on-write
[1]49
50/*************************************************************************************
51 * This structure defines a physical page descriptor.
[606]52 * - The remote_busylock is used to allows any remote thread to atomically
53 *   test/modify the forks counter or the page flags.
54 * - The list entry is used to register the page in a free list or in dirty list.
55 * NOTE: Size is 48 bytes for a 32 bits core.
56 * TODO : the refcount use is not defined [AG]
[1]57 ************************************************************************************/
58
59typedef struct page_s
60{
[23]61    uint32_t          flags;          /*! flags defined above                  (4)  */
[68]62    uint32_t          order;          /*! log2( number of small pages)         (4)  */
[1]63    struct mapper_s * mapper;         /*! local pointer on associated mapper   (4)  */
64    uint32_t          index;          /*! page index in mapper                 (4)  */
[18]65        list_entry_t      list;           /*! for both dirty pages and free pages  (8)  */
[567]66        uint32_t          refcount;       /*! reference counter TODO ??? [AG]      (4)  */
[433]67        uint32_t          forks;          /*! number of pending forks              (4)  */
[606]68        remote_busylock_t lock;           /*! protect forks or flags modifs        (16) */
[1]69}
70page_t;
71
72/*************************************************************************************
73 * This function initializes one page descriptor.
[23]74 *************************************************************************************
[1]75 * @ page    : pointer to page descriptor
76 ************************************************************************************/
77inline void page_init( page_t * page );
78
79/*************************************************************************************
[23]80 * This function atomically set one or several flags in page descriptor flags.
81 *************************************************************************************
[1]82 * @ page    : pointer to page descriptor.
[18]83 * @ value   : all non zero bits in value will be set.
[1]84 ************************************************************************************/
85inline void page_set_flag( page_t   * page,
[23]86                           uint32_t   value );
[1]87
88/*************************************************************************************
[23]89 * This function atomically reset one or several flags in page descriptor flags.
90 *************************************************************************************
[1]91 * @ page    : pointer to page descriptor.
[18]92 * @ value   : all non zero bits in value will be cleared.
[1]93 ************************************************************************************/
94inline void page_clear_flag( page_t   * page,
[23]95                             uint32_t   value );
[1]96
97/*************************************************************************************
[22]98 * This function tests the value of one or several flags in page descriptor flags.
[23]99 *************************************************************************************
[1]100 * @ page    : pointer to page descriptor.
101 * @ value   : all non zero bits will be tested.
[18]102 * @ returns true if at least one non zero bit in value is set / false otherwise.
[1]103 ************************************************************************************/
104inline bool_t page_is_flag( page_t   * page,
[23]105                            uint32_t   value );
[1]106
107/*************************************************************************************
[22]108 * This function resets to 0 all bytes in a given page.
[23]109 *************************************************************************************
[1]110 * @ page     : pointer on page descriptor.
111 ************************************************************************************/
112void page_zero( page_t * page );
113
114/*************************************************************************************
[22]115 * This blocking function atomically increments the page refcount.
[23]116 *************************************************************************************
[1]117 * @ page     : pointer on page descriptor.
118 ************************************************************************************/
119inline void page_refcount_up( page_t * page );
120
121/*************************************************************************************
[22]122 * This blocking function atomically decrements the page refcount.
[23]123 *************************************************************************************
[1]124 * @ page     : pointer on page descriptor.
125 ************************************************************************************/
126inline void page_refcount_down( page_t * page );
127
128/*************************************************************************************
129 * This function display the values contained in a page descriptor.
[23]130 *************************************************************************************
131 * @ page     : pointer on page descriptor.
[1]132 ************************************************************************************/
133void page_print( page_t * page );
134
135
136#endif  /* _PAGE_H_ */
Note: See TracBrowser for help on using the repository browser.