summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--README.md6
-rw-r--r--asm/int_syscall_handler.asm52
-rw-r--r--kernel/config.h1
-rw-r--r--kernel/kernel.c2
-rw-r--r--kernel/syscalls.c108
-rw-r--r--kernel/syscalls.h21
-rw-r--r--userspace/Makefile6
-rw-r--r--userspace/add.c1
-rw-r--r--userspace/brainfuck.c2
-rw-r--r--userspace/foolshell.c18
-rw-r--r--userspace/simple.c3
-rw-r--r--userspace/syscalls.c76
-rw-r--r--video/console.h2
14 files changed, 236 insertions, 65 deletions
diff --git a/Makefile b/Makefile
index 9e9331c..7633252 100644
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,8 @@ CFLAGS=
CFLAGS+=-ffreestanding
CFLAGS+=-nostdlib
CFLAGS+=-std=gnu11
-CFLAGS+= -I.
+CFLAGS+=-I.
+CFLAGS+=-I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include
#CFLAGS+=-lgcc
CFLAGS+=-Werror-implicit-function-declaration
#CFLAGS+=-fno-zero-initialized-in-bss
diff --git a/README.md b/README.md
index 94645e7..6fedeea 100644
--- a/README.md
+++ b/README.md
@@ -36,6 +36,12 @@ $ cat FoolOS.img > /dev/sdX
You will require some dependencies (as newlib) in order to build.
+adapt libgloss/libnosys
+
+uncomment environ.c and add stubwarnings for sbrk and exit
+Build newlib with: --target=i686-elf to use the crosscompiler
+
+
Supported Platforms
-------------------
diff --git a/asm/int_syscall_handler.asm b/asm/int_syscall_handler.asm
index 25de51a..e9bc79d 100644
--- a/asm/int_syscall_handler.asm
+++ b/asm/int_syscall_handler.asm
@@ -4,6 +4,12 @@ global int_syscall_handler
[extern syscall_read]
[extern syscall_readdir]
[extern syscall_execve]
+[extern syscall_open]
+[extern syscall_close]
+[extern syscall_fstat]
+[extern syscall_isatty]
+[extern syscall_lseek]
+[extern syscall_sbrk]
[bits 32]
int_syscall_handler:
@@ -26,6 +32,24 @@ int_syscall_handler:
cmp eax, 64
je call_execve
+ cmp eax, 65
+ je call_open
+
+ cmp eax, 66
+ je call_close
+
+ cmp eax, 67
+ je call_fstat
+
+ cmp eax, 68
+ je call_isatty
+
+ cmp eax, 69
+ je call_lseek
+
+ cmp eax, 70
+ je call_sbrk
+
done:
mov ebx,eax
@@ -53,11 +77,37 @@ call_write:
call syscall_write
jmp done
+call_open:
+ call syscall_open
+ jmp done
+
call_readdir:
call syscall_readdir
jmp done
+call_close:
+ call syscall_close
+ jmp done
+
+call_fstat:
+ call syscall_fstat
+ jmp done
+
+call_isatty:
+ call syscall_isatty
+ jmp done
+
+call_lseek:
+ call syscall_lseek
+ jmp done
+
+call_sbrk:
+ call syscall_sbrk
+ jmp done
+
+ ;;; THIS CALLS NEED REENABLE INTERRUPTS BEFORE calling workers
call_read:
+
mov al, 0x20 ;Port number AND command number to Acknowledge IRQ
out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts
sti
@@ -67,9 +117,11 @@ call_read:
jmp done_blocking
call_execve:
+
mov al, 0x20 ;Port number AND command number to Acknowledge IRQ
out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts
sti
+
call syscall_execve
jmp $ ; this should never return TODO: pop stack!?
diff --git a/kernel/config.h b/kernel/config.h
index 039ced7..ef0fa71 100644
--- a/kernel/config.h
+++ b/kernel/config.h
@@ -10,4 +10,5 @@
#define FOOLOS_CONSOLE // otherwise VESA will be used!
#define MEM_PRINT_MEMORYMAP
#define LOG_BUF_SIZE 4069
+#define LOG_SYSCALLS
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 2f7cfc3..6058480 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -108,7 +108,7 @@ void kernel_main(uint32_t initial_stack, int mp)
//
// Activate Virtual Memory (paging)
//
- vmem_init();
+ // vmem_init();
//
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index b5a581d..1de5d3a 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -5,11 +5,20 @@
#include "fs/fs.h"
#include "fs/ext2.h"
#include "kernel/console.h"
+#include "kernel/config.h"
+#include <sys/stat.h>
-//
+static int preread;
+static int alloc=0x600000; // TODO: implement properly sbrk!!!
+
int syscall_write(int file, char *buf, int len)
{
+
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"write(file=%d, buf=0x%08X, len=%d)", file,buf,len);
+ #endif
+
// ALL output to stdout
for(int i=0;i<len;i++)
{
@@ -22,6 +31,10 @@ int syscall_write(int file, char *buf, int len)
int syscall_read(int file, char *buf, int len)
{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"read(file=%d, buf=0x%08X, len=%d)", file,buf,len);
+ #endif
+
// stdin
if(file==1)
{
@@ -48,14 +61,107 @@ int syscall_read(int file, char *buf, int len)
int syscall_readdir(const char *name,fs_dirent *dirs,int max)
{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"readdir(name=0x%08X, dirs=0x%08X, %d)", name,dirs,max);
+ #endif
+
return fs_readdir(name,dirs,max);
}
int syscall_execve(char *name, char **argv, char **env)
{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X, argvs=0x%08X, env=0x%08X)", name,argv,env);
+ #endif
+
ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000);
// autorun "user-space" prog
asm("push $0x800000");
asm("ret");
}
+
+int syscall_open(char *name, int flags, int len)
+{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"open (name=0x%08X, flags=%d, len=%d)", name,flags,len);
+ #endif
+
+ return 1;
+
+}
+
+//newcomers
+//
+int syscall_close(int file,int none1,int none2)
+{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"close (file=%d)", file);
+ #endif
+
+ return -1;
+}
+
+int syscall_fstat(int file, struct stat *st,int none)
+{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"fstat (file=%d,stat=0x%08X)", file,st);
+ #endif
+
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int syscall_isatty(int file,int none1,int none2)
+{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"isatty (file=%d)", file);
+ #endif
+
+ return 1;
+}
+
+int syscall_lseek(int file,int ptr,int dir)
+{
+
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"lseek (file=%d, ptr=%d, dir=%d)", file,ptr,dir);
+ #endif
+
+ if(dir==0)preread=ptr;
+ else{ while(1);}
+ return preread;
+}
+
+caddr_t syscall_sbrk(int incr, int none1, int none2)
+{
+ #ifdef LOG_SYSCALLS
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sbrk (incr=%d)", incr);
+ #endif
+
+ int oldalloc=alloc;
+ alloc+=incr;
+ return oldalloc;
+
+ /*
+
+ extern char end;
+// char _end;
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0) {
+ heap_end = &end;
+ }
+ prev_heap_end = heap_end;
+
+ if (heap_end + incr > stack_ptr) {
+ write (1, "Heap and stack collision\n", 25);
+ abort ();
+ }
+
+ heap_end += incr;
+ return (caddr_t) prev_heap_end;
+ */
+}
+
diff --git a/kernel/syscalls.h b/kernel/syscalls.h
index 6569aa6..63aafc4 100644
--- a/kernel/syscalls.h
+++ b/kernel/syscalls.h
@@ -1,6 +1,27 @@
#include "fs/fs.h"
+#define SYSCALL_WRITE 61
+#define SYSCALL_READ 62
+#define SYSCALL_READDIR 63
+#define SYSCALL_EXECVE 64
+#define SYSCALL_OPEN 65
+#define SYSCALL_CLOSE 66
+#define SYSCALL_FSTAT 67
+#define SYSCALL_ISATTY 68
+#define SYSCALL_LSEEK 69
+#define SYSCALL_SBRK 70
+
+
+int syscall_open(char *name, int flags, int len);
int syscall_write(int file, char *buf, int len);
int syscall_read(int file, char *buf, int len);
int syscall_readdir(const char *name,fs_dirent *dirs,int max);
int syscall_execve(char *name, char **argv, char **env);
+
+int syscall_close(int file,int none1,int none2);
+int syscall_fstat(int file, struct stat *st,int none);
+int syscall_isatty(int file,int none1,int none2);
+int syscall_lseek(int file,int ptr,int dir);
+int syscall_sbrk(int incr, int none1, int none2);
+
+// missing: _exit, environ, fork, getpid, kill, link, stat, times, unlink, wait;
diff --git a/userspace/Makefile b/userspace/Makefile
index d54bfa8..564ffe0 100644
--- a/userspace/Makefile
+++ b/userspace/Makefile
@@ -3,12 +3,10 @@
CC=i686-elf-gcc
LD=i686-elf-ld
-CFLAGS=-I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include
+CFLAGS=-I.. -I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include
CFLAGS+=--no-builtin-malloc
CFLAGS+=--no-builtin-free
-LDFLAGS=-L/home/miguel/temp/fool-os-stuff/newlib-build-clean/i686-elf/newlib/ \
- -L/home/miguel/temp/fool-os-stuff/newlib-build-clean/i686-elf/libgloss/libnosys/ \
- -lnosys
+LDFLAGS=-L/home/miguel/temp/fool-os-stuff/newlib-build-clean-new/i686-elf/newlib
ext2.img: shell simple brainfuck add
dd if=/dev/zero of=ext2.img bs=512 count=500
diff --git a/userspace/add.c b/userspace/add.c
index 17ddb64..eecb05a 100644
--- a/userspace/add.c
+++ b/userspace/add.c
@@ -6,7 +6,6 @@
int main(int argc, char **argv)
{
- syscalls_init();
FILE *input;
input=fopen(1,"r");
diff --git a/userspace/brainfuck.c b/userspace/brainfuck.c
index a54e4e5..f985fb9 100644
--- a/userspace/brainfuck.c
+++ b/userspace/brainfuck.c
@@ -37,8 +37,6 @@ void usage() {
int main(int argc, char **argv)
{
- //added by FOOLOS
- syscalls_init();
// used by the bf program
unsigned char *dataptr = malloc(sizeof(char) * DATA_SIZE);
diff --git a/userspace/foolshell.c b/userspace/foolshell.c
index 3fe7353..77c78dd 100644
--- a/userspace/foolshell.c
+++ b/userspace/foolshell.c
@@ -1,8 +1,11 @@
#include <stdio.h>
+#include <assert.h>
#include <string.h>
#include "syscalls.c"
#include "../fs/fs.h"
+char **environ;
+
void hello() {
puts(
"Welcome to FoolShell v0.1"
@@ -17,7 +20,6 @@ void prompt() {
int main(int argc, char **argv)
{
- syscalls_init();
hello();
FILE *input;
@@ -86,7 +88,7 @@ int process(char *buf)
if(!strcmp(command,"help"))
{
- puts("foolshell: supported built-in commands: 'help', 'echo [string]', 'ls [inode_nr]', exec [inode_nr],'malloc [bytes]', 'free [address]'");
+ puts("foolshell: supported built-in commands: 'help', 'echo [string]', 'ls [inode_nr]', exec [inode_nr],'malloc [bytes]', 'free [address]', 'getenv [var]'");
}
else if(!strcmp(command,"ls"))
{
@@ -121,11 +123,23 @@ int process(char *buf)
free(atoi(token[1]));
printf("foolshell: called free(%08x).\n",atoi(token[1]));
}
+ else if(!strcmp(command,"getenv"))
+ {
+ printf("foolshell: %s = %s \n",token[1],getenv(token[1]));
+ }
+ else if(!strcmp(command,"putenv"))
+ {
+ char buf[256];
+ sprintf(buf,"%s=%s",token[1],token[2]);
+ putenv(buf);
+ printf("foolshell: %s = %s \n",token[1],getenv(token[1]));
+ }
else
{
puts("foolshell: command not found");
}
+
//
}
diff --git a/userspace/simple.c b/userspace/simple.c
index 36f0580..59bd4f1 100644
--- a/userspace/simple.c
+++ b/userspace/simple.c
@@ -2,12 +2,11 @@
int main(int argc, char **argv)
{
- syscalls_init();
-
int i;
for(i=0;i<10;i++)
{
+
write(1,"dupa\n",5);
}
diff --git a/userspace/syscalls.c b/userspace/syscalls.c
index b5959eb..7471418 100644
--- a/userspace/syscalls.c
+++ b/userspace/syscalls.c
@@ -1,20 +1,17 @@
-//printf needs following syscalls: sbrk write close fstat isatty lseek read
-//
-
#include <sys/stat.h>
#include <string.h>
#include <stdint.h>
-#include "../fs/fs.h"
+#include "../kernel/syscalls.h"
-static int preread;
-static int alloc;
-easywrite(char *c);
+/*
+char *__env1[]={0};
+char *__env2[]={"dupa","test"};
+char **environ={__env1,__env2};
+*/
-// init syscalls
-void syscalls_init()
+void _exit(int ret)
{
- // TODO dynamic!
- alloc=0x300000;
+while(1);
}
// generic syscall interface!
@@ -43,85 +40,62 @@ int syscall(int call, int p1, int p2, int p3)
return ebx;
}
-//
int close(int file)
{
- return -1;
+ return syscall(SYSCALL_CLOSE,file,0,0);
}
int fstat(int file, struct stat *st)
{
- st->st_mode = S_IFCHR;
- return 0;
+ return syscall(SYSCALL_FSTAT,file,st,0);
}
int isatty(int file)
{
- return 1;
+ return syscall(SYSCALL_ISATTY,file,0,0);
}
int lseek(int file, int ptr, int dir)
{
- if(dir==0)preread=ptr;
- else{ puts("other modes unsupported sorry"); while(1);}
- return preread;
+ return syscall(SYSCALL_LSEEK,file,ptr,dir);
}
int read(int file, char *ptr, int len)
{
- return syscall(62,file,ptr,len);
+
+ return syscall(SYSCALL_READ,file,ptr,len);
}
int readdir(const char *name,fs_dirent *dirs,int max)
{
- return syscall(63,name,dirs,max);
+ return syscall(SYSCALL_READDIR,name,dirs,max);
}
int open(const char *name, int flags, int mode)
{
- return name;
+ return syscall(SYSCALL_OPEN,name,flags,mode);
}
int write(int file, char *ptr, int len)
{
- return syscall(61,file,ptr,len);
+ return syscall(SYSCALL_WRITE,file,ptr,len);
}
int execve(char *name, char **argv, char **env)
{
-
- return syscall(64,name,argv,env);
+ return syscall(SYSCALL_EXECVE,name,argv,env);
}
-
caddr_t sbrk(int incr)
{
-// easywrite("syscall: sbrk!!\n");
- int oldalloc=alloc;
- alloc+=incr;
- return oldalloc;
- /*
-
- extern char end;
-// char _end;
- static char *heap_end;
- char *prev_heap_end;
-
- if (heap_end == 0) {
- heap_end = &end;
- }
- prev_heap_end = heap_end;
-
- if (heap_end + incr > stack_ptr) {
- write (1, "Heap and stack collision\n", 25);
- abort ();
- }
-
- heap_end += incr;
- return (caddr_t) prev_heap_end;
- */
+ static int alloc=0x300000; // TODO: implement properly sbrk!!!
+ int oldalloc=alloc;
+ alloc+=incr;
+ return oldalloc;
+
+ return syscall(SYSCALL_SBRK,incr,0,0);
}
-//
+
diff --git a/video/console.h b/video/console.h
index e8939e7..74ec50c 100644
--- a/video/console.h
+++ b/video/console.h
@@ -1,5 +1,7 @@
#ifndef CONSOLEINT_H
#define CONSOLEINT_H
+// 80 x 24
+// TODO: implement VT100
#include "lib/int/stdint.h"