summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-29 01:51:16 +0200
committerMiguel <m.i@gmx.at>2018-09-29 01:51:16 +0200
commit34c4a90794e78b97e4bd24f09c457d5e171e53f4 (patch)
tree5e6b7c163fc0d95d7b4fcf4e8a26e53ec35d7ab3 /kernel
parentbe3d9f2cf2a8cfe670eac6df255db55ff9205c49 (diff)
first prototype of compositing window manager
Diffstat (limited to 'kernel')
-rw-r--r--kernel/interrupts.c2
-rw-r--r--kernel/kernel.c1
-rw-r--r--kernel/kernel.h3
-rw-r--r--kernel/scheduler.c3
-rw-r--r--kernel/smp.c2
-rw-r--r--kernel/vmem.c17
6 files changed, 20 insertions, 8 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 387b822..e91d3ae 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -12,6 +12,7 @@
#include "smp.h"
#include "apic.h"
#include "ringbuffer.h"
+#include "compositor.h"
/** The size of our interrupts table */
#define INT_MAX 256 // 0-255
@@ -88,6 +89,7 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq)
break;
case INTERRUPT_APIC_TIMER: // frequency is configured in smp.c
+ compositor_swap_buffers();
esp=scheduler_run(esp,-1);
apic_eoi();
break;
diff --git a/kernel/kernel.c b/kernel/kernel.c
index e37f76f..c6618ce 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -136,6 +136,7 @@ void kernel_main(uint32_t eax,uint32_t ebx)
klog("Compositor init ...");
compositor_init(cfg_multiboot->framebuffer_width,cfg_multiboot->framebuffer_height,cfg_multiboot->framebuffer_pitch);
+ compositor_set_background("/home/miguel/bg.ppm");
// -- STD STREAMS -- //
klog("Standard Streams init ...");
diff --git a/kernel/kernel.h b/kernel/kernel.h
index 1dcfb60..8baa57a 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -87,4 +87,7 @@ REFERENCES
#define VMEM_FRAMEBUFFER_PAGES (1024*8)
#define VMEM_EXT2_RAMIMAGE 0xF8000000 // 8192 pages (32megs) / identity mapped
+#define VMEM_USER_FRAMEBUFFER 0xFA000000
+#define VMEM_USER_FRAMEBUFFER_PAGES 300// 4*320*480 bytes per app (one extra?)
+
#endif
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 23ed7b2..e5cdec7 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -2,6 +2,7 @@
#include "kernel.h"
#include "gdt.h"
#include "log.h"
+#include "compositor.h"
#include "smp.h"
#include "mem.h"
@@ -263,6 +264,8 @@ volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread)
uint32_t *stack=task_list[cpu][i].esp;
stack[12]=0x1;
stack[13]=0; // this task returns pid=0 to the caller
+
+ if(!thread)compositor_add_window(vmem);
return task_list[cpu][i].pid;
}
diff --git a/kernel/smp.c b/kernel/smp.c
index f23d15a..cf58b88 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -65,7 +65,7 @@ void run_smp()
apic_enable();
klog("Setup the LAPIC Timer on CPU with lapic_id=0x%x ...",apic_id());
- apic_init_timer(1);// freq x HZ
+ apic_init_timer(5);// freq x HZ
klog("Enable Interrupts on CPU with lapic_id=0x%x ...",apic_id());
asm_smp_unlock();
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 1eaf291..883d56d 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -299,7 +299,7 @@ pdirectory* vmem_kernel_dir()
vmem_add_identity(dir,VMEM_KERNEL,VMEM_KERNEL_PAGES,false);//identity map first 32 megs...
vmem_add_identity(dir,e1000_addr,32,false);//identity map 32 pages for e1000
- vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,true);//32megs should be enough for 4k (think about pitch)
+ vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,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);
@@ -312,6 +312,7 @@ pdirectory* vmem_kernel_dir()
vmem_add_alloc(dir,VMEM_USER_ENV,1,true);
vmem_add_alloc(dir,VMEM_USER_NEWLIB,1,true);
vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*VMEM_USER_STACK_PAGES,VMEM_USER_STACK_PAGES,true);
+ vmem_add_alloc(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,true); /// each new process gets a 640x480x32 area
return dir;
}
@@ -336,7 +337,6 @@ void vmem_free_space_dir(pdirectory *dir,bool stack_only)
for(int j=0;j<1024;j++)
{
- if(virt>=VMEM_FRAMEBUFFER&&virt<VMEM_FRAMEBUFFER+VMEM_FRAMEBUFFER_PAGES*4096)continue; // skip framebuffer pls
uint32_t src_pd=src_table->m_entries[j];
uint32_t src_phys=pd_entry_get_frame(&src_pd);
@@ -367,6 +367,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
if(!stack_only)
{
+ vmem_add_alloc(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,true); /// each new process gets a 640x480x32 area
vmem_add_alloc(dir,VMEM_USER_PROG,VMEM_USER_PROG_PAGES,true);
vmem_add_alloc(dir,VMEM_USER_ENV,1,true);
}
@@ -391,8 +392,6 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
for(int j=0;j<1024;j++)
{
- if(virt>=VMEM_FRAMEBUFFER&&virt<VMEM_FRAMEBUFFER+VMEM_FRAMEBUFFER_PAGES*4096)continue; // skip framebuffer pls
-
uint32_t src_pd=src_table->m_entries[j];
uint32_t dst_pd=dst_table->m_entries[j];
@@ -401,7 +400,13 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
if(src_pd)
{
- if(stack_only&&(virt==VMEM_USER_ENV||(virt>=VMEM_USER_PROG&&virt<VMEM_USER_PROG+VMEM_USER_PROG_PAGES*4096)))
+ if(stack_only&&
+ (
+ virt==VMEM_USER_ENV
+ ||(virt>=VMEM_USER_PROG&&virt<VMEM_USER_PROG+VMEM_USER_PROG_PAGES*4096)
+ ||(virt>=VMEM_USER_FRAMEBUFFER&&virt<VMEM_USER_FRAMEBUFFER+VMEM_USER_FRAMEBUFFER_PAGES*4096)
+ )
+ )
{
// threads share this //
vmem_add_remap(dir,src_phys,virt,1,true);
@@ -429,8 +434,6 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
else virt+=4096*1024;
}
- vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,true);//32megs should be enough for 4k (think about pitch)
-
return dir;
}