summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-12 02:49:47 +0200
committerMiguel <m.i@gmx.at>2018-09-12 02:49:47 +0200
commit800b1a878ec34a8ff30ed093e20561182fa6ae36 (patch)
treea28b81c60bb1bc08aa2ab11750ca5d13aed2354a /kernel
parenta3ee159ebfd2d088432e386e8809840784f697e7 (diff)
vmem_add_generic rework delete old shit
Diffstat (limited to 'kernel')
-rw-r--r--kernel/scheduler.c34
-rw-r--r--kernel/syscalls.c55
-rw-r--r--kernel/syscalls.h1
-rw-r--r--kernel/vmem.c478
4 files changed, 96 insertions, 472 deletions
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index d0b4b68..1b2a70a 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -115,7 +115,7 @@ volatile uint32_t scheduler_run(uint32_t oldesp,uint32_t force_pid)
void scheduler_func()
{
- // we need enable here again (since the pushed eflags have it disabled)? TODO: why??
+ // we need enable here again (since the pushed eflags have it disabled)? TODO: why they disabled it!???
x86_sti();
uint32_t cpu=smp_get(SMP_APIC_ID);
@@ -143,33 +143,6 @@ void scheduler_func()
}
}
- //asm("hlt");
- /*
-
- // if we are pid 0, replace ourselves with /bin/init and enter usermode
- if(task_get_current_pid()==0)
- {
- uint32_t alloc;
- uint32_t entry_global=load_elf(BIN_INIT,&alloc);
- task_set_brk(alloc);
- asm_usermode(entry_global);
- }
-
- // kernel worker thread: SLEEPER
- if(task_get_current_pid()==1)
- {
- while(1)
- {
- __asm__("hlt");
- }
- }
-
- // kernel worker thread: SYSCALL CHECKER
- if(task_get_current_pid()==2)
- {
- task_syscall_worker();
- }
- */
volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack)
{
@@ -241,7 +214,8 @@ void task_syscall_worker()
{
if(task_list[cpu][i].wait)
{
- // klog("task %d waiting on syscall %d. processing...",i,task_list[cpu][i].eax);
+ uint32_t syscall=task_list[cpu][i].eax;
+ klog("task %d waiting on syscall %d/%s. processing...",i,syscall,syscall_get_name(syscall));
task_list[cpu][2].vmem=task_list[cpu][i].vmem; // switch syscall worker to pagedir of calling userprog
x86_set_page_directory(task_list[cpu][2].vmem);
@@ -306,7 +280,7 @@ volatile uint32_t task_exit(uint32_t pid)
if(task_list[cpu][parent_pid].wait&&task_list[cpu][parent_pid].eax==SYSCALL_WAIT)
task_list[cpu][parent_pid].wait=false;
klog("[%d] exit", pid);
- vmem_free_dir(task_list[cpu][pid].vmem);
+// vmem_free_dir(task_list[cpu][pid].vmem);
return 1;
}
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 782ae86..48a2604 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -16,6 +16,7 @@
#include "syscalls.h"
#include "scheduler.h"
+
// TODO: use includes!!!
uint64_t timer_get_ms();
@@ -30,6 +31,60 @@ static uint32_t next_fifo=0;
term_out screen;
terminal_tty tty1;
+char* syscall_get_name(uint32_t num)
+{
+ switch(num)
+ {
+ case 60:
+ return "SYSCALL_EXIT";
+ case 66:
+ return "SYSCALL_CLOSE";
+ case 64:
+ return "SYSCALL_EXECVE";
+ case 72:
+ return "SYSCALL_FORK";
+ case 78:
+ return "SYSCALL_GETPID";
+ case 68:
+ return "SYSCALL_ISATTY";
+ case 82:
+ return "SYSCALL_LINK";
+ case 69:
+ return "SYSCALL_LSEEK";
+ case 65:
+ return "SYSCALL_OPEN";
+ case 62:
+ return "SYSCALL_READ";
+ case 70:
+ return "SYSCALL_SBRK";
+ case 74:
+ return "SYSCALL_STAT";
+ case 67:
+ return "SYSCALL_FSTAT";
+ case 79:
+ return "SYSCALL_LSTAT";
+ case 75:
+ return "SYSCALL_TIMES";
+ case 76:
+ return "SYSCALL_UNLINK";
+ case 77:
+ return "SYSCALL_WAIT";
+ case 61:
+ return "SYSCALL_WRITE";
+ case 71:
+ return "SYSCALL_GETTIMEOFDAY";
+ case 63:
+ return "SYSCALL_READDIR";
+ case 73:
+ return "SYSCALL_KILL";
+ case 80:
+ return "SYSCALL_POLL";
+ case 83:
+ return "SYSCALL_CLONE";
+ }
+ return "UNKNOWN SYSCALL NUM";
+}
+
int syscall_unhandled(int nr)
{
char msg[256];
diff --git a/kernel/syscalls.h b/kernel/syscalls.h
index 7335e2c..9018852 100644
--- a/kernel/syscalls.h
+++ b/kernel/syscalls.h
@@ -22,6 +22,7 @@
#define SYSCALL_POLL 80 //shit!?
#define SYSCALL_CLONE 83
+char* syscall_get_name(uint32_t num);
uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid);
int chk_syscall_read(int file, char *buf, int len);
int syscall_open(char *name, int flags, int mode);
diff --git a/kernel/vmem.c b/kernel/vmem.c
index c004f9e..3752725 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -143,17 +143,10 @@ static bool pd_entry_is_present (pd_entry e)
return e&I86_PDE_PRESENT;
}
-/*
-bool pd_entry_is_user (pd_entry e)
-{
- return 1;
-}
-
-bool pd_entry_is_4mb (pd_entry e)
+bool pt_entry_is_user (pt_entry e)
{
- return 1;
+ return e&I86_PTE_USER;
}
-*/
static bool pd_entry_is_writable (pd_entry e)
{
@@ -208,7 +201,7 @@ static pdirectory* vmem_clean_dir()
}
// addresses need to be page aligned. (or will be forced down)
-static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages, bool alloc)
+static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages, bool alloc, bool user)
{
fixme("make sure the pages are marked as used in the physical mem manager, really?");
@@ -232,7 +225,7 @@ static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_
pd_entry_add_attrib (entry, I86_PDE_PRESENT);
pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pd_entry_add_attrib (entry, I86_PDE_USER);
+ if(user)pd_entry_add_attrib (entry, I86_PDE_USER);
pd_entry_set_frame (entry, table);
}
else{
@@ -250,7 +243,7 @@ static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_
pt_entry page=0;
pt_entry_add_attrib (&page, I86_PTE_PRESENT);
pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_add_attrib (&page, I86_PTE_USER);
+ if(user)pt_entry_add_attrib (&page, I86_PTE_USER);
pt_entry_set_frame (&page, phys);
//and add it to the page table
@@ -264,18 +257,18 @@ static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_
pages--;
}
}
-static void vmem_add_alloc(pdirectory* dir,uint32_t addr,uint32_t pages)
+static void vmem_add_alloc(pdirectory* dir,uint32_t addr,uint32_t pages,bool user)
{
- vmem_add_generic(dir,addr,addr,pages, true);
+ vmem_add_generic(dir,addr,addr,pages, true,user);
}
-static void vmem_add_remap(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages)
+static void vmem_add_remap(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages,bool user)
{
- vmem_add_generic(dir,phys,virt,pages, false);
+ vmem_add_generic(dir,phys,virt,pages, false,user);
}
-static void vmem_add_identity(pdirectory* dir,uint32_t addr,uint32_t pages)
+static void vmem_add_identity(pdirectory* dir,uint32_t addr,uint32_t pages, bool user)
{
- vmem_add_generic(dir,addr,addr,pages, false);
+ vmem_add_generic(dir,addr,addr,pages, false,user);
}
pdirectory* vmem_kernel_dir()
@@ -289,18 +282,34 @@ pdirectory* vmem_kernel_dir()
pdirectory* dir = vmem_clean_dir();
- vmem_add_identity(dir,0,1024*8);//identity map first 32 megs...
+ vmem_add_identity(dir,0,1024*8,false);//identity map first 32 megs...
- vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,1024*8);//32megs should be enough for 4k (think about pitch)
- vmem_add_remap(dir,local_apic_addr,VMEM_LAPIC,1); //apic addr should be at pagestart, right? TODO: check.
- vmem_add_remap(dir,io_apic_addr,VMEM_IOAPIC,1);
- vmem_add_remap(dir,mod_start,VMEM_EXT2_RAMIMAGE,1024*8);//32megs for ramimage: TODO: check if enough?
+ vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,1024*8,false);//32megs should be enough for 4k (think about pitch)
+ vmem_add_remap(dir,local_apic_addr,VMEM_LAPIC,1,false); //apic addr should be at pagestart, right? TODO: check.
+ vmem_add_remap(dir,io_apic_addr,VMEM_IOAPIC,1,false);
+ vmem_add_remap(dir,mod_start,VMEM_EXT2_RAMIMAGE,1024*8,false);//32megs for ramimage: TODO: check if enough?
- vmem_add_alloc(dir,VMEM_CPU_PRIVATE,4);
- vmem_add_alloc(dir,VMEM_CPU_STACK_TOP-4096*4,4);
+ vmem_add_alloc(dir,VMEM_CPU_PRIVATE,4,false);
+ vmem_add_alloc(dir,VMEM_CPU_STACK_TOP-4096*4,4,false);
- vmem_add_alloc(dir,VMEM_USER_PROG,1024*2);
- vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*4,4);
+ vmem_add_alloc(dir,VMEM_USER_PROG,1024*2,true);
+ vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*4,4,true);
+
+ return dir;
+}
+
+pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
+{
+ pdirectory* dir = vmem_clean_dir();
+ //copy non-user pages.
+ for(int i=0;i<1024;i++)
+ {
+ uint32_t src_pt=copy_dir->m_entries [i];
+ if(!pt_entry_is_user(src_pt))dir->m_entries [i]=src_pt;
+ }
+
+ vmem_add_alloc(dir,VMEM_USER_PROG,1024*2,true);
+ vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*4,4,true);
return dir;
}
@@ -317,418 +326,3 @@ void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi)
}
-///////////////////////////////////////////////////////////////////////
-
-/// SHIT BELOW THIs LINE
-void vmem_free_dir(pdirectory *dir)
-{
- x86_paging_disable(); //TODO : do not disable this!
-
- uint32_t virt_addr=0;
-
- // first pages are identity mapped (kernel space) just remove links
- for(int j=0;j<3;j++)
- {
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- virt_addr+=1024*4096;
- }
-
- // programm space
- virt_addr=0x8000000;
- for(int j=0;j<2;j++)
- {
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- ptable *table=pd_entry_get_frame(entry);
-
- for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
- {
- pt_entry pte=&table->m_entries [PAGE_TABLE_INDEX (virt) ];
- mem_free_block(pt_entry_get_frame(pte)); // get free space from the memory manager
- }
-
- mem_free_block(pd_entry_get_frame (entry));
- virt_addr+=1024*4096;
-
- }
-
- // stack
- virt_addr=0x8c00000;
- for(int j=0;j<1;j++)
- {
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- ptable *table=pd_entry_get_frame(entry);
-
- for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
- {
- pt_entry pte=&table->m_entries [PAGE_TABLE_INDEX (virt) ];
- mem_free_block(pt_entry_get_frame(pte)); // get free space from the memory manager
- }
-
- mem_free_block(pd_entry_get_frame (entry));
- virt_addr+=1024*4096;
-
- }
- mem_free_block(dir);
-
- x86_paging_enable();
-}
-//
-// vmem init / also copies all the shit over for FORK
-// if copy_dir==NULL creates brandnew dir
-// otherwise copies kernel pages and copies
-// programm pages procreates new programmspace
-//
-// TODO: FIX
-// KERNEL SPACE `kernel_pages` first 8 PAGES = 32megs
-// FRAMEBUFER WE GET ON INIT
-// PROGRAMM SPACE HARDCODED TO 0x8000000+2 pages and 0x8c00000+1 pages
-//
-
-pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
-{
- x86_paging_disable(); //TODO: do not disable
-
- pdirectory* dir = vmem_clean_dir();
-
- // identity mapping for first blocks
- uint32_t phys_addr=0;
- uint32_t virt_addr=0;
- kernel_pages=8; //32megs
-
- // first pages are identity mapped
- for(int j=0;j<kernel_pages;j++)
- {
-
- // this is the table for our page directory. It maps 1024*4096 bytes
- ptable* table;
-
- // create new tables on init
- if(copy_dir==NULL)
- {
- // alloc space for our new table
- table = (ptable*) kballoc(1);
- if (!table)kpanic("unable to alloc table");
-
- //! idenitity mapping
- for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096)
- {
- //! create a new page
- pt_entry page=0;
- pt_entry_add_attrib (&page, I86_PTE_PRESENT);
- pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_add_attrib (&page, I86_PTE_USER);
- pt_entry_set_frame (&page, frame);
-
- //! ...and add it to the page table
- table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
- }
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- *entry=0;
- pd_entry_add_attrib (entry, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pt_entry_add_attrib (entry, I86_PTE_USER);
- pd_entry_set_frame (entry, (physical_addr)table);
-
- }
-
- // otherwise simply take existing stuff from pdir 0
- else
- {
- dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
- copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
-
- }
-
- phys_addr+=1024*4096;
- virt_addr+=1024*4096;
- }
-
- // FRAMEBUFFER IDENTITY MAP (4pages enought? )
- phys_addr=fb_addr;
- virt_addr=fb_addr;
-
- if(fb_addr>0x100000)
- for(int j=0;j<4;j++)
- {
-
- // this is the table for our page directory. It maps 1024*4096 bytes
- ptable* table;
-
- // create new tables on init
- if(copy_dir==NULL)
- {
- // alloc space for our new table
- table = (ptable*) kballoc(1);
- if (!table)kpanic("unable to alloc table");
-
- //! idenitity mapping
- for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096)
- {
- //! create a new page
- pt_entry page=0;
- pt_entry_add_attrib (&page, I86_PTE_PRESENT);
- pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_add_attrib (&page, I86_PTE_USER);
- pt_entry_set_frame (&page, frame);
-
- //! ...and add it to the page table
- table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
- }
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- *entry=0;
- pd_entry_add_attrib (entry, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pt_entry_add_attrib (entry, I86_PTE_USER);
- pd_entry_set_frame (entry, (physical_addr)table);
-
- }
-
- // otherwise simply take existing stuff from pdir 0
- else
- {
- dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
- copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
-
- }
-
- phys_addr+=1024*4096;
- virt_addr+=1024*4096;
- }
-
- // 2 pages for apic ( in case on boundary??)
- phys_addr=local_apic_addr;
- virt_addr=local_apic_addr;
-
- for(int j=0;j<2;j++)
- {
-
- // this is the table for our page directory. It maps 1024*4096 bytes
- ptable* table;
-
- // create new tables on init
- if(copy_dir==NULL)
- {
- // alloc space for our new table
- table = (ptable*) kballoc(1);
- if (!table)kpanic("unable to alloc table");
-
- //! idenitity mapping
- for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096)
- {
- //! create a new page
- pt_entry page=0;
- pt_entry_add_attrib (&page, I86_PTE_PRESENT);
- pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_add_attrib (&page, I86_PTE_USER);
- pt_entry_set_frame (&page, frame);
-
- //! ...and add it to the page table
- table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
- }
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- *entry=0;
- pd_entry_add_attrib (entry, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pt_entry_add_attrib (entry, I86_PTE_USER);
- pd_entry_set_frame (entry, (physical_addr)table);
-
- }
-
- // otherwise simply take existing stuff from pdir 0
- else
- {
- dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
- copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
-
- }
-
- phys_addr+=1024*4096;
- virt_addr+=1024*4096;
- }
- // 2 pages for ioapic ( in case on boundary??)
- phys_addr=io_apic_addr;
- virt_addr=io_apic_addr;
-
- for(int j=0;j<2;j++)
- {
-
- // this is the table for our page directory. It maps 1024*4096 bytes
- ptable* table;
-
- // create new tables on init
- if(copy_dir==NULL)
- {
- // alloc space for our new table
- table = (ptable*) kballoc(1);
- if (!table)kpanic("unable to alloc table");
-
- //! idenitity mapping
- for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096)
- {
- //! create a new page
- pt_entry page=0;
- pt_entry_add_attrib (&page, I86_PTE_PRESENT);
- pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_add_attrib (&page, I86_PTE_USER);
- pt_entry_set_frame (&page, frame);
-
- //! ...and add it to the page table
- table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
- }
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- *entry=0;
- pd_entry_add_attrib (entry, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pt_entry_add_attrib (entry, I86_PTE_USER);
- pd_entry_set_frame (entry, (physical_addr)table);
-
- }
-
- // otherwise simply take existing stuff from pdir 0
- else
- {
- dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
- copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
-
- }
-
- phys_addr+=1024*4096;
- virt_addr+=1024*4096;
- }
- // programm space
- virt_addr=0x8000000;
- for(int j=0;j<2;j++)
- {
- if(stack_only)
- {
- dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
- copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
- virt_addr+=1024*4096;
- continue;
- }
-
- ptable* table = (ptable*) kballoc (1);
- pd_entry *oldentry=NULL;
- ptable* oldtable=NULL;
-
- if(copy_dir!=NULL)
- {
- oldentry=&(copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]);
- oldtable=pd_entry_get_frame(oldentry);
- }
-
- klog("oldtable at: 0x%08X",oldtable);
-
- if (!table)kpanic("unable to alloc table");
- klog("alloc table: %08X",table);
-
- for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
- {
- //klog("i = %d",i);
- phys_addr=mem_alloc_block(); // get free space from the memory manager
- if (!phys_addr)kpanic("unable to alloc spce for frame");
-
- // if this is not init , copy contents from current space!
- if(copy_dir!=NULL)
- {
- uint32_t addr_old=pt_entry_get_frame(&oldtable->m_entries[PAGE_TABLE_INDEX(virt)]);
- //klog("physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old);
- memcpy(phys_addr,addr_old,4096);
-
- }
-
- uint32_t frame=phys_addr;
-
- //! create a new page
- pt_entry page=0;
- pt_entry_add_attrib (&page, I86_PTE_PRESENT);
- pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_add_attrib (&page, I86_PTE_USER);
- pt_entry_set_frame (&page, frame);
-
- //! ...and add it to the page table
- table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
- }
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- *entry=0;
- pd_entry_add_attrib (entry, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pt_entry_add_attrib (entry, I86_PTE_USER);
- pd_entry_set_frame (entry, (physical_addr)table);
-
- virt_addr+=1024*4096;
- }
-
- // programm space : stack?
- virt_addr=0x8c00000;
- for(int j=0;j<1;j++)
- {
-
- ptable* table = (ptable*) kballoc (1);
- pd_entry *oldentry=NULL;
- ptable* oldtable=NULL;
-
- if(copy_dir!=NULL)
- {
- oldentry=&(copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]);
- oldtable=pd_entry_get_frame(oldentry);
- }
- klog("oldtable at: 0x%08X",oldtable);
-
- if (!table)kpanic("unable to alloc table");
- klog("alloc table: %08X",table);
-
- for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
- {
- phys_addr=mem_alloc_block(); // get free space from the memory manager
- if (!phys_addr)kpanic("unable to alloc spce for frame");
-
- // if this is not init , copy contents from current space!
- if(copy_dir!=NULL)
- {
- uint32_t addr_old=pt_entry_get_frame(&oldtable->m_entries[PAGE_TABLE_INDEX(virt)]);
- //klog("physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old);
- memcpy(phys_addr,addr_old,4096);
-
- }
-
- uint32_t frame=phys_addr;
-
- //! create a new page
- pt_entry page=0;
- pt_entry_add_attrib (&page, I86_PTE_PRESENT);
- pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_add_attrib (&page, I86_PTE_USER);
- pt_entry_set_frame (&page, frame);
-
- //! ...and add it to the page table
- table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
- }
-
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- *entry=0;
- pd_entry_add_attrib (entry, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pt_entry_add_attrib (entry, I86_PTE_USER);
- pd_entry_set_frame (entry, (physical_addr)table);
-
- virt_addr+=1024*4096;
-
- }
-
- if(copy_dir==NULL) // this happens only on init
- {
- klog("initializing virtual memory (paging)");
- x86_set_page_directory(dir);
- }
-
- x86_paging_enable();
- return dir;
-}