|
[ source navigation ] [ diff markup ] [ identifier search ] [ general search ] |
|||
|
001 /* Copyright (C) 2004 David Decotigny 001 /* Copyright (C) 2004 David Decotigny 002 Copyright (C) 2000 The KOS Team << 003 002 004 This program is free software; you can redi 003 This program is free software; you can redistribute it and/or 005 modify it under the terms of the GNU Genera 004 modify it under the terms of the GNU General Public License 006 as published by the Free Software Foundatio 005 as published by the Free Software Foundation; either version 2 007 of the License, or (at your option) any lat 006 of the License, or (at your option) any later version. 008 007 009 This program is distributed in the hope tha 008 This program is distributed in the hope that it will be useful, 010 but WITHOUT ANY WARRANTY; without even the 009 but WITHOUT ANY WARRANTY; without even the implied warranty of 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR 010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 GNU General Public License for more details 011 GNU General Public License for more details. 013 012 014 You should have received a copy of the GNU 013 You should have received a copy of the GNU General Public License 015 along with this program; if not, write to t 014 along with this program; if not, write to the Free Software 016 Foundation, Inc., 59 Temple Place - Suite 3 015 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 017 USA. 016 USA. 018 */ 017 */ 019 #ifndef _SOS_PHYSMEM_H_ 018 #ifndef _SOS_PHYSMEM_H_ 020 #define _SOS_PHYSMEM_H_ 019 #define _SOS_PHYSMEM_H_ 021 020 022 /** 021 /** 023 * @file physmem.h 022 * @file physmem.h 024 * 023 * 025 * Physical pages of memory 024 * Physical pages of memory 026 */ 025 */ 027 026 028 #include <sos/errno.h> 027 #include <sos/errno.h> 029 #include <sos/types.h> 028 #include <sos/types.h> 030 #include <sos/macros.h> 029 #include <sos/macros.h> 031 030 032 /** The size of a physical page (arch-dependen 031 /** The size of a physical page (arch-dependent) */ 033 #define SOS_PAGE_SIZE (4*1024) 032 #define SOS_PAGE_SIZE (4*1024) 034 033 035 /** The corresponding shift */ 034 /** The corresponding shift */ 036 #define SOS_PAGE_SHIFT 12 /* 4 kB = 2^12 B */ 035 #define SOS_PAGE_SHIFT 12 /* 4 kB = 2^12 B */ 037 036 038 /** The corresponding mask */ 037 /** The corresponding mask */ 039 #define SOS_PAGE_MASK ((1<<12) - 1) 038 #define SOS_PAGE_MASK ((1<<12) - 1) 040 039 041 #define SOS_PAGE_ALIGN_INF(val) \ !! 040 #define SOS_PAGE_ALIGN_INF(val) \ 042 SOS_ALIGN_INF((val), SOS_PAGE_SIZE) 041 SOS_ALIGN_INF((val), SOS_PAGE_SIZE) 043 #define SOS_PAGE_ALIGN_SUP(val) \ !! 042 #define SOS_PAGE_ALIGN_SUP(val) \ 044 SOS_ALIGN_SUP((val), SOS_PAGE_SIZE) 043 SOS_ALIGN_SUP((val), SOS_PAGE_SIZE) 045 #define SOS_IS_PAGE_ALIGNED(val) \ !! 044 046 SOS_IS_ALIGNED((val), SOS_PAGE_SIZE) << 047 045 048 /** 046 /** 049 * This is the reserved physical interval for 047 * This is the reserved physical interval for the x86 video memory and 050 * BIOS area. In physmem.c, we have to mark th !! 048 * BIOS area. In physmem.c, we have to mark this area as "used" in 051 * order to prevent from allocating it. And in 049 * order to prevent from allocating it. And in paging.c, we'd better 052 * map it in virtual space if we really want t 050 * map it in virtual space if we really want to be able to print to 053 * the screen (for debugging purpose, at least 051 * the screen (for debugging purpose, at least): for this, the 054 * simplest is to identity-map this area in vi 052 * simplest is to identity-map this area in virtual space (note 055 * however that this mapping could also be non 053 * however that this mapping could also be non-identical). 056 */ 054 */ 057 #define BIOS_N_VIDEO_START 0xa0000 055 #define BIOS_N_VIDEO_START 0xa0000 058 #define BIOS_N_VIDEO_END 0x100000 056 #define BIOS_N_VIDEO_END 0x100000 059 057 060 058 061 /** 059 /** 062 * Initialize the physical memory subsystem, f 060 * Initialize the physical memory subsystem, for the physical area [0, 063 * ram_size). This routine takes into account 061 * ram_size). This routine takes into account the BIOS and video 064 * areas, to prevent them from future allocati 062 * areas, to prevent them from future allocations. 065 * 063 * 066 * @param ram_size The size of the RAM that wi 064 * @param ram_size The size of the RAM that will be managed by this subsystem 067 * 065 * 068 * @param kernel_core_base The lowest address 066 * @param kernel_core_base The lowest address for which the kernel 069 * assumes identity mapping (ie virtual addres 067 * assumes identity mapping (ie virtual address == physical address) 070 * will be stored here 068 * will be stored here 071 * 069 * 072 * @param kernel_core_top The top address for 070 * @param kernel_core_top The top address for which the kernel 073 * assumes identity mapping (ie virtual addres 071 * assumes identity mapping (ie virtual address == physical address) 074 * will be stored here 072 * will be stored here 075 */ 073 */ 076 sos_ret_t sos_physmem_subsystem_setup(sos_size !! 074 sos_ret_t sos_physmem_setup(sos_size_t ram_size, 077 /* out * !! 075 /* out */sos_paddr_t *kernel_core_base, 078 /* out * !! 076 /* out */sos_paddr_t *kernel_core_top); 079 077 080 /** 078 /** 081 * Retrieve the total number of pages, and the 079 * Retrieve the total number of pages, and the number of free pages 082 */ 080 */ 083 sos_ret_t sos_physmem_get_state(/* out */sos_c 081 sos_ret_t sos_physmem_get_state(/* out */sos_count_t *total_ppages, 084 /* out */sos_c !! 082 /* out */sos_count_t *used_ppages); 085 083 086 084 087 /** 085 /** 088 * Get a free page. 086 * Get a free page. 089 * 087 * 090 * @return The (physical) address of the (phys 088 * @return The (physical) address of the (physical) page allocated, or 091 * NULL when none currently available. 089 * NULL when none currently available. 092 * 090 * 093 * @param can_block TRUE if the function is al 091 * @param can_block TRUE if the function is allowed to block 094 * @note The page returned has a reference cou 092 * @note The page returned has a reference count equal to 1. 095 */ 093 */ 096 sos_paddr_t sos_physmem_ref_physpage_new(sos_b 094 sos_paddr_t sos_physmem_ref_physpage_new(sos_bool_t can_block); 097 095 098 096 099 /** 097 /** 100 * Increment the reference count of a given ph 098 * Increment the reference count of a given physical page. Useful for 101 * VM code which tries to map a precise physic 099 * VM code which tries to map a precise physical address. 102 * 100 * 103 * @param ppage_paddr Physical address of the !! 101 * @return TRUE when the page was previously in use, FALSE when the 104 * !! 102 * page was previously in the free list, <0 when the page address is 105 * @return TRUE when the page was previously r << 106 * the page was previously unreferenced, <0 wh << 107 * invalid. 103 * invalid. 108 */ 104 */ 109 sos_ret_t sos_physmem_ref_physpage_at(sos_padd 105 sos_ret_t sos_physmem_ref_physpage_at(sos_paddr_t ppage_paddr); 110 106 111 107 112 /** 108 /** 113 * Decrement the reference count of the given !! 109 * Decrement the reference count of the given physical page. When this 114 * reference count of the page reaches 0, the !! 110 * reference count reaches 0, the page is marked free, ie is available 115 * is available for future sos_physmem_ref_phy !! 111 * for future sos_physmem_get_physpage() 116 * 112 * 117 * @param ppage_paddr Physical address of the !! 113 * @return FALSE when the page is still in use, TRUE when the page is now 118 * !! 114 * unreferenced, <0 when the page address is invalid 119 * @return FALSE when the page is still refere << 120 * is now unreferenced, <0 when the page addre << 121 */ 115 */ 122 sos_ret_t sos_physmem_unref_physpage(sos_paddr 116 sos_ret_t sos_physmem_unref_physpage(sos_paddr_t ppage_paddr); 123 117 124 118 125 /** << 126 * Return the reference count of the given pag << 127 * << 128 * @return >= 0 (the referebce count of the pa << 129 * address is valid, or an error status << 130 */ << 131 sos_ret_t sos_physmem_get_physpage_refcount(so << 132 << 133 << 134 << 135 /* << 136 * In some cases (Page Tables on x86 for examp << 137 * might contain a set of slots available for << 138 * example: a PT contains a set of PTE). We pr << 139 * functions to manage a per-page additional c << 140 * number of slots currently in use in the pag << 141 * << 142 * A newly allocated physical page has a occup << 143 * << 144 * The management of this counter is up to the << 145 * the page (mainly: paging), however a simple << 146 * - it can only be incremented/decremented << 147 * - when it reaches 0, no automatic action << 148 * The first rule means in particular that a p << 149 * count reaches 0 (=> being freed) cannot hav << 150 * value > 0 ! The system will be HALTED if th << 151 */ << 152 << 153 << 154 /** << 155 * Increment the occupation count of the given << 156 * << 157 * @param ppage_paddr Physical address of the << 158 * << 159 * @return TRUE when the occupation count was << 160 * when this occupation count was 0, <0 when t << 161 * << 162 * @note the page MUST be marked as REFERENCED << 163 */ << 164 sos_ret_t sos_physmem_inc_physpage_occupation( << 165 << 166 << 167 /** << 168 * Decrement the occupation count of the given << 169 * << 170 * @param ppage_paddr Physical address of the << 171 * << 172 * @return FALSE when the occupation count is << 173 * page now is ZERO, <0 when the page address << 174 * << 175 * @note the page MUST be marked as REFERENCED << 176 */ << 177 sos_ret_t sos_physmem_dec_physpage_occupation( << 178 << 179 << 180 #include <sos/kmem_vmm.h> 119 #include <sos/kmem_vmm.h> 181 120 182 /** 121 /** 183 * Return the kernel memory allocation range a 122 * Return the kernel memory allocation range associated with the given 184 * physical page, or NULL when page has no ass 123 * physical page, or NULL when page has no associated range 185 * << 186 * @param ppage_paddr Physical address of the << 187 */ 124 */ 188 struct sos_kmem_range* sos_physmem_get_kmem_ra 125 struct sos_kmem_range* sos_physmem_get_kmem_range(sos_paddr_t ppage_paddr); 189 126 190 127 191 /** 128 /** 192 * Set the kernel memory allocation range asso 129 * Set the kernel memory allocation range associated to the given 193 * physical page. 130 * physical page. 194 * << 195 * @param ppage_paddr Physical address of the << 196 * << 197 * @return error if page is invalid 131 * @return error if page is invalid 198 */ 132 */ 199 sos_ret_t sos_physmem_set_kmem_range(sos_paddr 133 sos_ret_t sos_physmem_set_kmem_range(sos_paddr_t ppage_paddr, 200 struct so 134 struct sos_kmem_range *range); 201 135 202 #endif /* _SOS_PHYSMEM_H_ */ 136 #endif /* _SOS_PHYSMEM_H_ */
[ source navigation ] | [ diff markup ] | [ identifier search ] | [ general search ] |