summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-18 03:03:28 +0200
committerMiguel <m.i@gmx.at>2018-09-18 03:03:28 +0200
commit2d91384197847a7e8fe2c3f548918a8277d3086d (patch)
tree7c93404e290a0ffbdaf9a8a94766d7bd0fd6e4f2 /kernel
parent06e6e427c76bdb88a7f72dd04411d95a4bda3270 (diff)
sysfs, errno, improve foolshell, etc
Diffstat (limited to 'kernel')
-rw-r--r--kernel/fifo.c1
-rw-r--r--kernel/kernel.c4
-rw-r--r--kernel/kmalloc.c10
-rw-r--r--kernel/kmalloc.h4
-rw-r--r--kernel/mem.c8
-rw-r--r--kernel/mem.h3
-rw-r--r--kernel/scheduler.c2
-rw-r--r--kernel/syscalls.c60
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;