mmap #8
@ -3,11 +3,17 @@
|
|||||||
#include "stddef.h"
|
#include "stddef.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
/** Arbitrary size allocator **/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize malloc system
|
* Initialize malloc system
|
||||||
*/
|
*/
|
||||||
int allocSetup(size_t sizeOfArea, vaddr_t *areaAddr, vaddr_t *descAddr, vaddr_t *entryAddr);
|
int allocSetup(size_t sizeOfArea, vaddr_t *areaAddr, vaddr_t *descAddr, vaddr_t *entryAddr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add Slice for some simple/commun size
|
||||||
|
*/
|
||||||
|
|
||||||
int allocPopulate();
|
int allocPopulate();
|
||||||
/*
|
/*
|
||||||
* Allow malloc to allocate elements of this precise size.
|
* Allow malloc to allocate elements of this precise size.
|
||||||
|
@ -7,6 +7,14 @@
|
|||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "stdarg.h"
|
#include "stdarg.h"
|
||||||
|
|
||||||
|
struct memArea {
|
||||||
|
vaddr_t startAddr;
|
||||||
|
uint nbPages;
|
||||||
|
|
||||||
|
struct memArea *next;
|
||||||
|
struct memArea *prev;
|
||||||
|
};
|
||||||
|
|
||||||
static struct memArea *freeArea;
|
static struct memArea *freeArea;
|
||||||
static struct memArea *usedArea;
|
static struct memArea *usedArea;
|
||||||
|
|
||||||
|
@ -9,19 +9,29 @@
|
|||||||
#define AREA_PHY_MAP (1<<0)
|
#define AREA_PHY_MAP (1<<0)
|
||||||
#define AREA_MEM_TOP PAGING_MIRROR_VADDR
|
#define AREA_MEM_TOP PAGING_MIRROR_VADDR
|
||||||
|
|
||||||
struct memArea {
|
/**
|
||||||
vaddr_t startAddr;
|
* Initialize the Area subsystem
|
||||||
uint nbPages;
|
**/
|
||||||
|
|
||||||
struct memArea *next;
|
|
||||||
struct memArea *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
void areaInit(vaddr_t firstMemUsed, vaddr_t lastUsed, vaddr_t stack_bottom, vaddr_t stack_top);
|
void areaInit(vaddr_t firstMemUsed, vaddr_t lastUsed, vaddr_t stack_bottom, vaddr_t stack_top);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request a virtual memory area of @param nbPages
|
||||||
|
**/
|
||||||
vaddr_t areaAlloc(unsigned int nbPages, uint32_t flags);
|
vaddr_t areaAlloc(unsigned int nbPages, uint32_t flags);
|
||||||
// Remove an area from the free ones but do not add it into used ones.
|
|
||||||
// This area should be latter added woth areaAdd.
|
/**
|
||||||
// Used by malloc to avoid recursivity issue
|
* Free a vietual area
|
||||||
vaddr_t areaBook(unsigned int nbPages, uint32_t flags);
|
**/
|
||||||
int areaFree(vaddr_t addr);
|
int areaFree(vaddr_t addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an area from the "free" ones but do not add it into used ones.
|
||||||
|
* This area should be latter added with areaAdd.
|
||||||
|
* Used by malloc to avoid recursivity issue
|
||||||
|
**/
|
||||||
|
vaddr_t areaBook(unsigned int nbPages, uint32_t flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a virtual region to be managed by the subsytem
|
||||||
|
*/
|
||||||
int areaAdd(vaddr_t begin, vaddr_t end, int isFree);
|
int areaAdd(vaddr_t begin, vaddr_t end, int isFree);
|
||||||
|
26
core/mem.h
26
core/mem.h
@ -2,7 +2,8 @@
|
|||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
/** Physical Page related function
|
/**
|
||||||
|
* Physical Page management
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PAGE_SHIFT 12U
|
#define PAGE_SHIFT 12U
|
||||||
@ -20,10 +21,33 @@ struct phyMemDesc {
|
|||||||
struct phyMemDesc *next, *prev;
|
struct phyMemDesc *next, *prev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initi Physical Page management subsystem
|
||||||
|
**/
|
||||||
int memSetup(paddr_t upperMem, paddr_t * firstUsed, paddr_t *lastUsed);
|
int memSetup(paddr_t upperMem, paddr_t * firstUsed, paddr_t *lastUsed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a physical region to be managed by the physica page subsystem
|
||||||
|
**/
|
||||||
int memAddBank(paddr_t bottomMem, paddr_t topMem, int isFree);
|
int memAddBank(paddr_t bottomMem, paddr_t topMem, int isFree);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request @params nbPage free physical pages
|
||||||
|
**/
|
||||||
paddr_t allocPhyPage(uint nbPage);
|
paddr_t allocPhyPage(uint nbPage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrement the nb of user of a given physical page
|
||||||
|
**/
|
||||||
int unrefPhyPage(paddr_t addr);
|
int unrefPhyPage(paddr_t addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment the nb of user of a given physical page
|
||||||
|
**/
|
||||||
int refPhyPage(paddr_t addr);
|
int refPhyPage(paddr_t addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of physical allocated pages
|
||||||
|
**/
|
||||||
unsigned long getNbAllocatedPage(void);
|
unsigned long getNbAllocatedPage(void);
|
||||||
void memGetStat(uint *free, uint *used);
|
void memGetStat(uint *free, uint *used);
|
||||||
|
@ -128,7 +128,9 @@ int uAddrSpaceCheckNAlloc(struct uAddrSpace *as, vaddr_t addr)
|
|||||||
struct uAddrVirtualReg *newReg;
|
struct uAddrVirtualReg *newReg;
|
||||||
int right = PAGING_MEM_USER | PAGING_MEM_WRITE | PAGING_MEM_READ;
|
int right = PAGING_MEM_USER | PAGING_MEM_WRITE | PAGING_MEM_READ;
|
||||||
|
|
||||||
pr_devel("Checking 0x%lx inside 0x%lx and 0x%lx\n", addr, as->heapStart, as->heapStart +as->heapSize);
|
pr_devel("Checking 0x%lx inside 0x%lx and 0x%lx\n", addr, as->heapStart,
|
||||||
|
as->heapStart + as->heapSize);
|
||||||
|
|
||||||
if (addr < as->heapStart || addr >= as->heapStart + as->heapSize) {
|
if (addr < as->heapStart || addr >= as->heapStart + as->heapSize) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user