From c459fab7662eaf45df9994c828065b9fc8d4a8ac Mon Sep 17 00:00:00 2001 From: Miguel Date: Sun, 2 Sep 2018 01:44:40 +0200 Subject: syscalls fine --- asm/int.h | 3 - asm/int.s | 20 ------- driver/keyboard.c | 1 - grubiso/boot/grub/grub.cfg | 10 ++-- kernel/interrupts.c | 12 +++- kernel/kernel.c | 2 +- kernel/scheduler.c | 89 +++++++++++++++-------------- kernel/syscalls.c | 138 +++++++++++++++++++++++---------------------- userspace/init.c | 4 -- 9 files changed, 131 insertions(+), 148 deletions(-) diff --git a/asm/int.h b/asm/int.h index 33dd16e..4133fbf 100644 --- a/asm/int.h +++ b/asm/int.h @@ -38,6 +38,3 @@ void exc15(); void exc16(); void exc17(); void exc18(); - -void asm_mouse_handler(); -void asm_kb_handler(); diff --git a/asm/int.s b/asm/int.s index 156c266..3049a52 100644 --- a/asm/int.s +++ b/asm/int.s @@ -40,26 +40,6 @@ .global exc17 .global exc18 -//temporary -.global asm_mouse_handler -.global asm_kb_handler - -asm_kb_handler: - push %eax - mov $0x0,%eax - in $0x60,%al - pop %eax - ret - -asm_mouse_handler: - push %eax - mov $0x0,%eax - in $0x60,%al - pop %eax - ret - -/////////////// - // nothing to ack .macro ack0 .endm diff --git a/driver/keyboard.c b/driver/keyboard.c index 423be69..65a99da 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -25,7 +25,6 @@ void keyboard_init(uint32_t s) void keyboard_handle(uint8_t in) { - uint8_t make_alpha[]={ 0x1e, // A 0x30, // B diff --git a/grubiso/boot/grub/grub.cfg b/grubiso/boot/grub/grub.cfg index c0baeef..48031b3 100644 --- a/grubiso/boot/grub/grub.cfg +++ b/grubiso/boot/grub/grub.cfg @@ -1,14 +1,14 @@ -set timeout=1 //seconds +set timeout=0 //seconds -menuentry "FoolOS (textmode)" { +menuentry "FoolOS (640x480x32)" { multiboot /boot/foolos.bin - set gfxpayload=text + set gfxpayload=640x480x32 module /boot/ext2.img } -menuentry "FoolOS (640x480x32)" { +menuentry "FoolOS (textmode)" { multiboot /boot/foolos.bin - set gfxpayload=640x480x32 + set gfxpayload=text module /boot/ext2.img } diff --git a/kernel/interrupts.c b/kernel/interrupts.c index cf75798..3ce33c4 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -58,8 +58,13 @@ static void int_install() uint32_t interrupt_handler(uint32_t esp, uint32_t irq) { if(irq==0)asm_pit_tick(); - if(irq==1)asm_kb_handler(); // TODO: put in ringbuff - if(irq==12)asm_mouse_handler();// TODO: put in ringbuff + + // mouse and kb + if(irq==1 || irq==12 ){ + uint32_t in=x86_inb(0x60); + if(irq=1)keyboard_handle(in); // do this in separate thread! +// klog("0x60 in %d",in); + } // 0x80 - a syscall is coming in if(irq==128){ @@ -73,9 +78,10 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) // klog("syscall: %d (ebx=0x%08X,ecx=0x%08X,edx=0x%08X)",eax,ebx,ecx,edx); task_syscall(eax,ebx,ecx,edx); + esp=my_scheduler(esp,2); // force scheduling of pid=2 (kernel worker) } - if(irq==0 || irq==129 || irq==128)esp=my_scheduler(esp); + if(irq==0 || irq==129)esp=my_scheduler(esp,-1); // autoschedule if(irq==255)kpanic("Unhandled Interrupt!"); diff --git a/kernel/kernel.c b/kernel/kernel.c index 43c986c..4406ea0 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -59,7 +59,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) // https://wiki.osdev.org/Symmetric_Multiprocessing klog("Symmetric Multi Processing (SMP) start ... "); smp_log_procdata(&procdata); - smp_start_aps(&procdata); + //smp_start_aps(&procdata); klog("Vritual Memory / Paging init ... "); pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr); diff --git a/kernel/scheduler.c b/kernel/scheduler.c index ee1cea2..a16dd02 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -92,6 +92,7 @@ void task_syscall_worker() { //klog("checking if any pending syscalls."); + bool nowork=true; for(int i=0;i-1) + { + int pid=force_pid; + current_task=pid; + install_tss(task_list[pid].esp0); + + x86_set_page_directory(task_list[pid].vmem); + return task_list[pid].esp; + } for(int i=0;i fifo_data_len[file])return 0; + return 1; +} + int syscall_read(int file, char *buf, int len) { //file 0 = stdin , file 1 = stdout , file 2 = stderr - char c; int l=0; - while(1) - { - while(!fd_has(&fds[file])); c=fd_read(&fds[file]); - + fifo_data_len[file]--; *buf=c; buf++; l++; if(l==len)return l; if(c=='\n')return l; - } } //TODO: replace with dirent! @@ -192,11 +195,14 @@ int syscall_execve(char *name, char **argv, char **env,int pid) if(!entry_global) { - kpanic("error loading %s",name); return -1; // errror loading } - task_reset(pid,entry_global,0x08fff000); + uint32_t *stack=0x08fff000; + *++stack=argv1; + *++stack=arg_count; + *++stack=env1; + task_reset(pid,entry_global,stack); return 0; /* try to move this to asm */ @@ -230,9 +236,9 @@ int get_max_fd() // TODO: allow opening existing files/named pipes int syscall_open(char *name, int flags, int mode) { - if( next_fifo>=MAX_FIFOS || next_fd>=MAX_FD)kpanic("we ran out of fd's or fifo's"); + if(0!=strcmp(name,"term")) { fifos[next_fifo]=fifo_create_buffered(1); @@ -243,18 +249,17 @@ int syscall_open(char *name, int flags, int mode) // HERE WE SEE THE GENIUS OF OUR ABSTRACTIONS (I HOPE...) - if (fb_addr<0x100000) + if (fb_addr<0x100000) // text-mode { - screen.put_char=console_put_char; - screen.update_cursor=update_cursor; + screen.put_char=console_put_char; + screen.update_cursor=update_cursor; } - else + else // framebuffer mode { - screen.put_char=vesa_console_put_char; - screen.update_cursor=vesa_update_cursor; + screen.put_char=vesa_console_put_char; + screen.update_cursor=vesa_update_cursor; } - tty1=terminal_init(&screen,NULL); fifos[next_fifo].data=&tty1; @@ -263,6 +268,8 @@ int syscall_open(char *name, int flags, int mode) fds[next_fd]=fd_from_fifo(&fifos[next_fifo]); } + fifo_data_len[next_fifo]=0; + next_fifo++; next_fd++; @@ -314,56 +321,55 @@ int syscall_stat(const char *path, struct stat *st,int none) uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) { - switch(nr){ - case SYSCALL_EXIT : - return task_exit(p1,p2,p3); - case SYSCALL_CLOSE : - return syscall_close(p1,p2,p3); - case SYSCALL_EXECVE : - return syscall_execve(p1,p2,p3,pid); - case SYSCALL_FORK : - return task_fork(pid); - case SYSCALL_GETPID : -// return syscall_getpid(p1,p2,p3); - return -1; - case SYSCALL_ISATTY : - return syscall_isatty(p1,p2,p3); - case SYSCALL_LINK : -// return syscall_link(p1,p2,p3); - return -1; - case SYSCALL_LSEEK : - return syscall_lseek(p1,p2,p3); - case SYSCALL_OPEN : - return syscall_open(p1,p2,p3); - case SYSCALL_READ : - return syscall_read(p1,p2,p3); - case SYSCALL_SBRK : - return syscall_sbrk(p1,p2,p3); - case SYSCALL_STAT : - return syscall_stat(p1,p2,p3); - case SYSCALL_FSTAT : - return syscall_stat(p1,p2,p3); - case SYSCALL_LSTAT : - return syscall_stat(p1,p2,p3); - case SYSCALL_TIMES : -// return syscall_times(p1,p2,p3); - return -1; - case SYSCALL_UNLINK : -// return syscall_unlink(p1,p2,p3); - return -1; - case SYSCALL_WAIT : - return task_wait(p1,p2,p3); - case SYSCALL_WRITE : - return syscall_write(p1,p2,p3); - case SYSCALL_GETTIMEOFDAY: - return syscall_gettimeofday(p1,p2); - case SYSCALL_READDIR : - return syscall_readdir(p1,p2,p3); - case SYSCALL_KILL : -// return task_kill(p1,p2,p3); - return -1; - case SYSCALL_POLL : - return syscall_poll(p1); + case SYSCALL_EXIT : + return task_exit(pid); + case SYSCALL_CLOSE : + return syscall_close(p1,p2,p3); + case SYSCALL_EXECVE : + return syscall_execve(p1,p2,p3,pid); + case SYSCALL_FORK : + return task_fork(pid); + case SYSCALL_GETPID : + // return syscall_getpid(p1,p2,p3); + return -1; + case SYSCALL_ISATTY : + return syscall_isatty(p1,p2,p3); + case SYSCALL_LINK : + // return syscall_link(p1,p2,p3); + return -1; + case SYSCALL_LSEEK : + return syscall_lseek(p1,p2,p3); + case SYSCALL_OPEN : + return syscall_open(p1,p2,p3); + case SYSCALL_READ : + return syscall_read(p1,p2,p3); + case SYSCALL_SBRK : + return syscall_sbrk(p1,p2,p3); + case SYSCALL_STAT : + return syscall_stat(p1,p2,p3); + case SYSCALL_FSTAT : + return syscall_stat(p1,p2,p3); + case SYSCALL_LSTAT : + return syscall_stat(p1,p2,p3); + case SYSCALL_TIMES : + // return syscall_times(p1,p2,p3); + return -1; + case SYSCALL_UNLINK : + // return syscall_unlink(p1,p2,p3); + return -1; + case SYSCALL_WAIT : + return task_wait(pid); + case SYSCALL_WRITE : + return syscall_write(p1,p2,p3); + case SYSCALL_GETTIMEOFDAY: + return syscall_gettimeofday(p1,p2); + case SYSCALL_READDIR : + return syscall_readdir(p1,p2,p3); + case SYSCALL_KILL : + // return task_kill(p1,p2,p3); + return -1; + case SYSCALL_POLL : + return syscall_poll(p1); } } diff --git a/userspace/init.c b/userspace/init.c index 6484b78..a82a597 100644 --- a/userspace/init.c +++ b/userspace/init.c @@ -10,10 +10,8 @@ int main(int argc, char **argv) time_t ltime; time(<ime); printf("Current time: %s", ctime(<ime)); - printf("fool-init: spawning a Fool's Shell\n"); - //while(1)printf("x"); // loop forever and spawn shells if the top-shell exits while(1) @@ -33,10 +31,8 @@ int main(int argc, char **argv) // wait until our child process state changes (exits) // and respawn SHELL - while(1); _wait(&status); - printf("fool-init: catched exit of process %d.\n",pid); printf("fool-init: respawning a Fools Shell\n"); -- cgit v1.2.3