diff options
| author | Miguel <m.i@gmx.at> | 2018-10-17 02:39:56 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-10-17 02:39:56 +0200 |
| commit | 474c803c32fe055b4f09cb779f22b70d7eba8325 (patch) | |
| tree | fda4241ebd53688c17379a9dd11b111c5bf5e7a0 /kernel | |
| parent | 39f271589fb9db3d6a383857817b13a9bb59d981 (diff) | |
screen areas invalidation
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel.h | 2 | ||||
| -rw-r--r-- | kernel/ringbuffer.c | 21 | ||||
| -rw-r--r-- | kernel/scheduler.c | 4 | ||||
| -rw-r--r-- | kernel/scheduler.h | 3 | ||||
| -rw-r--r-- | kernel/syscalls.c | 22 |
5 files changed, 30 insertions, 22 deletions
diff --git a/kernel/kernel.h b/kernel/kernel.h index 0194ef3..2393719 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -32,7 +32,7 @@ REFERENCES //#define LOG_SYSCALLS #define HIDE_FIXME -#define FOOLOS_APIC_FREQ 25 // how many apic ticks per second +#define FOOLOS_APIC_FREQ 60 // how many apic ticks per second #define MAX_MOUNTS 10 diff --git a/kernel/ringbuffer.c b/kernel/ringbuffer.c index 3526f4d..f11e02b 100644 --- a/kernel/ringbuffer.c +++ b/kernel/ringbuffer.c @@ -1,14 +1,15 @@ #include "ringbuffer.h" #include "kmalloc.h" #include "log.h" +#include "asm_x86.h" ringbuffer ringbuffer_init(uint32_t size) { ringbuffer f; f.data=kballoc(size); f.size=size*4096; - f.front=f.size-1; - f.back=f.size-1; + f.front=0; + f.back=0; return f; } @@ -19,14 +20,12 @@ void ringbuffer_free(ringbuffer *f) bool ringbuffer_full(ringbuffer* f) { - if((f->back-1+f->size)%f->size==f->front)return true; - return false; + return((f->back+1)%f->size==f->front); } bool ringbuffer_empty(ringbuffer* f) { - if(f->front==f->back)return true; - return false; + return(f->front==f->back); } bool ringbuffer_has(ringbuffer* f) @@ -34,8 +33,6 @@ bool ringbuffer_has(ringbuffer* f) return !ringbuffer_empty(f); } -// - bool ringbuffer_put(ringbuffer* f,uint8_t c) { if(ringbuffer_full(f)) @@ -45,8 +42,7 @@ bool ringbuffer_put(ringbuffer* f,uint8_t c) } f->data[f->back]=c; - f->back--; - f->back+=f->size; + f->back++; f->back%=f->size; return true; @@ -57,11 +53,8 @@ uint8_t ringbuffer_get(ringbuffer* f) if(ringbuffer_empty(f))return 0; // indistinguishable from value 0 :( // TODO uint8_t c = f->data[f->front]; - - f->front--; - f->front+=f->size; + f->front++; f->front%=f->size; - return c; } diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 59d26d1..5a65b7e 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -497,7 +497,7 @@ volatile uint32_t task_get_parent(uint32_t pid) return task_list[cpu][idx].parent; } -volatile int task_add_win(uint32_t pid) +volatile int task_add_win(uint32_t pid,ringbuffer *r) { uint32_t cpu=smp_get(SMP_APIC_ID); uint32_t idx=task_idx(pid); @@ -505,7 +505,7 @@ volatile int task_add_win(uint32_t pid) 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); + compositor_add_window(vmem,pid,r); return 0; } diff --git a/kernel/scheduler.h b/kernel/scheduler.h index 71d5646..1b260d8 100644 --- a/kernel/scheduler.h +++ b/kernel/scheduler.h @@ -1,5 +1,6 @@ #include <stdint.h> #include <stdbool.h> +#include "ringbuffer.h" // http://hosted.cjmovie.net/TutMultitask.htm volatile uint32_t scheduler_run(uint32_t oldesp,uint32_t preference); @@ -20,4 +21,4 @@ uint32_t task_runs(uint32_t pid); uint32_t task_idx(uint32_t pid); void task_exit(uint32_t pid); void task_set_name(uint32_t pid, char *name); -volatile int task_add_win(uint32_t pid); +volatile int task_add_win(uint32_t pid,ringbuffer *); diff --git a/kernel/syscalls.c b/kernel/syscalls.c index e73f89c..aa27ed8 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -31,6 +31,7 @@ //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]; //static char opendir_name[MAX_PID][MAX_FD][256]; static int tty[MAX_PID]; // keep track of /dev/tty fd for each process :P @@ -445,6 +446,7 @@ uint32_t syscall_fork(int none1, int none2, int none3, int pid) open_fd[newpid][i]=true; } tty[newpid]=tty[pid]; + invl[newpid]=invl[pid]; // fds[newpid][0]=fd_from_ringbuffer(); // TODO fix // open_fd[newpid][0]=true; @@ -593,9 +595,22 @@ uint32_t syscall_tcsetattr(int fd, struct termios *termios_p, uint32_t none, uin return 0; } -uint32_t syscall_gui_rect(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) +uint32_t syscall_gui_rect(uint32_t xy, uint32_t wh, uint32_t none, 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; } uint32_t syscall_gui_win(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) @@ -603,9 +618,8 @@ uint32_t syscall_gui_win(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) uint32_t fdn=nextfd(pid); fds[pid][fdn]=fd_from_ringbuffer(); tty[pid]=fdn; - - task_add_win(pid); - + invl[pid]=ringbuffer_init(4); + task_add_win(pid,&invl[pid]); return 1; } |
