diff options
| author | Miguel <m.i@gmx.at> | 2018-10-18 12:26:18 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-10-18 12:26:18 +0200 |
| commit | a282cb8c921299b54a719452ec2bdaff63d8d3e9 (patch) | |
| tree | a8e88f37f855436d515f995135ded66e564c33f1 | |
| parent | ad94570c78a8d9e426fd0d48e9709dba27803b71 (diff) | |
New Scheduling / Syscalls!
| -rw-r--r-- | README.md | 1 | ||||
| -rw-r--r-- | fs/elf.c | 11 | ||||
| -rw-r--r-- | kernel/interrupts.c | 8 | ||||
| -rw-r--r-- | kernel/kernel.h | 3 | ||||
| -rw-r--r-- | kernel/scheduler.c | 14 | ||||
| -rw-r--r-- | kernel/scheduler.h | 1 | ||||
| -rw-r--r-- | kernel/syscalls.c | 42 | ||||
| -rw-r--r-- | userspace/Makefile | 1 | ||||
| -rw-r--r-- | userspace/init.c | 14 | ||||
| -rw-r--r-- | userspace/xterm/Makefile | 5 | ||||
| -rw-r--r-- | userspace/xterm/xterm.c | 24 | ||||
| -rw-r--r-- | video/compositor.c | 3 |
12 files changed, 65 insertions, 62 deletions
@@ -204,6 +204,7 @@ ncurses-examples vim envypn fonts +solarized colors Disclaimer @@ -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); } } } |
