summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/Makefile11
-rw-r--r--kernel/kmain.c1
-rw-r--r--kernel/link.ld2
-rw-r--r--kernel/sys.c10
-rw-r--r--kernel/syscall.c12
-rw-r--r--kernel/traps.s17
-rw-r--r--kernel/usrbin/Makefile27
-rw-r--r--kernel/usrbin/lib.s10
-rw-r--r--kernel/usrbin/link.ld8
-rw-r--r--kernel/usrbin/main.c7
-rw-r--r--kernel/usrbin/print.c3
-rw-r--r--kernel/usrbin/usrbin.binbin59 -> 0 bytes
-rw-r--r--kernel/usrbin/usrbin.s12
13 files changed, 77 insertions, 43 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index 3427449..6cf8ae4 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -2,10 +2,10 @@ TARGET = kernel
SRCS = $(wildcard *.c)
ASMS = $(wildcard *.s)
-OBJS = $(SRCS:.c=.o) $(ASMS:.s=.o) usrbin/usrbin.o
+OBJS = $(SRCS:.c=.o) $(ASMS:.s=.o) usrbin/usrbin_blob.o
-CFLAGS = -m32 -I../include -ffreestanding -nostdinc -nostdlib -fno-stack-protector -gstabs+
-LDFLAGS = -m elf_i386 -Tlink.ld
+CFLAGS = -m32 -I../include -ffreestanding -nostdinc -nostdlib -fno-stack-protector -fno-pie -gstabs+
+LDFLAGS = -m elf_i386 -T link.ld
ASMFLAGS = -f elf32
CC = gcc $(CFLAGS)
@@ -16,8 +16,8 @@ all: build
build: $(TARGET)
-usrbin/usrbin.o: usrbin/usrbin.s
- make -C usrbin
+usrbin/usrbin_blob.o: $(wildcard usrbin/*.s) $(wildcard usrbin/*.c)
+ $(MAKE) -C usrbin
.s.o:
$(ASM) -o $*.o $^
@@ -31,6 +31,7 @@ $(TARGET): $(OBJS)
clean:
rm -f $(OBJS)
rm -f $(TARGET)
+ $(MAKE) -C usrbin clean
run: $(TARGET)
qemu-system-x86_64 -s -kernel $(TARGET)
diff --git a/kernel/kmain.c b/kernel/kmain.c
index bf6b9ae..4bfd129 100644
--- a/kernel/kmain.c
+++ b/kernel/kmain.c
@@ -1,4 +1,5 @@
#include <kernel/con.h>
+#include <kernel/sys.h>
#include <stdint.h>
#include <sys/types.h>
diff --git a/kernel/link.ld b/kernel/link.ld
index a97b27f..21c9b7c 100644
--- a/kernel/link.ld
+++ b/kernel/link.ld
@@ -1,9 +1,7 @@
OUTPUT_FORMAT(elf32-i386)
-/* OUTPUT_FORMAT(binary) */
ENTRY(kboot)
SECTIONS
{
- /* . = 0x100000; */
. = 0;
.mboothdr : { *(.mboothdr) }
.text : { *(.text) }
diff --git a/kernel/sys.c b/kernel/sys.c
new file mode 100644
index 0000000..b648dd1
--- /dev/null
+++ b/kernel/sys.c
@@ -0,0 +1,10 @@
+#include <errno.h>
+#include <kernel/con.h>
+
+int sys_print(char *s) {
+ printf(s);
+}
+
+int sys_dummy(void) {
+ return -ENOSYS;
+}
diff --git a/kernel/syscall.c b/kernel/syscall.c
deleted file mode 100644
index 8fa5da0..0000000
--- a/kernel/syscall.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <kernel/con.h>
-#include <stdarg.h>
-#include <stdint.h>
-
-/* main syscall handler */
-void syscall(va_list ap) {
- uint8_t call;
- char *s;
-
- printf("Call Number: 0x%02x\n", va_arg(ap, uint8_t));
- printf(va_arg(ap, char*));
-}
diff --git a/kernel/traps.s b/kernel/traps.s
index 7b7446b..ba9814c 100644
--- a/kernel/traps.s
+++ b/kernel/traps.s
@@ -5,9 +5,9 @@
global syscall_init
global traps_init
+extern call_table
extern idt
extern register_isr
-extern syscall
%macro SAVE 0
pusha
@@ -20,6 +20,8 @@ extern syscall
mov es, ax
mov fs, ax
mov gs, ax
+ ; restore EAX (needed for syscalls)
+ mov eax, [esp+44]
%endmacro
%macro SAVE_ERR 0
@@ -206,11 +208,14 @@ exc_reserved:
syscall_handler:
SAVE
- ; pass the saved ESP value to the REAL handler
- mov eax, [esp+46]
- push eax
- call syscall
- add esp, 4
+ push edx
+ push ecx
+ push ebx
+ and eax, 0xFF
+ shl eax, 2
+ add eax, call_table
+ call [eax]
+ add esp, 12
RESTORE
diff --git a/kernel/usrbin/Makefile b/kernel/usrbin/Makefile
index dfd1b84..dd42909 100644
--- a/kernel/usrbin/Makefile
+++ b/kernel/usrbin/Makefile
@@ -1,17 +1,32 @@
-TARGET = usrbin.o
+TARGET = usrbin_blob.o
-ASM = nasm
+SRCS = $(wildcard *.c)
+ASMS = $(wildcard *.s)
+OBJS = $(SRCS:.c=.o) $(ASMS:.s=.o)
+
+CFLAGS = -m32 -I../../include -ffreestanding -nostdinc -nostdlib -fno-stack-protector -fno-pie
+LDFLAGS = -m elf_i386 -T link.ld
+ASMFLAGS = -f elf32
+
+CC = gcc $(CFLAGS)
+LD = ld $(LDFLAGS)
+ASM = nasm $(ASMFLAGS)
all: build
build: $(TARGET)
-usrbin.bin: usrbin.s
- $(ASM) -f bin -o usrbin.bin usrbin.s
+.s.o:
+ $(ASM) -o $*.o $^
+
+.c.o:
+ $(CC) -c -o $*.o $^
-$(TARGET): usrbin.bin
- objcopy -I binary -O elf32-i386 -B i386 usrbin.bin usrbin.o
+$(TARGET): $(OBJS)
+ $(LD) -o usrbin.bin $(OBJS)
+ objcopy -I binary -O elf32-i386 -B i386 usrbin.bin $(TARGET)
clean:
rm -f usrbin.bin
+ rm -f $(OBJS)
rm -f $(TARGET)
diff --git a/kernel/usrbin/lib.s b/kernel/usrbin/lib.s
new file mode 100644
index 0000000..ffe4f5f
--- /dev/null
+++ b/kernel/usrbin/lib.s
@@ -0,0 +1,10 @@
+bits 32
+
+extern main
+
+section .entry
+init:
+ call main
+.loop:
+ ; loop forever
+ jmp .loop
diff --git a/kernel/usrbin/link.ld b/kernel/usrbin/link.ld
new file mode 100644
index 0000000..c1a7a42
--- /dev/null
+++ b/kernel/usrbin/link.ld
@@ -0,0 +1,8 @@
+OUTPUT_FORMAT(binary)
+SECTIONS
+{
+ . = 0x100000;
+ .text : { *(.entry); .*(.text) }
+ .data : { *(.data) }
+ .bss : { *(.bss) }
+}
diff --git a/kernel/usrbin/main.c b/kernel/usrbin/main.c
new file mode 100644
index 0000000..5cc7567
--- /dev/null
+++ b/kernel/usrbin/main.c
@@ -0,0 +1,7 @@
+#include <stdint.h>
+
+extern int print(char*);
+
+void main(void) {
+ print("We did it ma!\n");
+}
diff --git a/kernel/usrbin/print.c b/kernel/usrbin/print.c
new file mode 100644
index 0000000..ea32cdf
--- /dev/null
+++ b/kernel/usrbin/print.c
@@ -0,0 +1,3 @@
+#include <unistd.h>
+
+_syscall1(int, print, char*, s);
diff --git a/kernel/usrbin/usrbin.bin b/kernel/usrbin/usrbin.bin
deleted file mode 100644
index bdf8c29..0000000
--- a/kernel/usrbin/usrbin.bin
+++ /dev/null
Binary files differ
diff --git a/kernel/usrbin/usrbin.s b/kernel/usrbin/usrbin.s
deleted file mode 100644
index 248d823..0000000
--- a/kernel/usrbin/usrbin.s
+++ /dev/null
@@ -1,12 +0,0 @@
-bits 32
-org 0x100000
-
-main:
- push .msg
- push byte 0
- int 0x80
- add esp, 4
-.loop:
- ; loop forever
- jmp .loop
-.msg: db "Hello World from Userspace, using syscalls!", 10, 0