|
[ 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_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 ] |