Newer
Older
UbixOS / src / sys / include / vmm / paging.h
@Charlie Root Charlie Root on 31 Dec 2017 4 KB Sync
/*-
 * Copyright (c) 2002-2004, 2016, 2017 The UbixOS Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this list of
 * conditions, the following disclaimer and the list of authors.  Redistributions in binary
 * form must reproduce the above copyright notice, this list of conditions, the following
 * disclaimer and the list of authors in the documentation and/or other materials provided
 * with the distribution. Neither the name of the UbixOS 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 _VMM_PAGING_H_
#define _VMM_PAGING_H_

#include <sys/types.h>
#include <sys/sysproto.h>
#include <sys/thread.h>

#define PAGE_SHIFT      12              // Page Shift
#define PAGE_SIZE       0x1000          // Page Size
#define PAGE_MASK       (PAGE_SIZE-1)   // Page Mask

#define PD_INDEX(v_addr)  (v_addr >> 22)                        // Calc Page Directory Index
#define PD_OFFSET(v_addr) (v_addr >> 0xA)                       // Calc Page Directory OFfset
#define PT_INDEX(v_addr)  ((v_addr >> 12) & 0x03FF)             // Calc Page Table Offset
#define PD_BASE_ADDR2     ((PAGE_SIZE << 0xA) + VMM_KERN_START) // Find Out What This Was For

#define PD_BASE_ADDR      0xC0400000 //Page Directory Base Address
#define PT_BASE_ADDR      0xC0000000 // Page Table Base Address

#define PD_ENTRIES        (PAGE_SIZE/4) //Return Page Directory Entries
#define PT_ENTRIES        (PAGE_SIZE/4) //Return Page Table Entries

#define VM_THRD           0 // Thread
#define VM_TASK           1 // Task


// Page Flags
#define PAGE_PRESENT        0x00000001
#define PAGE_WRITE          0x00000002
#define PAGE_USER           0x00000004
#define PAGE_WRITE_THROUGH  0x00000008
#define PAGE_CACHE_DISABLED 0x00000010
#define PAGE_ACCESSED       0x00000020
#define PAGE_DIRTY          0x00000040
#define PAGE_GLOBAL         0x00000080
#define PAGE_               0x00000100
#define PAGE_COW            0x00000200
#define PAGE_STACK          0x00000400
#define PAGE_WIRED          0x00000800

#define PAGE_DEFAULT        (PAGE_PRESENT|PAGE_WRITE|PAGE_USER)
#define KERNEL_PAGE_DEFAULT (PAGE_PRESENT|PAGE_WRITE)

#define trunc_page(x)   ((x) & ~PAGE_MASK)
#define round_page(x)   (((x) + PAGE_MASK) & ~PAGE_MASK)

#define ctob(x)         ((x)<<PAGE_SHIFT)
#define btoc(x)         (((vm_offset_t)(x)+PAGE_MASK)>>PAGE_SHIFT)


int vmmClearVirtualPage(uInt32 pageAddr);

void vmm_unmapPage(uInt32, int);
void vmm_unmapPages(void *, uInt32);
void *vmm_mapFromTask(pidType, void *, uInt32);
void *vmm_copyVirtualSpace(pidType);
void *vmm_getFreePage(pidType);
void *vmmGetFreeKernelPage(pidType pid, uInt16 count);
void *vmm_createVirtualSpace(pidType);
void *vmm_getFreeVirtualPage(pidType, int, int);

uint32_t vmm_getPhysicalAddr(uint32_t);
uint32_t vmm_getRealAddr(uint32_t);
int vmm_setPageAttributes(uInt32, uInt16);
int vmm_remapPage(uInt32, uInt32, uInt16);
int vmm_pagingInit();
void *vmm_getFreeMallocPage(uInt16 count);
//void vmm_pageFault( uInt32, uInt32, uInt32 );
void vmm_pageFault(struct trapframe *, uint32_t);
void _vmm_pageFault();
int mmap(struct thread *, struct sys_mmap_args *);
int obreak(struct thread *, struct obreak_args *);
int munmap(struct thread *, struct munmap_args *);

int vmm_cleanVirtualSpace(uint32_t);

extern uInt32 *kernelPageDirectory;

#endif