|
[ source navigation ] [ diff markup ] [ identifier search ] [ general search ] |
|||
|
001 /* Copyright (C) 2004 David Decotigny 002 003 This program is free software; you can redistribute it and/or 004 modify it under the terms of the GNU General Public License 005 as published by the Free Software Foundation; either version 2 006 of the License, or (at your option) any later version. 007 008 This program is distributed in the hope that it will be useful, 009 but WITHOUT ANY WARRANTY; without even the implied warranty of 010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 011 GNU General Public License for more details. 012 013 You should have received a copy of the GNU General Public License 014 along with this program; if not, write to the Free Software 015 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 016 USA. 017 */ 018 #ifndef _SOS_PHYSMEM_H_ 019 #define _SOS_PHYSMEM_H_ 020 021 /** 022 * @file physmem.h 023 * 024 * Physical pages of memory 025 */ 026 027 #include <sos/errno.h> 028 #include <sos/types.h> 029 #include <sos/macros.h> 030 031 /** The size of a physical page (arch-dependent) */ 032 #define SOS_PAGE_SIZE (4*1024) 033 034 /** The corresponding shift */ 035 #define SOS_PAGE_SHIFT 12 /* 4 kB = 2^12 B */ 036 037 /** The corresponding mask */ 038 #define SOS_PAGE_MASK ((1<<12) - 1) 039 040 #define SOS_PAGE_ALIGN_INF(val) \ 041 SOS_ALIGN_INF((val), SOS_PAGE_SIZE) 042 #define SOS_PAGE_ALIGN_SUP(val) \ 043 SOS_ALIGN_SUP((val), SOS_PAGE_SIZE) 044 #define SOS_IS_PAGE_ALIGNED(val) \ 045 SOS_IS_ALIGNED((val), SOS_PAGE_SIZE) 046 047 /** 048 * This is the reserved physical interval for the x86 video memory and 049 * BIOS area. In physmem.c, we have to mark this area as "used" in 050 * order to prevent from allocating it. And in paging.c, we'd better 051 * map it in virtual space if we really want to be able to print to 052 * the screen (for debugging purpose, at least): for this, the 053 * simplest is to identity-map this area in virtual space (note 054 * however that this mapping could also be non-identical). 055 */ 056 #define BIOS_N_VIDEO_START 0xa0000 057 #define BIOS_N_VIDEO_END 0x100000 058 059 060 /** 061 * Initialize the physical memory subsystem, for the physical area [0, 062 * ram_size). This routine takes into account the BIOS and video 063 * areas, to prevent them from future allocations. 064 * 065 * @param ram_size The size of the RAM that will be managed by this subsystem 066 * 067 * @param kernel_core_base The lowest address for which the kernel 068 * assumes identity mapping (ie virtual address == physical address) 069 * will be stored here 070 * 071 * @param kernel_core_top The top address for which the kernel 072 * assumes identity mapping (ie virtual address == physical address) 073 * will be stored here 074 */ 075 sos_ret_t sos_physmem_subsystem_setup(sos_size_t ram_size, 076 /* out */sos_paddr_t *kernel_core_base, 077 /* out */sos_paddr_t *kernel_core_top); 078 079 /** 080 * Retrieve the total number of pages, and the number of free pages 081 */ 082 sos_ret_t sos_physmem_get_state(/* out */sos_count_t *total_ppages, 083 /* out */sos_count_t *used_ppages); 084 085 086 /** 087 * Get a free page. 088 * 089 * @return The (physical) address of the (physical) page allocated, or 090 * NULL when none currently available. 091 * 092 * @param can_block TRUE if the function is allowed to block 093 * @note The page returned has a reference count equal to 1. 094 */ 095 sos_paddr_t sos_physmem_ref_physpage_new(sos_bool_t can_block); 096 097 098 /** 099 * Increment the reference count of a given physical page. Useful for 100 * VM code which tries to map a precise physical address. 101 * 102 * @param ppage_paddr Physical address of the page (MUST be page-aligned) 103 * 104 * @return TRUE when the page was previously in use, FALSE when the 105 * page was previously in the free list, <0 when the page address is 106 * invalid. 107 */ 108 sos_ret_t sos_physmem_ref_physpage_at(sos_paddr_t ppage_paddr); 109 110 111 /** 112 * Decrement the reference count of the given physical page. When this 113 * reference count reaches 0, the page is marked free, ie is available 114 * for future sos_physmem_get_physpage() 115 * 116 * @param ppage_paddr Physical address of the page (MUST be page-aligned) 117 * 118 * @return FALSE when the page is still in use, TRUE when the page is now 119 * unreferenced, <0 when the page address is invalid 120 */ 121 sos_ret_t sos_physmem_unref_physpage(sos_paddr_t ppage_paddr); 122 123 124 #include <sos/kmem_vmm.h> 125 126 /** 127 * Return the kernel memory allocation range associated with the given 128 * physical page, or NULL when page has no associated range 129 * 130 * @param ppage_paddr Physical address of the page (MUST be page-aligned) 131 */ 132 struct sos_kmem_range* sos_physmem_get_kmem_range(sos_paddr_t ppage_paddr); 133 134 135 /** 136 * Set the kernel memory allocation range associated to the given 137 * physical page. 138 * 139 * @param ppage_paddr Physical address of the page (MUST be page-aligned) 140 * 141 * @return error if page is invalid 142 */ 143 sos_ret_t sos_physmem_set_kmem_range(sos_paddr_t ppage_paddr, 144 struct sos_kmem_range *range); 145 146 #endif /* _SOS_PHYSMEM_H_ */
[ source navigation ] | [ diff markup ] | [ identifier search ] | [ general search ] |