Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <types.h>
- #include <kern/errno.h>
- #include <lib.h>
- #include <thread.h>
- #include <curthread.h>
- #include <addrspace.h>
- #include <vm.h>
- #include <machine/spl.h>
- #include <machine/tlb.h>
- #include <vfs.h>
- #include <elf.h>
- /*
- * Note! If OPT_DUMBVM is set, as is the case until you start the VM
- * assignment, this file is not compiled or linked or in any way
- * used. The cheesy hack versions in dumbvm.c are used instead.
- */
- /*
- * alloc_kpages() and free_kpages() are called by kmalloc() and thus the whole
- * kernel will not boot if these 2 functions are not completed.
- */
- struct Coremap_struct *Coremap;
- size_t numofpgs;
- size_t staticpgs;
- int init_vm = 0;
- extern struct thread *curthr;
- int check = 0;
- struct semaphore* coremap_access; // used for every coremap access
- u_int32_t firstpage_addspace;
- u_int32_t lastpage_addspace;
- u_int32_t new_page;
- u_int32_t coremap_size;
- void
- vm_bootstrap(void)
- {
- // I made these global
- // u_int32_t firstpage_addspace;
- // u_int32_t lastpage_addspace;
- // u_int32_t new_page;
- // u_int32_t coremap_size;
- coremap_access = sem_create("coremap_sem", 1); //FIXME: not sure where I should destroy this
- ram_getsize(&firstpage_addspace, &lastpage_addspace);
- numOfpgs = (lastpage_addspace - firstpage_addspace)/ PAGE_SIZE;
- Coremap = (struct Coremap_struct*)PADDR_TO_KVADDR(firstpage_addspace);
- coremap_size = numOfpgs * sizeof(struct Coremap_struct);
- new_page = firstpage_addspace + coremap_size;
- int staticpgs = (new_page - firstpage_addspace) / PAGE_SIZE + 1;
- int i;
- for (i = 0; i < numofpgs; i++) {
- Coremap[i].addspace = NULL;
- Coremap[i].id = i;
- Coremap[i].phy_addspace = firstpage_addspace + PAGE_SIZE * i;
- if(i > staticPages) {
- Coremap[i].vir_addspace = 0xDEADBEEF;
- Coremap[i].state = 0;
- Coremap[i].length = 0;
- }
- else {
- Coremap[i].vir_addspace = PADDR_TO_KVADDR(Coremap[i].phy_addspace);
- Coremap[i].state = 1;
- Coremap[i].length = 1;
- }
- }
- init_vm = 1;
- }
- static
- paddr_t
- getppages(unsigned long npages)
- {
- int spl;
- paddr_t addr;
- spl = splhigh();
- addr = ram_stealmem(npages);
- splx(spl);
- return addr;
- }
- int free_id(){
- int id = -50;
- int i;
- for(i = 0; i < numofpgs; i++){
- if(Coremap[i].state == 0){
- id = i;
- break;
- }
- }
- return id;
- }
- vaddr_t alloc_oneormorepgs(int npgs){
- if(numofpgs == 1){
- int free_id = free_id();
- Coremap[free_id].length = 1;
- Coremap[free_id].addspace = curthr->t_vmspace;
- Coremap[free_id].state = 1;
- Coremap[free_id].vir_addspace = PADDR_TO_KVADDR(Coremap[free_id].phy_addspace);
- return (Coremap[free_id].vir_addspace);
- }
- else{
- int cont = 1;
- int i;
- for(i = 0; i < numofpgs - 1; i++){
- if(cont >= npgs)
- break;
- if((Coremap[i].state == 0) && (Coremap[i + 1].state == 0))
- cont++;
- else
- {
- cont = 1;// not sure if i can replace with continue; ?
- }
- }
- int j = i - npgs +1;
- if (cont >= npgs){
- int k;
- for(k = j; k < numofpgs + j; k++){
- Coremap[k].length = 1;
- Coremap[k].addspace = curthr->t_vmspace;
- Coremap[k].state = 1;
- Coremap[k].vir_addspace = PADDR_TO_KVADDR(Coremap[k].phy_addspace);
- }
- return PADDR_TO_KVADDR(Coremap[j].phy_addspace);
- }
- else{
- int flag = 0;
- for(i = 0; i < numofpgs; i++){
- if(flag >= numofpgs){
- check = 1;
- break;
- }
- if(Coremap[i].state == 1){
- flag = 0;
- continue;
- }
- else
- flag++;
- }
- if(!check)
- return NULL;
- }
- int beg = i - numofpgs + 1;
- for(i = beg; i < numofpgs + beg; i++){
- Coremap[k].length = 1;
- Coremap[k].addspace = curthr->t_vmspace;
- Coremap[k].state = 1;
- Coremap[k].vir_addspace = PADDR_TO_KVADDR(Coremap[k].phy_addspace);
- }
- return PADDR_TO_KVADDR(Coremap[beg].phy_addspace);
- }
- }
- vaddr_t
- alloc_kpages(int npages)
- {
- int spl;
- spl = splhigh();
- if (init_vm == 1){
- vaddr_t retval;
- retval = alloc_oneormorepgs(npages);
- splx(spl);
- return retval;
- }
- else{
- // copied form dumb vm not sure if this is the default condition
- vaddr_t vaddr = getppages(npages);
- splx(spl);
- return PADDR_TO_KVADDR(vaddr);
- }
- // (void)npages;
- // return 0;
- }
- void
- free_kpages(vaddr_t addr)
- {
- /*
- * Write this.
- */
- u_int32_t phys_addr = KVADDR_TO_PADDR(addr);
- u_int32_t core_index = (phys_addr - firstpage_addspace)/PAGE_SIZE;
- P(coremap_access);
- // Free everything (unless it's a kernel/fixed page)
- // free the entire size of whatever process (can be x number of blocks)
- for ( ; Coremap[core_index].last != 1; core_index++){
- // Coremap[core_index].id = ?
- Coremap[core_index].addspace = NULL;
- Coremap[core_index].free = 1;
- Coremap[core_index].phy_addspace = NULL;
- Coremap[core_index].vir_addspace = NULL;
- Coremap[core_index].fixed = 0;
- Coremap[core_index].dirty = 0;
- Coremap[core_index].last = 0;
- Coremap[core_index].length = 0;
- }
- V(coremap_access);
- (void)addr;
- }
- int
- vm_fault(int faulttype, vaddr_t faultaddress)
- {
- /*
- * Definitely write this.
- */
- (void)faulttype;
- (void)faultaddress;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement