Newer
Older
UbixOS / sys / include / vmm / vmm.h
/*-
 * Copyright (c) 2002-2018 The UbixOS Project.
 * All rights reserved.
 *
 * This was developed by Christopher W. Olsen for the UbixOS Project.
 *
 * 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, the following disclaimer and the list of authors.
 * 2) 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.
 * 3) 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 AUTHOR 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_VMM_H
#define _VMM_VMM_H

#include <sys/types.h>
#include <vmm/paging.h>
#include <vmm/mmap.h>

#ifdef __cplusplus
extern "C" {
#endif

#define STACK_ADDR 0xBFFFFFFF//0xC800000 // Default App Stack Address

#define memAvail     1
#define memNotavail  2
#define vmmID       -3

    /*
     #define vmmMemoryMapAddr 0xE6667000
     #define VMM_MMAP_ADDR_PMODE2 0xE6667000
     */

#define VMM_MMAP_ADDR_PMODE  VMM_KERN_START /* (PD_BASE_ADDR + PAGE_SIZE) */
#define VMM_MMAP_ADDR_RMODE  0x101000

#define VMM_KERN_CODE_START 0x00000000
#define VMM_KERN_CODE_END   0x007FEFFF

#define VMM_USER_LDT   0x007FF000

#define VMM_USER_START 0x00800000
#define VMM_USER_END   0xBFFFFFFF

#define VMM_PAGE_DIRS  0xC0000000
#define VMM_PAGE_DIR   0xC0400000

#define VMM_KERN_START 0xC0800000 //TMP ADDED 1000
#define VMM_KERN_END   0xFDFFFFFF

#define VMM_KERN_STACK_START 0xFE000000
#define VMM_KERN_STACK_END   0xFFFFFFFF

    extern struct spinLock pdSpinLock;

    struct freebsd6_mmap_args {
            char addr_l_[PADL_(caddr_t)];
            caddr_t addr;
            char addr_r_[PADR_(caddr_t)];

            char len_l_[PADL_(size_t)];
            size_t len;
            char len_r_[PADR_(size_t)];

            char prot_l_[PADL_(int)];
            int prot;
            char prot_r_[PADR_(int)];
            char flags_l_[PADL_(int)];

            int flags;
            char flags_r_[PADR_(int)];
            char fd_l_[PADL_(int)];
            int fd;
            char fd_r_[PADR_(int)];

            char pad_l_[PADL_(int)];
            int pad;
            char pad_r_[PADR_(int)];

            char pos_l_[PADL_(off_t)];
            off_t pos;
            char pos_r_[PADR_(off_t)];
    };

    typedef struct {
            uint32_t pageAddr;
            u_int16_t status;
            u_int16_t reserved;
            pid_t pid;
            int cowCounter;
    } mMap;

    typedef enum {
        VMM_FREE = 0,
        VMM_KEEP = 1
    } unmapFlags_t;

    extern int numPages;
    extern mMap *vmmMemoryMap;

    int vmm_init();
    int vmm_memMapInit();
    int countMemory();
    uint32_t vmm_findFreePage(pidType pid);
    int freePage(uint32_t pageAddr);
    int adjustCowCounter(uint32_t baseAddr, int adjustment);
    void vmm_freeProcessPages(pidType pid);

    int vmm_allocPageTable(uint32_t, pidType);
    void vmm_unmapPage(uint32_t, unmapFlags_t);
    void vmm_unmapPages(void*, uint32_t, unmapFlags_t);

#ifdef __cplusplus
}
#endif

#endif // _VMM_VMM_H