#include "zero.h" #include "alloc.h" #include "kernel.h" #include "klibc.h" struct zeroMappedEntry { int refCnt; }; static int zeroOpen(struct uAddrVirtualReg *vreg) { struct zeroMappedEntry *ent = (struct zeroMappedEntry *)vreg->res->customData; ent->refCnt++; return 0; } static int zeroClose(struct uAddrVirtualReg *vreg) { struct zeroMappedEntry *ent = (struct zeroMappedEntry *)vreg->res->customData; ent->refCnt--; if (ent->refCnt == 0) { free(vreg->res->customData); } return 0; } static int zeroNoPage(struct uAddrVirtualReg *vreg, uaddr_t addr, int right) { (void)vreg; int ret = 0; paddr_t ppage = allocPhyPage(1); ret = pageMap(ALIGN_DOWN(addr, PAGE_SIZE), ppage, right | PAGING_MEM_USER) ; unrefPhyPage(ppage); if (ret) { return ret; } memset((void *)ALIGN_DOWN(addr, PAGE_SIZE), 0, PAGE_SIZE); return ret; } static struct mappedRessourceOps zeroOps = { .open = zeroOpen, .close = zeroClose, .unmap = NULL, .nopage = zeroNoPage, }; int zeroOnMapped(struct uAddrVirtualReg *vreg) { (void)vreg; printf("ZERO MAPPED !!\n"); return 0; } int zeroMmap(struct uAddrSpace *as, uaddr_t *uaddr, size_t size, uint32_t rights, uint32_t flags) { int ret = 0; struct mappedRessource *res = (struct mappedRessource *)zalloc(sizeof(struct mappedRessource)); struct zeroMappedEntry *cust = (struct zeroMappedEntry *)zalloc(sizeof(struct zeroMappedEntry)); res->allowedRight = PAGING_MEM_READ | PAGING_MEM_WRITE | PAGING_MEM_EXEC | PAGING_MEM_USER; res->ops = &zeroOps; res->customData = cust; res->onResMapped = zeroOnMapped; ret = uAddrSpaceMmap(as, uaddr, size, rights, flags, res, 0); if (ret) { free(res); free(cust); } return ret; }