diff options
| -rw-r--r-- | Makefile | 10 | ||||
| -rw-r--r-- | include/errno.h | 139 | ||||
| -rw-r--r-- | include/kernel/sys.h | 263 | ||||
| -rw-r--r-- | include/unistd.h | 28 | ||||
| -rw-r--r-- | kernel/Makefile | 11 | ||||
| -rw-r--r-- | kernel/kmain.c | 1 | ||||
| -rw-r--r-- | kernel/link.ld | 2 | ||||
| -rw-r--r-- | kernel/sys.c | 10 | ||||
| -rw-r--r-- | kernel/syscall.c | 12 | ||||
| -rw-r--r-- | kernel/traps.s | 17 | ||||
| -rw-r--r-- | kernel/usrbin/Makefile | 27 | ||||
| -rw-r--r-- | kernel/usrbin/lib.s | 10 | ||||
| -rw-r--r-- | kernel/usrbin/link.ld | 8 | ||||
| -rw-r--r-- | kernel/usrbin/main.c | 7 | ||||
| -rw-r--r-- | kernel/usrbin/print.c | 3 | ||||
| -rw-r--r-- | kernel/usrbin/usrbin.bin | bin | 59 -> 0 bytes | |||
| -rw-r--r-- | kernel/usrbin/usrbin.s | 12 |
17 files changed, 513 insertions, 47 deletions
@@ -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 Binary files differdeleted file mode 100644 index bdf8c29..0000000 --- a/kernel/usrbin/usrbin.bin +++ /dev/null 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 |
