SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

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 ]