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