summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-10-19 02:41:53 +0200
committerMiguel <m.i@gmx.at>2018-10-19 02:41:53 +0200
commit45ce8728224caa44d31dca3117992b193fa3cd98 (patch)
tree8d37cfe273e9feeb8376b6205abe29c995e40ac2 /kernel
parent9bfd9fb6a7c568b56a5ef525a2b76351780bae66 (diff)
window manager continued
Diffstat (limited to 'kernel')
-rw-r--r--kernel/interrupts.c2
-rw-r--r--kernel/kernel.c5
-rw-r--r--kernel/scheduler.c13
-rw-r--r--kernel/scheduler.h1
-rw-r--r--kernel/smp.c1
-rw-r--r--kernel/syscalls.c39
6 files changed, 29 insertions, 32 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 702112c..9ff9cd3 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -111,7 +111,7 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq)
if(cpu==0) // thi
{
// limit compositor to APIC_TIMER freq.(60hz?)
- if(irq==INTERRUPT_APIC_TIMER)compositor_wake2();
+ if(irq==INTERRUPT_APIC_TIMER)compositor_wake();
}
esp=scheduler_run(esp,-1); // just schedule to next task
diff --git a/kernel/kernel.c b/kernel/kernel.c
index a630f94..a259446 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -38,7 +38,6 @@
#include "fs/elf.h"
#include "kmalloc.h"
-#include "driver/vesa.h"
#include "asm_pit.h"
/** F00L 0S Entry point (called directly from asm/multiboot.asm)
@@ -147,8 +146,8 @@ void kernel_main(uint32_t eax,uint32_t ebx)
// -- COMPOSITOR (TODO: text-mode fallback) -- //
klog("Compositor init ...");
compositor_init(cfg_multiboot->framebuffer_width,cfg_multiboot->framebuffer_height,
- cfg_multiboot->framebuffer_bpp,cfg_multiboot->framebuffer_pitch);
- compositor_set_background("/home/miguel/icons.ppm");
+ cfg_multiboot->framebuffer_bpp,cfg_multiboot->framebuffer_pitch,
+ VMEM_FRAMEBUFFER);
// -- KB DRIVER -- //
klog("Keyboard init ...");
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 9fe4f74..e5c279b 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -319,7 +319,7 @@ void task_syscall_worker()
{
keyboard_worker();
mouse_worker();
- compositor_swap_buffers();
+ compositor_paint();
}
__asm__("int $0x81"); // we are ready! force reschedule
@@ -498,6 +498,7 @@ volatile uint32_t task_get_parent(uint32_t pid)
return task_list[cpu][idx].parent;
}
+/*
volatile int task_add_win(uint32_t pid,ringbuffer *r)
{
uint32_t cpu=smp_get(SMP_APIC_ID);
@@ -506,9 +507,10 @@ volatile int task_add_win(uint32_t pid,ringbuffer *r)
struct pdirectory *vmem=x86_get_page_directory();//task_list[cpu][idx].vmem;
vmem_add_framebuffer(vmem);
klog("add win to compositor");
- compositor_add_window(vmem,pid,r);
+ compositor_create_window(pid,0,0,640,400,0);
return 0;
}
+*/
int task_set_esp(uint32_t pid, uint32_t esp)
{
@@ -566,7 +568,12 @@ void task_exit(uint32_t pid)
task_list[cpu][i].active=false;
}
- compositor_del_window(task_list[cpu][idx].vmem);
vmem_free_space_dir(task_list[cpu][idx].vmem,task_list[cpu][idx].thread);
}
+uint32_t scheduler_get_vmem(uint32_t pid)
+{
+ uint32_t cpu=smp_get(SMP_APIC_ID);
+ uint32_t idx=task_runs(pid);
+ return task_list[cpu][idx].vmem;
+}
diff --git a/kernel/scheduler.h b/kernel/scheduler.h
index 7650f01..7761bb4 100644
--- a/kernel/scheduler.h
+++ b/kernel/scheduler.h
@@ -23,3 +23,4 @@ void task_exit(uint32_t pid);
void task_set_name(uint32_t pid, char *name);
volatile int task_add_win(uint32_t pid,ringbuffer *);
int task_set_esp(uint32_t pid, uint32_t esp);
+uint32_t scheduler_get_vmem(uint32_t pid);
diff --git a/kernel/smp.c b/kernel/smp.c
index a57b4b9..02b0263 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -13,7 +13,6 @@
#include "asm_pit.h"
#include "asm_smp.h"
#include "apic.h"
-#include "vesa.h"
#include "syscalls.h"
// set cpu private value
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 083fbf1..ccda5f0 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -4,7 +4,6 @@
#include "lib/printf/printf.h"
#include "fs/ext2.h"
#include "kernel.h"
-#include "driver/vesa.h"
#include "fifo.h"
#include "fd.h"
#include "fs/elf.h"
@@ -27,9 +26,13 @@
#include "stdstreams.h"
#include "sys/unistd.h"
+
+// TODO oh maan, dyamically allocate some nice structures and think about reentrancy
+// and smp !!
+//TODO move to process.c or somehting..and implement per process //
+
#define MAX_PID 200
-//TODO move to process.c and implement per process //
static fd fds[MAX_PID][MAX_FD];
static ringbuffer invl[MAX_PID];
//static uint32_t opendir_pos[MAX_PID][MAX_FD];
@@ -69,7 +72,7 @@ int nextfd(int pid)
return i;
}
}
- return -1;
+ kpanic("ran out of filedescirptors for pid : %d",pid);
}
/** errno helper */
void set_errno(int no)
@@ -405,7 +408,6 @@ int syscall_execve(const char *name, char *const argv[], char *const env[], int
if(!entry_global)
{
- kpanic("no entry point!"); // TODO: rem
set_errno(ENOENT);
return -1;
}
@@ -488,6 +490,7 @@ uint32_t syscall_exit(int status, uint32_t none1, uint32_t none2,int pid)
}
}
+ compositor_destroy_window(pid);
task_exit(pid);
__asm__("int $0x81"); // please schedule us away once and for all
return 0;
@@ -597,32 +600,20 @@ uint32_t syscall_tcsetattr(int fd, struct termios *termios_p, uint32_t none, uin
return 0;
}
-uint32_t syscall_gui_rect(uint32_t xy, uint32_t wh, uint32_t none, uint32_t pid)
+uint32_t syscall_gui_rect(uint32_t xy, uint32_t wh, uint32_t fb, uint32_t pid)
{
-// klog("pid %d x y %d %d w h %d %d",pid,xy>>16,xy&0xffff,wh>>16,wh&0xffff);
-
- ringbuffer_put(&invl[pid],xy&0x000000ff);
- ringbuffer_put(&invl[pid],(xy&0x0000ff00)>>8);
- ringbuffer_put(&invl[pid],(xy&0x00ff0000)>>16);
- ringbuffer_put(&invl[pid],(xy&0xff000000)>>24);
-
- ringbuffer_put(&invl[pid],wh&0x000000ff);
- ringbuffer_put(&invl[pid],(wh&0x0000ff00)>>8);
- ringbuffer_put(&invl[pid],(wh&0x00ff0000)>>16);
- ringbuffer_put(&invl[pid],(wh&0xff000000)>>24);
-
- compositor_wake();
-
- return 1;
+ compositor_invalidate(pid,xy>>16,xy&0xffff,wh>>16,wh&0xffff,fb);
+ return 0; // can not fail
}
-uint32_t syscall_gui_win(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid)
+
+uint32_t syscall_gui_win(uint32_t xy, uint32_t wh, uint32_t flags, uint32_t pid)
{
+ //create a ringbuffer for virtual per process /dev/tty (for fool-terms and similar)//
uint32_t fdn=nextfd(pid);
fds[pid][fdn]=fd_from_ringbuffer();
tty[pid]=fdn;
- invl[pid]=ringbuffer_init(1);
- task_add_win(pid,&invl[pid]);
- return 1;
+
+ return compositor_create_window(pid,xy>>16,xy&0xffff,wh>>16,wh&0xffff,flags);
}
/** Generics . prep before we reenable interrupts*/