summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.h2
-rw-r--r--kernel/ringbuffer.c21
-rw-r--r--kernel/scheduler.c4
-rw-r--r--kernel/scheduler.h3
-rw-r--r--kernel/syscalls.c22
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;
}