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_PAGING_H_
019 #define _SOS_PAGING_H_
020 
021 /**
022  * @file paging.h
023  *
024  * MMU management routines (arch-dependent). Setup the MMU without
025  * identity-mapping physical<->virtual addresses over the whole
026  * physical address space: a single, restricted and known, area is
027  * identity-mapped, the remaining kernel/user space is not. To access
028  * and manage the MMU translation tables (PD/PT on x86), we rely on a
029  * particular configuration, called "mirroring", where the top-level
030  * translation table (PD on x86) maps itself at a known and fixed (virtual)
031  * address. The only assumption for this to be possible is that the
032  * structure of the translation table entries are compatible at the
033  * different levels of vadddr->paddr translation process (PDE and PTE
034  * on x86 are Ok). Credits go to Christophe Avoinne for that.
035  */
036 
037 #include <sos/types.h>
038 #include <sos/errno.h>
039 
040 /**
041  * sos_paging_map flags
042  */
043 /** Usual virtual memory access rights */
044 #define SOS_VM_MAP_PROT_NONE  0
045 #define SOS_VM_MAP_PROT_READ  (1<<0)
046 #define SOS_VM_MAP_PROT_WRITE (1<<1)
047 /* EXEC not supported */
048 /** Mapping a page may involve an physical page allocation (for a new
049     PT), hence may potentially block */
050 #define SOS_VM_MAP_ATOMIC     (1<<31)
051 
052 /** Virtual address where the mirroring takes place */
053 #define SOS_PAGING_MIRROR_VADDR 0x3fc00000 /* 1GB - 4MB */
054 /** Length of the space reserved for the mirroring in the kernel
055     virtual space */
056 #define SOS_PAGING_MIRROR_SIZE  (1 << 22)  /* 1 PD = 1024 Page Tables = 4MB */
057 
058 /**
059  * Setup initial page directory structure where the kernel is
060  * identically-mapped, and the mirroring. This routine also
061  * identity-maps the BIOS and video areas, to allow some debugging
062  * text to be printed to the console. Finally, this routine installs
063  * the whole configuration into the MMU.
064  */
065 sos_ret_t sos_paging_setup(sos_paddr_t identity_mapping_base,
066                            sos_paddr_t identity_mapping_top);
067 
068 /**
069  * Map the given physical page at the given virtual address in the
070  * current address space.
071  *
072  * @note *IMPORTANT*: The physical page ppage_paddr *MUST* have been
073  * referenced by the caller through either a call to
074  * sos_physmem_ref_physpage_new() or sos_physmem_ref_physpage_at(). It
075  * would work if this were untrue, but this would be INCORRECT (it is
076  * expected that one is owning the page before mapping it, or
077  * otherwise the page could have been stolen by an interrupt or
078  * another thread).
079  *
080  * @param ppage_paddr  The address of a physical page (page-aligned)
081  * @param vpage_vaddr  The address of the virtual page (page-aligned)
082  * @param is_user_page TRUE when the page is available from user space
083  * @param flags        A mask made of SOS_VM_* bits
084  *
085  * @note Unless the SOS_VM_MAP_ATOMIC bit is set in the flags, the
086  * function may potentially block, because a physical page may be
087  * allocated for a new PT.
088  */
089 sos_ret_t sos_paging_map(sos_paddr_t ppage_paddr,
090                          sos_vaddr_t vpage_vaddr,
091                          sos_bool_t is_user_page,
092                          int flags);
093 
094 /**
095  * Undo the mapping from vaddr to the underlying physical page (if any)
096  * @param vpage_vaddr  The address of the virtual page (page-aligned)
097  */
098 sos_ret_t sos_paging_unmap(sos_vaddr_t vpage_vaddr);
099 
100 /**
101  * Return the page protection flags (SOS_VM_MAP_PROT_*) associated
102  * with the address, or SOS_VM_MAP_PROT_NONE when page is not mapped
103  */
104 int sos_paging_get_prot(sos_vaddr_t vaddr);
105 
106 /**
107  * Return the physical address of the given virtual address. Since page
108  * at physical addr 0 is not mapped, the NULL result means "page not
109  * mapped".
110  */
111 sos_paddr_t sos_paging_get_paddr(sos_vaddr_t vaddr);
112 
113 /**
114  * Tell whether the address is physically mapped
115  */
116 #define sos_paging_check_present(vaddr) \
117   (sos_paging_get_paddr(vaddr) != NULL)
118 
119 
120 #endif /* _SOS_PAGING_H_ */

source navigation ] diff markup ] identifier search ] general search ]