summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--fs/elf.c11
-rw-r--r--kernel/interrupts.c8
-rw-r--r--kernel/kernel.h3
-rw-r--r--kernel/scheduler.c14
-rw-r--r--kernel/scheduler.h1
-rw-r--r--kernel/syscalls.c42
-rw-r--r--userspace/Makefile1
-rw-r--r--userspace/init.c14
-rw-r--r--userspace/xterm/Makefile5
-rw-r--r--userspace/xterm/xterm.c24
-rw-r--r--video/compositor.c3
12 files changed, 65 insertions, 62 deletions
diff --git a/README.md b/README.md
index 7ab4ade..f9af063 100644
--- a/README.md
+++ b/README.md
@@ -204,6 +204,7 @@ ncurses-examples
vim
envypn fonts
+solarized colors
Disclaimer
diff --git a/fs/elf.c b/fs/elf.c
index d91da60..63c09d6 100644
--- a/fs/elf.c
+++ b/fs/elf.c
@@ -137,17 +137,18 @@ uint32_t load_elf(char *name, uint32_t *alloc)
for(int phidx=0;phidx<elf->e_phnum;phidx++)
{
Elf32_Phdr *phdr=vaddr+elf->e_phoff+phidx*elf->e_phentsize;
+ /*
klog("-- PROGRAMM HEADER %d --",phidx+1);
klog("p-type: %d",phdr->p_type);
klog("p-offset: 0x%08X",phdr->p_offset);
klog("p-vaddr: 0x%08X",phdr->p_vaddr);
klog("p-filesz: 0x%08X",phdr->p_filesz);
klog("p-memsz: 0x%08X",phdr->p_memsz);
-
+ */
if(phidx==0)
{
- klog("text: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
+ // klog("text: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
}
if(phidx==1)
@@ -155,8 +156,8 @@ uint32_t load_elf(char *name, uint32_t *alloc)
- klog("data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
- klog("bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
+ // klog("data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
+ // klog("bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
// let's copy the rw- data block
// from right to left so we not overwrite ourselves!!
@@ -181,7 +182,7 @@ uint32_t load_elf(char *name, uint32_t *alloc)
}
}
- klog("heap starts at: 0x%08X",*alloc);
+// klog("heap starts at: 0x%08X",*alloc);
klog("entry point: 0x%08X",elf->e_entry);
return elf->e_entry;
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 8bc4f47..702112c 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -122,9 +122,9 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq)
if(irq==INTERRUPT_SYSCALL)
{
int pid=task_get_current_pid();
-
uint32_t *stack;
- stack=esp;
+ stack=esp;
+ task_set_esp(pid,esp); // this will get fucked if we get scheduled away...
// extract variables from stack
// (NOTE we pass them in some fucked up order,
@@ -148,11 +148,9 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq)
// it will also not work with SMP
while(true)
{
- // x86_cli();
int ok=syscall_generic_test(eax,edx,ecx,ebx,pid);
- // x86_sti();
if(ok)break;
- else __asm__("int $0x81");
+ __asm__("int $0x81");// does NOT requie interrupts
}
// uff, once we got through we can do the syscall and get out
diff --git a/kernel/kernel.h b/kernel/kernel.h
index 5685f7d..263477a 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -33,13 +33,14 @@ REFERENCES
#define HIDE_FIXME
//#define RINGBUFFER_WARN
+//#define LOG_SCHEDULER
#define FOOLOS_APIC_FREQ 60 // how many apic ticks per second
//#define FOOLOS_APIC_FREQ 1 // how many apic ticks per second SLOW-MO
#define MAX_MOUNTS 10
-#define BIN_INIT "/bin/xterm"
+#define BIN_INIT "/bin/init"
#define VESA_FONT_PATH "/doc/fonts/binfont.bin"
#define FIFO_MAX_RINGBUFFERS 20
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 8cadcb8..694d81c 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -133,7 +133,9 @@ static uint32_t scheduler_schedule(uint32_t idx)
current_task[cpu]=idx;
-// klog("cpu %d rescheduled to %d",cpu,idx);
+#ifdef LOG_SCHEDULER
+ klog("cpu %d rescheduled to %d",cpu,idx);
+#endif
//klog("name: %s",task_list[cpu][idx].name);
//klog("cpu %d / idx %d / pid %d / name: %5s",cpu,idx,task_list[cpu][idx].pid,task_list[cpu][idx].name);
@@ -508,6 +510,13 @@ volatile int task_add_win(uint32_t pid,ringbuffer *r)
return 0;
}
+int task_set_esp(uint32_t pid, uint32_t esp)
+{
+ uint32_t cpu=smp_get(SMP_APIC_ID);
+ uint32_t idx=task_idx(pid);
+ task_list[cpu][idx].esp=esp;
+ return 0;
+}
volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack,uint32_t brk)
{
uint32_t cpu=smp_get(SMP_APIC_ID);
@@ -517,7 +526,8 @@ volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack,uint32_t br
stk[14]=entry;
stk[17]=stack;
- __asm__("int $0x81"); // now we also reschedule (at least for execve sake...)
+
+// __asm__("int $0x81"); // now we also reschedule (for execve sake...)
return 1;
}
diff --git a/kernel/scheduler.h b/kernel/scheduler.h
index 1b260d8..7650f01 100644
--- a/kernel/scheduler.h
+++ b/kernel/scheduler.h
@@ -22,3 +22,4 @@ 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,ringbuffer *);
+int task_set_esp(uint32_t pid, uint32_t esp);
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 23c88a7..9fc1a7f 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -307,11 +307,8 @@ int syscall_select(int maxxfd,struct timeval *tv, fd_set **fd_sets, uint32_t pid
if(!test)FD_ZERO(fd_sets[2]); // we dont give a shit about exceptions! :P TODO!!!
-
return ret;
-
-
}
//TODO: use fd and inode (instead of path)... now this is a crazy trick how it works..
@@ -331,7 +328,7 @@ struct dirent *syscall_opendir(const char *name,struct dirent *dirs,int none,uin
if(ret==-1)
{
// no it does not!
- set_errno(ENOENT);
+ set_errno(ENOENT);
return NULL;
}
@@ -392,29 +389,33 @@ int copy_args(char **in, char **out)
int syscall_execve(const char *name, char *const argv[], char *const env[], int pid)
{
uint32_t alloc;
- uint32_t entry_global=load_elf(name,&alloc);
-
- fixme("not overwrite yourself?");
+ char **argv1= VMEM_USER_ENV;
+ char **env1 = VMEM_USER_ENV+1024*2;
int arg_count=0;
- while(argv[arg_count]!=NULL)arg_count++;
+ //*argv1=NULL;
+ //*env1=NULL;
- char **argv1=VMEM_USER_ENV;
+ // TODO!
+ fixme("not overwrite yourself badly here!?");
+ while(argv[arg_count]!=NULL)arg_count++;
if(argv!=NULL)copy_args(argv,argv1);
- else argv1=NULL;
-
- char **env1=VMEM_USER_ENV+1024*2;
if(env!=NULL)copy_args(env,env1);
- else env1=NULL;
- if(!entry_global){
- set_errno(ENOENT);
- return -1;
+ uint32_t entry_global=load_elf(name,&alloc); // overwrites ourselves (in userspace)
+
+ if(!entry_global)
+ {
+ kpanic("no entry point!"); // TODO: rem
+ set_errno(ENOENT);
+ return -1;
}
- uint32_t *stack=VMEM_USER_STACK_TOP-4*32;
+ // here we might overwrite our CURRENT stack!!! oh fuck TODO: check it!
+ uint32_t *stack=VMEM_USER_STACK_TOP-4*32;
*--stack=argv1;
*--stack=arg_count;
*--stack=env1;
+
task_set_name(pid,name);
task_reset(pid,entry_global,stack,alloc);
@@ -444,10 +445,11 @@ uint32_t syscall_fork(int none1, int none2, int none3, int pid)
fds[newpid][i]=fd_dupl(&fds[pid][i]);
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;
+// fds[newpid][0]=fd_from_ringbuffer(); // TODO fix
+// open_fd[newpid][0]=true;
return newpid;
}
@@ -747,9 +749,7 @@ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint
if(!strcmp(p1,"fcntl")){
klog("todo: quickfix hack for fcntl");
}
-
}
klog("unknown syscall %s / %d we just return 0",p1,nr);
return 0;
}
-
diff --git a/userspace/Makefile b/userspace/Makefile
index 860478a..8d9cf8e 100644
--- a/userspace/Makefile
+++ b/userspace/Makefile
@@ -67,6 +67,7 @@ ext2.img: $(PROGS)
#@cp /home/miguel/git/EXT/vim/runtime/ftplugin mnt/usr/share/vim/ -r
@cp fonts/*.bin mnt/doc/fonts
@cp xterm/xterm mnt/bin
+ @cp xterm/rect mnt/bin
@cp cpp/testcpp mnt/bin
@cp ncurses/nc mnt/bin
@cp pain/pain1 mnt/bin
diff --git a/userspace/init.c b/userspace/init.c
index f9a4e78..255b274 100644
--- a/userspace/init.c
+++ b/userspace/init.c
@@ -4,16 +4,18 @@
*
* */
-char *env1[]={"HOME=/home/miguel","PS1=\033[34m$\033[37m","PWD=/home/miguel","PATH=/bin","TERM=fool-term",0};
-char *argv2[]={"pain2",0};
+static char *env1[]={"HOME=/home/miguel","PS1=\033[34m$\033[37m","PWD=/home/miguel","PATH=/bin","TERM=fool-term",0};
+static char *argv1[]={"xterm","/bin/fsh",0};
-#define LAUNCH_COUNT 1
+/*
+#define LAUNCH_COUNT 3
char *argv1[][4]={
{"/bin/xterm","xterm","/bin/fsh",0},
{"/bin/xterm","xterm","/bin/fsh",0},
{"/bin/xterm","xterm","/bin/fsh",0},
};
+*/
void fork_and_exec(char **argv)
{
@@ -22,17 +24,17 @@ void fork_and_exec(char **argv)
if(!pid) //child
{
execve(argv[0],&argv[1],env1);
- while(1);//hopefully never reached
}
}
int main(int argc, char **argv)
{
+ execve("/bin/xterm",argv1,env1);
+ /*
for(int i=0;i<LAUNCH_COUNT;i++)
{
fork_and_exec(argv1[i]);
}
-
wait(999);/// TODO: here we should wait for commnads to spawn new processes?
-
+ */
}
diff --git a/userspace/xterm/Makefile b/userspace/xterm/Makefile
index fdec016..dff4c46 100644
--- a/userspace/xterm/Makefile
+++ b/userspace/xterm/Makefile
@@ -2,7 +2,10 @@ CC=i686-foolos-gcc
CFLAGS = -ggdb -O0 # best gdb debugging experience
+
+all: xterm rect
xterm: vesa.o terminal.o
+rect: vesa.o
clean:
- rm -f *.o xterm
+ rm -f *.o xterm rect
diff --git a/userspace/xterm/xterm.c b/userspace/xterm/xterm.c
index a4325c7..90b2fe0 100644
--- a/userspace/xterm/xterm.c
+++ b/userspace/xterm/xterm.c
@@ -30,19 +30,6 @@ int main(int argc, char **argv)
if(!pid) // child
{
- // we need a window
- _gui_win();
- //srand(time(NULL)); // Initialization, should only be called once.
- while(1)
- {
- int x = rand()%600;
- int y = rand()%300;
- int width=10;
- int height=10;
- int col = rand()% 0x00ffff;
- put_rect( x, y, width,height,col);
- _gui_inval((x<<16)|(y),(width<<16)|height);
- }
//_close(xterm_in[1]);
close(xterm_out[0]);
@@ -54,9 +41,11 @@ int main(int argc, char **argv)
if(argc==1)_execve(argv1[1],argv1,environ);
execve(argv[1],argv,environ);
- printf("unable to execve %s",argv[1]); // never reached
+ printf("unable to execve %s",argv[1]); // never reached hopefully
+ while(1);
}
else{
+ // TODO quit if execve fails or child exits...
//_close(xterm_in[0]);
close(xterm_out[1]);
@@ -64,15 +53,10 @@ int main(int argc, char **argv)
//_dup2(xterm_in[1],0); // compositor writes here.
//_close(xterm_in[1]);
- // TODO quit if execve fails or child exits...
- terminal_put(tty,'X');
- terminal_put(tty,'X');
- terminal_put(tty,'X');
while(1)
{
char buf[1];
- //read(xterm_out[0],buf,1); // show what foolshell writes to its stdout/stderr
- read(tty_fd,buf,1); // show what foolshell writes to its stdout/stderr
+ read(xterm_out[0],buf,1); // show what foolshell writes to its stdout/stderr
terminal_put(tty,buf[0]);
}
}
diff --git a/video/compositor.c b/video/compositor.c
index e7566f2..d7094b1 100644
--- a/video/compositor.c
+++ b/video/compositor.c
@@ -687,8 +687,9 @@ void compositor_set_background(char *ppm_raw_filename)
val = 0xaa*dist/max_dist;
}
else val=0x0;
+ val=0x002b36;
- put_pixel(bgimage,x,y,val<<8);
+ put_pixel(bgimage,x,y,val);
}
}
}