Goto sanos source index
//
// pdir.h
//
// Page directory routines
//
// Copyright (C) 2002 Michael Ringgaard. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// 3. Neither the name of the project nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
#ifndef PDIR_H
#define PDIR_H
typedef unsigned long pte_t;
#define PAGESIZE 4096
#define PAGESHIFT 12
#define PTES_PER_PAGE (PAGESIZE / sizeof(pte_t))
#define PT_PRESENT 0x001
#define PT_WRITABLE 0x002
#define PT_USER 0x004
#define PT_ACCESSED 0x020
#define PT_DIRTY 0x040
#define PT_GUARD 0x200
#define PT_FILE 0x400
#define PT_USER_READ (PT_PRESENT | PT_USER)
#define PT_USER_WRITE (PT_PRESENT | PT_USER | PT_WRITABLE)
#define PT_FLAGMASK (PT_PRESENT | PT_WRITABLE | PT_USER | PT_ACCESSED | PT_DIRTY | PT_GUARD | PT_FILE)
#define PT_PROTECTMASK (PT_WRITABLE | PT_USER | PT_GUARD)
#define PT_PFNMASK 0xFFFFF000
#define PT_PFNSHIFT 12
#define PDEIDX(vaddr) (((unsigned long) vaddr) >> 22)
#define PTEIDX(vaddr) ((((unsigned long) vaddr) >> 12) & 0x3FF)
#define PGOFF(vaddr) (((unsigned long) vaddr) & 0xFFF)
#define PTABIDX(vaddr) (((unsigned long) vaddr) >> 12)
#define PAGES(x) (((unsigned long)(x) + (PAGESIZE - 1)) >> PAGESHIFT)
#define PAGEADDR(x) ((unsigned long)(x) & ~(PAGESIZE - 1))
#define PTOB(x) ((unsigned long)(x) << PAGESHIFT)
#define BTOP(x) ((unsigned long)(x) >> PAGESHIFT)
#define SET_PDE(vaddr, val) set_page_dir_entry(&pdir[PDEIDX(vaddr)], (val))
#define SET_PTE(vaddr, val) set_page_table_entry(&ptab[PTABIDX(vaddr)], (val))
#define GET_PDE(vaddr) (pdir[PDEIDX(vaddr)])
#define GET_PTE(vaddr) (ptab[PTABIDX(vaddr)])
struct pdirstat {
int present;
int user;
int kernel;
int readonly;
int readwrite;
int accessed;
int dirty;
};
#ifdef KERNEL
extern pte_t *pdir;
extern pte_t *ptab;
krnlapi void map_page(void *vaddr, unsigned long pfn, unsigned long flags);
krnlapi void unmap_page(void *vaddr);
krnlapi unsigned long virt2phys(void *vaddr);
krnlapi unsigned long virt2pfn(void *vaddr);
krnlapi pte_t get_page_flags(void *vaddr);
krnlapi void set_page_flags(void *vaddr, unsigned long flags);
krnlapi int page_mapped(void *vaddr);
krnlapi int page_directory_mapped(void *vaddr);
krnlapi void unguard_page(void *vaddr);
krnlapi void clear_dirty(void *vaddr);
krnlapi int mem_access(void *vaddr, int size, pte_t access);
krnlapi int str_access(char *s, pte_t access);
void init_pdir();
int pdir_proc(struct proc_file *pf, void *arg);
int virtmem_proc(struct proc_file *pf, void *arg);
int pdir_stat(void *addr, int len, struct pdirstat *buf);
#endif
#endif