diff options
| author | Miguel <m.i@gmx.at> | 2018-09-18 03:03:28 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-18 03:03:28 +0200 |
| commit | 2d91384197847a7e8fe2c3f548918a8277d3086d (patch) | |
| tree | 7c93404e290a0ffbdaf9a8a94766d7bd0fd6e4f2 /kernel | |
| parent | 06e6e427c76bdb88a7f72dd04411d95a4bda3270 (diff) | |
sysfs, errno, improve foolshell, etc
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/fifo.c | 1 | ||||
| -rw-r--r-- | kernel/kernel.c | 4 | ||||
| -rw-r--r-- | kernel/kmalloc.c | 10 | ||||
| -rw-r--r-- | kernel/kmalloc.h | 4 | ||||
| -rw-r--r-- | kernel/mem.c | 8 | ||||
| -rw-r--r-- | kernel/mem.h | 3 | ||||
| -rw-r--r-- | kernel/scheduler.c | 2 | ||||
| -rw-r--r-- | kernel/syscalls.c | 60 |
8 files changed, 39 insertions, 53 deletions
diff --git a/kernel/fifo.c b/kernel/fifo.c index fadd248..10bc8ff 100644 --- a/kernel/fifo.c +++ b/kernel/fifo.c @@ -27,7 +27,6 @@ bool fifo_has(fifo* f) fifo fifo_create_buffered(uint8_t size) { if (ringbuffer_c>=FIFO_MAX_RINGBUFFERS) kpanic("ran out of ringbuffers for fifos"); - fifo f; fifo_ringbuffers[ringbuffer_c]=ringbuffer_init(size); f.data=&fifo_ringbuffers[ringbuffer_c]; diff --git a/kernel/kernel.c b/kernel/kernel.c index 0239489..072cebb 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -12,6 +12,7 @@ #include "vmem.h" //-- clean below headers --// +#include "sysfs.h" #include "testing/testing.h" #include "ext2.h" #include "apic.h" @@ -100,6 +101,9 @@ void kernel_main(uint32_t eax,uint32_t ebx) ext2_dump_info(VMEM_EXT2_RAMIMAGE); ext2_mount("/"); + // -- MOUNT SYSFS --// + sysfs_mount("/sys/"); + // -- APIC -- // klog("Advanced Programmable Interrupt Controller (APIC) config ..."); apic_init(&cfg_acpi); diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c index 6a7520a..061d68e 100644 --- a/kernel/kmalloc.c +++ b/kernel/kmalloc.c @@ -117,7 +117,7 @@ void kbfree(uint32_t pos) spinlock_release(SPINLOCK_ALLOC); } -void kmalloc_sysfs(void (*f)(char *fmt, ...)) +void kmalloc_sysfs(ringbuffer *r,void (*f)(ringbuffer *r,char *fmt, ...)) { uint32_t free=0; uint32_t used=0; @@ -127,8 +127,8 @@ void kmalloc_sysfs(void (*f)(char *fmt, ...)) else free++; } - f("kernel blocks allocation/deallocation"); - f("total 4096kb blocks: %d (%d bytes)",BLOCKS,BLOCKS*4096); - f("used 4096kb blocks: %d (%d bytes)",used,used*4096); - f("free 4096kb blocks: %d (%d bytes)",free,free*4096); + f(r,"kernel blocks allocation/deallocation"); + f(r,"total 4096kb blocks: %d (%d bytes)",BLOCKS,BLOCKS*4096); + f(r,"used 4096kb blocks: %d (%d bytes)",used,used*4096); + f(r,"free 4096kb blocks: %d (%d bytes)",free,free*4096); } diff --git a/kernel/kmalloc.h b/kernel/kmalloc.h index 5ca4c8c..617872b 100644 --- a/kernel/kmalloc.h +++ b/kernel/kmalloc.h @@ -20,6 +20,8 @@ #include <stdint.h> +#include "ringbuffer.h" + /** Allocate size*4096 bytes and returns a 32-bit address * and 0 if fails. * */ @@ -29,4 +31,4 @@ uint32_t kballoc (uint32_t size); void kbfree (uint32_t addr); /** Get current status for sysfs */ -void kmalloc_sysfs(void (*f)(char *fmt, ...)); +void kmalloc_sysfs(ringbuffer *r, void (*f)(ringbuffer *r, char *fmt, ...)); diff --git a/kernel/mem.c b/kernel/mem.c index 52e08b6..97450d4 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -228,9 +228,9 @@ uint32_t mem_init(multiboot_information *info) return 0; } -void mem_sysfs(void (*f)(char *fmt, ...)) +void mem_sysfs(ringbuffer *r, void (*f)(ringbuffer *r,char *fmt, ...)) { - f("physical memory manager"); - f("free 4096kb blocks : %d",mem_free_blocks); - f("free bytes : %d",mem_free_blocks*4096); + f(r,"physical memory manager"); + f(r,"free 4096kb blocks : %d",mem_free_blocks); + f(r,"free bytes : %d",mem_free_blocks*4096); } diff --git a/kernel/mem.h b/kernel/mem.h index 85fc688..5de95a9 100644 --- a/kernel/mem.h +++ b/kernel/mem.h @@ -19,6 +19,7 @@ */ #include "multiboot.h" +#include "ringbuffer.h" /** * Init the physical memory manager. Please provide the multiboot_information @@ -29,4 +30,4 @@ uint32_t mem_init(multiboot_information *info); void* mem_alloc_block (); void mem_free_block(void* p); uint32_t mem_get_free_blocks_count(); -void mem_sysfs(void (*f)(char *fmt, ...)); +void mem_sysfs(ringbuffer *r, void (*f)(ringbuffer *r, char *fmt, ...)); diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 798d119..8f7f6d6 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -291,7 +291,7 @@ void task_syscall_worker() { uint32_t syscall=task_list[cpu][i].eax; - klog("task pid=%d waiting on syscall %d/%s on cpu %d slot %d.",task_list[cpu][i].pid,syscall,syscall_get_name(syscall),cpu,i); +// klog("task pid=%d waiting on syscall %d/%s on cpu %d slot %d.",task_list[cpu][i].pid,syscall,syscall_get_name(syscall),cpu,i); task_list[cpu][0].vmem=task_list[cpu][i].vmem; // switch syscall worker to pagedir of calling userprog x86_set_page_directory(task_list[cpu][0].vmem); diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 8b5040a..aa20616 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -17,6 +17,15 @@ #include "log.h" #include "timer.h" #include "mount.h" +#include "mem.h" +#include "reent.h" +#include "errno.h" + +void set_errno(int no) +{ + struct _reent *impure_ptr=VMEM_USER_NEWLIB; + impure_ptr->_errno=no; +} static fd fds[MAX_FD]; static uint32_t next_fd=0; @@ -148,7 +157,7 @@ int syscall_write(int file, char *buf, int len) */ int syscall_read(int file, char *buf, int len) { - if(fds[file].type==FD_TYPE_EXT2_FILE && !fd_has(&fds[file]))return 0; + if(fd_eof(&fds[file]))return 0; *buf=fd_read(&fds[file]); return 1; } @@ -217,36 +226,28 @@ int copy_args(char **in, char **out) return count; } -int syscall_execve(char *name, char **argv, char **env,int pid) +/** does not return on success otherwise -1 and errrno set */ +int syscall_execve(const char *name, char *const argv[], char *const env[], int pid) { + fixme("not overwrite yourself?"); int arg_count=0; while(argv[arg_count]!=NULL)arg_count++; char **argv1=VMEM_USER_ENV; - if(argv!=NULL) - { - copy_args(argv,argv1); - } - else{ - argv1=NULL; - } + 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(env!=NULL)copy_args(env,env1); + else env1=NULL; uint32_t alloc; uint32_t entry_global=load_elf(name,&alloc); - if(!entry_global) - { - return -1; // errror loading + if(!entry_global){ + set_errno(ENOENT); + return -1; } uint32_t *stack=VMEM_USER_STACK_TOP-4*32; @@ -255,26 +256,6 @@ int syscall_execve(char *name, char **argv, char **env,int pid) *--stack=env1; task_reset(pid,entry_global,stack,alloc); return 0; - - /* try to move this to asm */ - // asm volatile("jmp ."); // loop forever - //klog("returning to jump addy (0x%08X)", entry_global); - /* - asm volatile("mov $0x08fff000,%esp"); // set stack at high end of process image - - asm volatile ("push %0" :: "r" (argv1)); - asm volatile ("push %0" :: "r" (arg_count)); - //asm volatile ("push %0" :: "r" (kballoc(1))); - asm volatile ("push %0" :: "r" (env1)); - - // push addr and return to it - asm volatile ("pushl %0"::"r"(entry_global)); - - asm volatile ("sti"); - asm volatile ("ret"); - */ - - // this is never reached! } // minihack @@ -402,7 +383,6 @@ uint32_t syscall_generic_test(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, case SYSCALL_WAIT : return !task_runs(p1); case SYSCALL_READ : - if(fds[p1].type==FD_TYPE_EXT2_FILE)return 1; return fd_has(&fds[p1]); case SYSCALL_EXIT : return 1; |
