summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile10
-rw-r--r--include/errno.h139
-rw-r--r--include/kernel/sys.h263
-rw-r--r--include/unistd.h28
-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
17 files changed, 513 insertions, 47 deletions
diff --git a/Makefile b/Makefile
index 4098be7..919e5f1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,10 @@
-all:
- make -C kernel
+all: build
+
+build:
+ $(MAKE) -C kernel
run:
- make -C kernel run
+ $(MAKE) -C kernel run
clean:
- make -C kernel clean
+ $(MAKE) -C kernel clean
diff --git a/include/errno.h b/include/errno.h
new file mode 100644
index 0000000..930671a
--- /dev/null
+++ b/include/errno.h
@@ -0,0 +1,139 @@
+#ifndef _ERRNO_H
+#define _ERRNO_H
+
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define EWOULDBLOCK 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define EDEADLK 35
+#define EDEADLOCK 35
+#define ENAMETOOLONG 36
+#define ENOLCK 37
+#define ENOSYS 38
+#define ENOTEMPTY 39
+#define ELOOP 40
+#define ENOMSG 42
+#define EIDRM 43
+#define ECHRNG 44
+#define EL2NSYNC 45
+#define EL3HLT 46
+#define EL3RST 47
+#define ELNRNG 48
+#define EUNATCH 49
+#define ENOCSI 50
+#define EL2HLT 51
+#define EBADE 52
+#define EBADR 53
+#define EXFULL 54
+#define ENOANO 55
+#define EBADRQC 56
+#define EBADSLT 57
+#define EBFONT 59
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+#define ENONET 64
+#define ENOPKG 65
+#define EREMOTE 66
+#define ENOLINK 67
+#define EADV 68
+#define ESRMNT 69
+#define ECOMM 70
+#define EPROTO 71
+#define EMULTIHOP 72
+#define EDOTDOT 73
+#define EBADMSG 74
+#define EOVERFLOW 75
+#define ENOTUNIQ 76
+#define EBADFD 77
+#define EREMCHG 78
+#define ELIBACC 79
+#define ELIBBAD 80
+#define ELIBSCN 81
+#define ELIBMAX 82
+#define ELIBEXEC 83
+#define EILSEQ 84
+#define ERESTART 85
+#define ESTRPIPE 86
+#define EUSERS 87
+#define ENOTSOCK 88
+#define EDESTADDRREQ 89
+#define EMSGSIZE 90
+#define EPROTOTYPE 91
+#define ENOPROTOOPT 92
+#define EPROTONOSUPPORT 93
+#define ESOCKTNOSUPPORT 94
+#define EOPNOTSUPP 95
+#define ENOTSUP 95
+#define EPFNOSUPPORT 96
+#define EAFNOSUPPORT 97
+#define EADDRINUSE 98
+#define EADDRNOTAVAIL 99
+#define ENETDOWN 100
+#define ENETUNREACH 101
+#define ENETRESET 102
+#define ECONNABORTED 103
+#define ECONNRESET 104
+#define ENOBUFS 105
+#define EISCONN 106
+#define ENOTCONN 107
+#define ESHUTDOWN 108
+#define ETOOMANYREFS 109
+#define ETIMEDOUT 110
+#define ECONNREFUSED 111
+#define EHOSTDOWN 112
+#define EHOSTUNREACH 113
+#define EALREADY 114
+#define EINPROGRESS 115
+#define ESTALE 116
+#define EUCLEAN 117
+#define ENOTNAM 118
+#define ENAVAIL 119
+#define EISNAM 120
+#define EREMOTEIO 121
+#define EDQUOT 122
+#define ENOMEDIUM 123
+#define EMEDIUMTYPE 124
+#define ECANCELED 125
+#define ENOKEY 126
+#define EKEYEXPIRED 127
+#define EKEYREVOKED 128
+#define EKEYREJECTED 129
+#define EOWNERDEAD 130
+#define ENOTRECOVERABLE 131
+#define ERFKILL 132
+#define EHWPOISON 133
+
+#endif
diff --git a/include/kernel/sys.h b/include/kernel/sys.h
new file mode 100644
index 0000000..ea54f14
--- /dev/null
+++ b/include/kernel/sys.h
@@ -0,0 +1,263 @@
+typedef int (*syscall_t) (void);
+
+extern int sys_print(void);
+extern int sys_dummy(void);
+
+syscall_t call_table[256] = {
+ [0] = &sys_print,
+ [1] = &sys_dummy,
+ [2] = &sys_dummy,
+ [3] = &sys_dummy,
+ [4] = &sys_dummy,
+ [5] = &sys_dummy,
+ [6] = &sys_dummy,
+ [7] = &sys_dummy,
+ [8] = &sys_dummy,
+ [9] = &sys_dummy,
+ [10] = &sys_dummy,
+ [11] = &sys_dummy,
+ [12] = &sys_dummy,
+ [13] = &sys_dummy,
+ [14] = &sys_dummy,
+ [15] = &sys_dummy,
+ [16] = &sys_dummy,
+ [17] = &sys_dummy,
+ [18] = &sys_dummy,
+ [19] = &sys_dummy,
+ [20] = &sys_dummy,
+ [21] = &sys_dummy,
+ [22] = &sys_dummy,
+ [23] = &sys_dummy,
+ [24] = &sys_dummy,
+ [25] = &sys_dummy,
+ [26] = &sys_dummy,
+ [27] = &sys_dummy,
+ [28] = &sys_dummy,
+ [29] = &sys_dummy,
+ [30] = &sys_dummy,
+ [31] = &sys_dummy,
+ [32] = &sys_dummy,
+ [33] = &sys_dummy,
+ [34] = &sys_dummy,
+ [35] = &sys_dummy,
+ [36] = &sys_dummy,
+ [37] = &sys_dummy,
+ [38] = &sys_dummy,
+ [39] = &sys_dummy,
+ [40] = &sys_dummy,
+ [41] = &sys_dummy,
+ [42] = &sys_dummy,
+ [43] = &sys_dummy,
+ [44] = &sys_dummy,
+ [45] = &sys_dummy,
+ [46] = &sys_dummy,
+ [47] = &sys_dummy,
+ [48] = &sys_dummy,
+ [49] = &sys_dummy,
+ [50] = &sys_dummy,
+ [51] = &sys_dummy,
+ [52] = &sys_dummy,
+ [53] = &sys_dummy,
+ [54] = &sys_dummy,
+ [55] = &sys_dummy,
+ [56] = &sys_dummy,
+ [57] = &sys_dummy,
+ [58] = &sys_dummy,
+ [59] = &sys_dummy,
+ [60] = &sys_dummy,
+ [61] = &sys_dummy,
+ [62] = &sys_dummy,
+ [63] = &sys_dummy,
+ [64] = &sys_dummy,
+ [65] = &sys_dummy,
+ [66] = &sys_dummy,
+ [67] = &sys_dummy,
+ [68] = &sys_dummy,
+ [69] = &sys_dummy,
+ [70] = &sys_dummy,
+ [71] = &sys_dummy,
+ [72] = &sys_dummy,
+ [73] = &sys_dummy,
+ [74] = &sys_dummy,
+ [75] = &sys_dummy,
+ [76] = &sys_dummy,
+ [77] = &sys_dummy,
+ [78] = &sys_dummy,
+ [79] = &sys_dummy,
+ [80] = &sys_dummy,
+ [81] = &sys_dummy,
+ [82] = &sys_dummy,
+ [83] = &sys_dummy,
+ [84] = &sys_dummy,
+ [85] = &sys_dummy,
+ [86] = &sys_dummy,
+ [87] = &sys_dummy,
+ [88] = &sys_dummy,
+ [89] = &sys_dummy,
+ [90] = &sys_dummy,
+ [91] = &sys_dummy,
+ [92] = &sys_dummy,
+ [93] = &sys_dummy,
+ [94] = &sys_dummy,
+ [95] = &sys_dummy,
+ [96] = &sys_dummy,
+ [97] = &sys_dummy,
+ [98] = &sys_dummy,
+ [99] = &sys_dummy,
+ [100] = &sys_dummy,
+ [101] = &sys_dummy,
+ [102] = &sys_dummy,
+ [103] = &sys_dummy,
+ [104] = &sys_dummy,
+ [105] = &sys_dummy,
+ [106] = &sys_dummy,
+ [107] = &sys_dummy,
+ [108] = &sys_dummy,
+ [109] = &sys_dummy,
+ [110] = &sys_dummy,
+ [111] = &sys_dummy,
+ [112] = &sys_dummy,
+ [113] = &sys_dummy,
+ [114] = &sys_dummy,
+ [115] = &sys_dummy,
+ [116] = &sys_dummy,
+ [117] = &sys_dummy,
+ [118] = &sys_dummy,
+ [119] = &sys_dummy,
+ [120] = &sys_dummy,
+ [121] = &sys_dummy,
+ [122] = &sys_dummy,
+ [123] = &sys_dummy,
+ [124] = &sys_dummy,
+ [125] = &sys_dummy,
+ [126] = &sys_dummy,
+ [127] = &sys_dummy,
+ [128] = &sys_dummy,
+ [129] = &sys_dummy,
+ [130] = &sys_dummy,
+ [131] = &sys_dummy,
+ [132] = &sys_dummy,
+ [133] = &sys_dummy,
+ [134] = &sys_dummy,
+ [135] = &sys_dummy,
+ [136] = &sys_dummy,
+ [137] = &sys_dummy,
+ [138] = &sys_dummy,
+ [139] = &sys_dummy,
+ [140] = &sys_dummy,
+ [141] = &sys_dummy,
+ [142] = &sys_dummy,
+ [143] = &sys_dummy,
+ [144] = &sys_dummy,
+ [145] = &sys_dummy,
+ [146] = &sys_dummy,
+ [147] = &sys_dummy,
+ [148] = &sys_dummy,
+ [149] = &sys_dummy,
+ [150] = &sys_dummy,
+ [151] = &sys_dummy,
+ [152] = &sys_dummy,
+ [153] = &sys_dummy,
+ [154] = &sys_dummy,
+ [155] = &sys_dummy,
+ [156] = &sys_dummy,
+ [157] = &sys_dummy,
+ [158] = &sys_dummy,
+ [159] = &sys_dummy,
+ [160] = &sys_dummy,
+ [161] = &sys_dummy,
+ [162] = &sys_dummy,
+ [163] = &sys_dummy,
+ [164] = &sys_dummy,
+ [165] = &sys_dummy,
+ [166] = &sys_dummy,
+ [167] = &sys_dummy,
+ [168] = &sys_dummy,
+ [169] = &sys_dummy,
+ [170] = &sys_dummy,
+ [171] = &sys_dummy,
+ [172] = &sys_dummy,
+ [173] = &sys_dummy,
+ [174] = &sys_dummy,
+ [175] = &sys_dummy,
+ [176] = &sys_dummy,
+ [177] = &sys_dummy,
+ [178] = &sys_dummy,
+ [179] = &sys_dummy,
+ [180] = &sys_dummy,
+ [181] = &sys_dummy,
+ [182] = &sys_dummy,
+ [183] = &sys_dummy,
+ [184] = &sys_dummy,
+ [185] = &sys_dummy,
+ [186] = &sys_dummy,
+ [187] = &sys_dummy,
+ [188] = &sys_dummy,
+ [189] = &sys_dummy,
+ [190] = &sys_dummy,
+ [191] = &sys_dummy,
+ [192] = &sys_dummy,
+ [193] = &sys_dummy,
+ [194] = &sys_dummy,
+ [195] = &sys_dummy,
+ [196] = &sys_dummy,
+ [197] = &sys_dummy,
+ [198] = &sys_dummy,
+ [199] = &sys_dummy,
+ [200] = &sys_dummy,
+ [201] = &sys_dummy,
+ [202] = &sys_dummy,
+ [203] = &sys_dummy,
+ [204] = &sys_dummy,
+ [205] = &sys_dummy,
+ [206] = &sys_dummy,
+ [207] = &sys_dummy,
+ [208] = &sys_dummy,
+ [209] = &sys_dummy,
+ [210] = &sys_dummy,
+ [211] = &sys_dummy,
+ [212] = &sys_dummy,
+ [213] = &sys_dummy,
+ [214] = &sys_dummy,
+ [215] = &sys_dummy,
+ [216] = &sys_dummy,
+ [217] = &sys_dummy,
+ [218] = &sys_dummy,
+ [219] = &sys_dummy,
+ [220] = &sys_dummy,
+ [221] = &sys_dummy,
+ [222] = &sys_dummy,
+ [223] = &sys_dummy,
+ [224] = &sys_dummy,
+ [225] = &sys_dummy,
+ [226] = &sys_dummy,
+ [227] = &sys_dummy,
+ [228] = &sys_dummy,
+ [229] = &sys_dummy,
+ [230] = &sys_dummy,
+ [231] = &sys_dummy,
+ [232] = &sys_dummy,
+ [233] = &sys_dummy,
+ [234] = &sys_dummy,
+ [235] = &sys_dummy,
+ [236] = &sys_dummy,
+ [237] = &sys_dummy,
+ [238] = &sys_dummy,
+ [239] = &sys_dummy,
+ [240] = &sys_dummy,
+ [241] = &sys_dummy,
+ [242] = &sys_dummy,
+ [243] = &sys_dummy,
+ [244] = &sys_dummy,
+ [245] = &sys_dummy,
+ [246] = &sys_dummy,
+ [247] = &sys_dummy,
+ [248] = &sys_dummy,
+ [249] = &sys_dummy,
+ [250] = &sys_dummy,
+ [251] = &sys_dummy,
+ [252] = &sys_dummy,
+ [253] = &sys_dummy,
+ [254] = &sys_dummy,
+ [255] = &sys_dummy
+};
diff --git a/include/unistd.h b/include/unistd.h
new file mode 100644
index 0000000..c63ac6a
--- /dev/null
+++ b/include/unistd.h
@@ -0,0 +1,28 @@
+#ifndef _UNISTD_H
+#define _UNISTD_H
+
+#define __SYS_print 0
+
+#define _syscall0(type, name) \
+ type name(void) { \
+ type __res; \
+ __asm__ volatile ( \
+ "int $0x80" \
+ : "=a" (__res) \
+ : "a" (__SYS_##name) \
+ :); \
+ return __res; \
+ }
+
+#define _syscall1(type, name, atype, a) \
+ type name(atype a) { \
+ type __res; \
+ __asm__ volatile ( \
+ "int $0x80" \
+ : "=a" (__res) \
+ : "a" (__SYS_##name), "b" (a) \
+ :); \
+ return __res; \
+ }
+
+#endif
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