summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-12 15:23:38 +0200
committerMiguel <m.i@gmx.at>2018-09-12 15:23:38 +0200
commitc72944b5646863ffaaaff94dc03b939a08566203 (patch)
tree3ce3d74fc27b297cd6958d0d8ba588ccbbe16bfb
parent800b1a878ec34a8ff30ed093e20561182fa6ae36 (diff)
struggling with vmem
-rw-r--r--asm/asm_usermode.S (renamed from asm/asm_usermode.s)2
-rw-r--r--driver/mouse.c1
-rw-r--r--driver/pci.c1
-rw-r--r--driver/timer.c1
-rw-r--r--driver/vesa.c1
-rw-r--r--fs/elf.c1
-rw-r--r--fs/ext2.c1
-rw-r--r--kernel/acpi.c1
-rw-r--r--kernel/acpi.h1
-rw-r--r--kernel/apic.c1
-rw-r--r--kernel/exceptions.c1
-rw-r--r--kernel/fifo.c4
-rw-r--r--kernel/gdt.c1
-rw-r--r--kernel/interrupts.c3
-rw-r--r--kernel/kernel.c1
-rw-r--r--kernel/kernel.h46
-rw-r--r--kernel/kmalloc.c3
-rw-r--r--kernel/log.h15
-rw-r--r--kernel/mem.c1
-rw-r--r--kernel/multiboot.c1
-rw-r--r--kernel/scheduler.c5
-rw-r--r--kernel/smashing.c1
-rw-r--r--kernel/smp.c1
-rw-r--r--kernel/syscalls.c1
-rw-r--r--kernel/vmem.c56
-rw-r--r--test/selftest.c1
26 files changed, 116 insertions, 36 deletions
diff --git a/asm/asm_usermode.s b/asm/asm_usermode.S
index 147dfe5..a07f480 100644
--- a/asm/asm_usermode.s
+++ b/asm/asm_usermode.S
@@ -21,7 +21,7 @@ asm_usermode:
pushl $0x23 // user data segment
//pushl $0x8fff000-3*32 //%eax // current stack
- pushl $0xe0000000-3*32 //%eax // current stack (3 values will be poped)
+ pushl $0xe0000000-3*32 //%eax // current stack (3 values will be poped) we subst 4 to align
pushf //
// http://x86.renejeschke.de/html/file_module_x86_id_145.html
diff --git a/driver/mouse.c b/driver/mouse.c
index b9e0079..2b767b7 100644
--- a/driver/mouse.c
+++ b/driver/mouse.c
@@ -1,4 +1,5 @@
#include "kernel/kernel.h"
+#include "log.h"
#include "mouse.h"
#include "driver/vesa.h"
diff --git a/driver/pci.c b/driver/pci.c
index e8d8b23..1e2f660 100644
--- a/driver/pci.c
+++ b/driver/pci.c
@@ -1,6 +1,7 @@
#include "kernel/kernel.h"
+#include "log.h"
#include "asm_x86.h"
#include "e1000.h"
diff --git a/driver/timer.c b/driver/timer.c
index 7f9859c..30a30c6 100644
--- a/driver/timer.c
+++ b/driver/timer.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
#include "timer.h"
#include "asm_x86.h"
diff --git a/driver/vesa.c b/driver/vesa.c
index 1bd4b7a..c882595 100644
--- a/driver/vesa.c
+++ b/driver/vesa.c
@@ -1,4 +1,5 @@
#include "kernel/kernel.h"
+#include "log.h"
//http://wiki.osdev.org/GUI
#include <stdarg.h>
diff --git a/fs/elf.c b/fs/elf.c
index 2603e2f..851c7e8 100644
--- a/fs/elf.c
+++ b/fs/elf.c
@@ -1,4 +1,5 @@
#include "kernel/kernel.h"
+#include "log.h"
#include <stdint.h>
#include "ext2.h"
#include "lib/string/string.h"
diff --git a/fs/ext2.c b/fs/ext2.c
index 7562cf0..b062973 100644
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -1,4 +1,5 @@
#include "kernel/kernel.h"
+#include "log.h"
// ext2 minidriver
// based on osdev wiki article: http://wiki.osdev.org/Ext2
//
diff --git a/kernel/acpi.c b/kernel/acpi.c
index 67f31fb..b6370c3 100644
--- a/kernel/acpi.c
+++ b/kernel/acpi.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
#include "acpi.h"
#include <stdint.h>
diff --git a/kernel/acpi.h b/kernel/acpi.h
index e94766c..204007c 100644
--- a/kernel/acpi.h
+++ b/kernel/acpi.h
@@ -14,6 +14,7 @@
*/
#include <stdint.h>
+#include <stdbool.h>
typedef struct
{
diff --git a/kernel/apic.c b/kernel/apic.c
index 7899c82..3ec10b9 100644
--- a/kernel/apic.c
+++ b/kernel/apic.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
#include "apic.h"
#include "interrupts.h"
#include "asm_pit.h"
diff --git a/kernel/exceptions.c b/kernel/exceptions.c
index 0c8f6af..f56536b 100644
--- a/kernel/exceptions.c
+++ b/kernel/exceptions.c
@@ -1,5 +1,6 @@
#include "kernel.h"
#include "exceptions.h"
+#include "log.h"
#include "asm_x86.h"
#include "smp.h"
diff --git a/kernel/fifo.c b/kernel/fifo.c
index 73df8b1..fadd248 100644
--- a/kernel/fifo.c
+++ b/kernel/fifo.c
@@ -1,8 +1,8 @@
-
+#include "kernel.h"
+#include "log.h"
#include "fifo.h"
#include "ringbuffer.h"
-#include "kernel.h"
#include <stddef.h>
diff --git a/kernel/gdt.c b/kernel/gdt.c
index 24b52f7..447db20 100644
--- a/kernel/gdt.c
+++ b/kernel/gdt.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
#include "gdt.h"
#include "asm_gdt.h"
#include "kmalloc.h"
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 59d20c1..5e67105 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -1,4 +1,5 @@
-#include "kernel/kernel.h"
+#include "kernel.h"
+#include "log.h"
#include "asm_int.h"
#include "asm_pit.h"
#include "driver/mouse.h"
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 8680e7d..ef9a08d 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
#include "serial.h"
#include "asm_pic.h"
diff --git a/kernel/kernel.h b/kernel/kernel.h
index 0010692..1da1209 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -18,7 +18,6 @@ REFERENCES
https://sourceware.org/newlib/
and many many more...
*/
-#include "log.h"
#ifndef FOOLOS_CONFIG_H
#define FOOLOS_CONFIG_H
@@ -44,31 +43,32 @@ REFERENCES
#define SMP_MAX_PROC 16 // 16 (together with bsp) We can currently only address a maximum of 16 cpus via ipis!
// Virtual Memory Locations //
-// NOTE THAT THE STACKS GROWN DOWNWARDS //
+// REMEMBER THAT THE STACKS GROW DOWNWARDS //
+// We leave some space around them
+// 1 page 0x1000 bytes
+// 8192 pages = 0x2000000 bytes
+
#define VMEM_KERNEL 0x00000000 // 8192 pages (32megs) / identity mapped
+#define VMEM_KERNEL_END 0x02000000
-#define VMEM_USER_ENV 0x07000000 // 4 pages / per user process
+#define VMEM_USER_ENV 0x07000000 // ? pages / per user process
#define VMEM_USER_PROG 0x08048000 // ? pages / per user process (usual entry: 0x8048080)
-#define VMEM_USER_STACK_TOP 0xE0000000 // ? pages / per thread
-
-#define VMEM_LAPIC 0xE0000000 // 1 pages / identity mapped
-#define VMEM_IOAPIC 0xE0001000 // 1 pages / identity mapped
-#define VMEM_CPU_PRIVATE 0xE0002000 // 4 pages / per cpu
-#define VMEM_CPU_STACK_TOP 0xE000A000 // 4 pages / per cpu
-#define VMEM_FRAMEBUFFER 0xF0000000 // 8192 pages (32megs) / identity mapped
-#define VMEM_EXT2_RAMIMAGE 0xF2000000 // 8192 pages (32megs) / identity mapped
-
-// __FUNCTION__ ?
-#ifndef FOOLOS_LOG_OFF
-#define kpanic(...) {log(FOOLOS_LOG_COLOR,__FILE__,0," \033[41;37m [KERNEL PANIC] \033[37;40m " __VA_ARGS__ ); while(1);}
-#define klog(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__), 10, __VA_ARGS__)
-#define fixme(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__) "[FIXME/TODO]:" , 10, __VA_ARGS__)
-#endif
-#ifdef FOOLOS_LOG_OFF
-#define kpanic(...) {while(1);}
-#define klog(...) {}
-#define fixme(...) {}
-#endif
+#define VMEM_USER_STACK_PAGES 0xF0000000 // 4 pages / per thread
+#define VMEM_USER_STACK_BOT 0xEFFFC000 // 4 pages / per thread
+#define VMEM_USER_STACK_TOP 0xF0000000 // 4 pages / per thread
+
+#define VMEM_LAPIC 0xF0005000 // 1 pages / identity mapped
+#define VMEM_IOAPIC 0xF0006000 // 1 pages / identity mapped
+#define VMEM_CPU_PRIVATE 0xF000A000 // 4 pages / per cpu
+
+#define VMEM_CPU_STACK_PAGES 0xF0000000 // 4 pages / per thread
+#define VMEM_CPU_STACK_BOT 0xF0050000 // 4 pages / per cpu
+#define VMEM_CPU_STACK_TOP 0xF0054000 // 4 pages / per cpu
+
+#define VMEM_COPY_PAGE 0xF5000000 // 1 page / temporery map-in tables for copying
+
+#define VMEM_FRAMEBUFFER 0xF6000000 // 8192 pages (32megs) / identity mapped
+#define VMEM_EXT2_RAMIMAGE 0xF8000000 // 8192 pages (32megs) / identity mapped
#endif
diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c
index 239a50b..f4242cc 100644
--- a/kernel/kmalloc.c
+++ b/kernel/kmalloc.c
@@ -1,6 +1,7 @@
+#include "kernel.h"
#include "kmalloc.h"
+#include "log.h"
-#include "kernel.h"
#include "spinlock.h"
static uint8_t data[KMALLOC_MEM_SIZE]; // bytes
diff --git a/kernel/log.h b/kernel/log.h
index 62fe6ef..e46a7b2 100644
--- a/kernel/log.h
+++ b/kernel/log.h
@@ -1,6 +1,8 @@
#ifndef FOOLOS_LOG_H
#define FOOLOS_LOG_H
+#include "kernel.h"
+
#include <stdbool.h>
#define FOOLOS_LOG_ERROR 5
@@ -11,4 +13,17 @@
void log(bool color,char *module_name, int prio, char *format_string, ...);
+// __FUNCTION__ ?
+#ifndef FOOLOS_LOG_OFF
+#define kpanic(...) {log(FOOLOS_LOG_COLOR,__FILE__,0," \033[41;37m [KERNEL PANIC] \033[37;40m " __VA_ARGS__ ); while(1);}
+#define klog(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__), 10, __VA_ARGS__)
+#define fixme(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__) "[FIXME/TODO]:" , 10, __VA_ARGS__)
+#endif
+
+#ifdef FOOLOS_LOG_OFF
+#define kpanic(...) {while(1);}
+#define klog(...) {}
+#define fixme(...) {}
+#endif
+
#endif
diff --git a/kernel/mem.c b/kernel/mem.c
index 098515b..a77dfa4 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -1,3 +1,4 @@
+#include "log.h"
#include "kernel.h"
#include "mem.h"
#include <stdint.h>
diff --git a/kernel/multiboot.c b/kernel/multiboot.c
index 7f45093..ce97c0a 100644
--- a/kernel/multiboot.c
+++ b/kernel/multiboot.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
#include "multiboot.h"
multiboot_information* multiboot_read(uint32_t eax, uint32_t ebx, bool silent)
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 1b2a70a..11b6db4 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -1,6 +1,7 @@
#include "scheduler.h"
#include "kernel.h"
#include "gdt.h"
+#include "log.h"
#include "smp.h"
#include "mem.h"
@@ -161,14 +162,10 @@ volatile int add_task(uint32_t parent,uint32_t vmem)
if(task_list[cpu][i].active!=true)
{
task_list[cpu][i].parent=parent;
-
- // TODO: do this without paging please!
task_list[cpu][i].vmem=vmem;
task_list[cpu][i].esp = kballoc(4)+2*4096; // center
- // TODO: use own page here and copy it instead of this!
task_list[cpu][i].esp0 = kballoc(4)+4*4096;
-
task_list[cpu][i].wait=false;
task_list[cpu][i].brk=task_list[cpu][current_task[cpu]].brk;
diff --git a/kernel/smashing.c b/kernel/smashing.c
index e62e317..d4365b9 100644
--- a/kernel/smashing.c
+++ b/kernel/smashing.c
@@ -1,4 +1,5 @@
#include "kernel/kernel.h"
+#include "log.h"
#include <stdint.h>
// CODE FOR Stack Smashing Protector.
diff --git a/kernel/smp.c b/kernel/smp.c
index 52dd41a..cd9f5ad 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
#include "smp.h"
#include <stdint.h>
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 48a2604..71feeb7 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -15,6 +15,7 @@
#include <stddef.h>
#include "syscalls.h"
#include "scheduler.h"
+#include "log.h"
// TODO: use includes!!!
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 3752725..10c2401 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -1,6 +1,7 @@
#include <stdlib.h>
#include "kernel.h"
+#include "log.h"
#include "vmem.h"
#include "asm_x86.h"
@@ -200,10 +201,20 @@ static pdirectory* vmem_clean_dir()
return dir;
}
+static void vmem_clear_one(pdirectory* dir,uint32_t virt)
+{
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt) ];
+ ptable* table;
+ if(*entry!=0){
+ table= pd_entry_get_frame (entry);
+ table->m_entries [PAGE_TABLE_INDEX (virt) ] = 0;
+ }
+}
+
// 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, bool user)
{
- fixme("make sure the pages are marked as used in the physical mem manager, really?");
+ //fixme("make sure the pages are marked as used in the physical mem manager, really?");
//force align
phys/=4096;
@@ -257,6 +268,7 @@ 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,bool user)
{
vmem_add_generic(dir,addr,addr,pages, true,user);
@@ -266,6 +278,7 @@ static void vmem_add_remap(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t
{
vmem_add_generic(dir,phys,virt,pages, false,user);
}
+
static void vmem_add_identity(pdirectory* dir,uint32_t addr,uint32_t pages, bool user)
{
vmem_add_generic(dir,addr,addr,pages, false,user);
@@ -290,10 +303,10 @@ pdirectory* vmem_kernel_dir()
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,false);
- vmem_add_alloc(dir,VMEM_CPU_STACK_TOP-4096*4,4,false);
+ vmem_add_alloc(dir,VMEM_CPU_STACK_BOT,4,false);
vmem_add_alloc(dir,VMEM_USER_PROG,1024*2,true);
- vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*4,4,true);
+ vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*10,10,true);
return dir;
}
@@ -301,7 +314,7 @@ pdirectory* vmem_kernel_dir()
pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
{
pdirectory* dir = vmem_clean_dir();
- //copy non-user pages.
+ //link non-user pages.
for(int i=0;i<1024;i++)
{
uint32_t src_pt=copy_dir->m_entries [i];
@@ -311,6 +324,41 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
vmem_add_alloc(dir,VMEM_USER_PROG,1024*2,true);
vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*4,4,true);
+ x86_cli(); // plese dear timer, do not schedule us away
+ pdirectory* orig=x86_get_page_directory();
+ x86_set_page_directory(dir);
+
+ //copy user pages.
+ //TODO: stack only!
+ uint32_t virt=0;
+ for(int i=0;i<1024;i++)
+ {
+ uint32_t src_pt=copy_dir->m_entries [i];
+ if(pt_entry_is_user(src_pt))
+ {
+ ptable *table=pt_entry_get_frame(&src_pt);
+ for(int j=0;j<1024;j++)
+ {
+ uint32_t src_pd=table->m_entries[j];
+ uint32_t phys=pd_entry_get_frame(&src_pd);
+ if(src_pd)
+ {
+ // klog("copy %x to %x",phys,virt);
+ vmem_clear_one(dir,VMEM_COPY_PAGE);
+ vmem_add_remap(dir,phys,VMEM_COPY_PAGE,1,false);
+ x86_invlpg(VMEM_COPY_PAGE); // refresh TLB
+ memcpy(virt,VMEM_COPY_PAGE,4096);
+ }
+ virt+=4096;
+
+ }
+
+ }
+ else virt+=4096*1024;
+ }
+ x86_set_page_directory(orig);
+ x86_sti();
+
return dir;
}
diff --git a/test/selftest.c b/test/selftest.c
index e95b320..ef0b80a 100644
--- a/test/selftest.c
+++ b/test/selftest.c
@@ -1,4 +1,5 @@
#include "kernel.h"
+#include "log.h"
void selftest_stack_overflow()
{