summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore41
-rw-r--r--Makefile116
-rw-r--r--arch/i386/boot/boot.s149
-rw-r--r--arch/i386/boot/crti.s15
-rw-r--r--arch/i386/boot/crtn.s7
-rw-r--r--arch/i386/include/kernel/multiboot.h102
-rw-r--r--arch/i386/kernel/isr.s129
-rw-r--r--arch/i386/kernel/jump_userspace.s21
-rw-r--r--arch/i386/kernel/spinlock.s30
-rw-r--r--arch/i386/kernel/stack_trace.s31
-rw-r--r--arch/i386/kernel/switch_thread.s28
-rw-r--r--arch/i386/linker.ld30
-rw-r--r--arch/i386/make.config20
-rw-r--r--bin/Makefile18
-rw-r--r--etc/fstab4
-rw-r--r--etc/group18
-rw-r--r--etc/passwd4
-rw-r--r--etc/shadow4
-rw-r--r--etc/shells4
-rw-r--r--include/kernel/input/keyboard.h32
-rw-r--r--include/kernel/interrupt.h13
-rw-r--r--include/kernel/panic.h10
-rw-r--r--include/kernel/sched.h20
-rw-r--r--include/kernel/serial.h21
-rw-r--r--include/kernel/video/framebuffer.h23
-rw-r--r--include/kernel/video/vga.h33
-rw-r--r--include/libk/container_of.h10
-rw-r--r--include/libk/data/list.h32
-rw-r--r--include/libk/data/ringbuf.h50
-rw-r--r--include/libk/io.h10
-rw-r--r--include/libk/kmalloc.h19
-rw-r--r--include/libk/string.h19
-rw-r--r--kernel/arch/x86/include/kernel/asm.h (renamed from arch/i386/include/kernel/asm.h)15
-rw-r--r--kernel/arch/x86/include/kernel/gdt.h (renamed from arch/i386/include/kernel/gdt.h)2
-rw-r--r--kernel/arch/x86/include/kernel/idt.h (renamed from arch/i386/include/kernel/idt.h)0
-rw-r--r--kernel/arch/x86/include/kernel/paging.h (renamed from arch/i386/include/kernel/paging.h)1
-rw-r--r--kernel/arch/x86/include/kernel/pic.h (renamed from arch/i386/include/kernel/pic.h)0
-rw-r--r--kernel/arch/x86/include/kernel/pmem.h (renamed from arch/i386/include/kernel/pmem.h)4
-rw-r--r--kernel/arch/x86/include/kernel/syscall.h (renamed from arch/i386/include/kernel/syscall.h)0
-rw-r--r--kernel/arch/x86/include/kernel/timer.h (renamed from arch/i386/include/kernel/timer.h)0
-rw-r--r--kernel/arch/x86/include/kernel/vmem.h (renamed from arch/i386/include/kernel/vmem.h)0
-rw-r--r--kernel/arch/x86/kernel/gdt.c (renamed from arch/i386/kernel/gdt.c)14
-rw-r--r--kernel/arch/x86/kernel/idt.c (renamed from arch/i386/kernel/idt.c)0
-rw-r--r--kernel/arch/x86/kernel/kmalloc.c (renamed from arch/i386/kernel/kmalloc.c)2
-rw-r--r--kernel/arch/x86/kernel/multiboot.c (renamed from arch/i386/kernel/multiboot.c)0
-rw-r--r--kernel/arch/x86/kernel/paging.c (renamed from arch/i386/kernel/paging.c)0
-rw-r--r--kernel/arch/x86/kernel/pic.c (renamed from arch/i386/kernel/pic.c)0
-rw-r--r--kernel/arch/x86/kernel/pmem.c (renamed from arch/i386/kernel/pmem.c)21
-rw-r--r--kernel/arch/x86/kernel/serial.c (renamed from arch/i386/kernel/serial.c)0
-rw-r--r--kernel/arch/x86/kernel/syscall.c (renamed from arch/i386/kernel/syscall.c)4
-rw-r--r--kernel/arch/x86/kernel/timer.c (renamed from arch/i386/kernel/timer.c)5
-rw-r--r--kernel/core/interrupt.c (renamed from kernel/interrupt.c)1
-rw-r--r--kernel/core/panic.c (renamed from kernel/panic.c)7
-rw-r--r--kernel/core/sched.c (renamed from kernel/sched.c)0
-rw-r--r--kernel/drivers/input/keyboard.c (renamed from drivers/input/keyboard.c)0
-rw-r--r--kernel/drivers/video/framebuffer.c (renamed from drivers/video/framebuffer.c)0
-rw-r--r--kernel/init.c35
-rw-r--r--kernel/libk/io.c (renamed from libk/io.c)0
-rw-r--r--kernel/libk/string.c (renamed from libk/string.c)0
-rw-r--r--lib/Makefile16
-rw-r--r--libk/stack_protector.c9
-rw-r--r--sbin/Makefile17
-rw-r--r--usr.bin/Makefile17
-rw-r--r--usr.sbin/Makefile17
64 files changed, 226 insertions, 1024 deletions
diff --git a/.gitignore b/.gitignore
index a9a564b..dbc549a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
# Normal rules
.*
*.a
-*.bin
*.bz2
*.c.*
*.d
@@ -21,14 +20,40 @@
*.xz
*.zst
-# Top-level files
-/vmbox
-/a.img
-/bochsrc
-/debug.log
+# Built exec's
+bin/cat/cat
+bin/chmod/chmod
+bin/chown/chown
+bin/cp/cp
+bin/date/date
+bin/echo/echo
+bin/kill/kill
+bin/login/login
+bin/ls/ls
+bin/man/man
+bin/mv/mv
+bin/ps/ps
+bin/pwd/pwd
+bin/sh/sh
+bin/su/su
+bin/touch/touch
+kernel/vmbox
+sbin/init/init
+sbin/mknod/mknod
+sbin/mount/mount
+sbin/nologin/nologin
+sbin/shutdown/shutdown
+sbin/umount/umount
+usr.sbin/bxpkg/bxpkg
+usr.sbin/cron/cron
+usr.sbin/gfdisk/gfdisk
+usr.sbin/mkfs.fat/mkfs.fat
+usr.sbin/useradd/useradd
+usr.sbin/usermod/usermod
-# Image generation files
-/img/
+# Built libs
+lib/libc/libc.so
+lib/libm/libm.so
# Don't ignore these!
!.gitattributes
diff --git a/Makefile b/Makefile
index 5525936..50d1fc5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,110 +1,30 @@
-INCLUDE?=-Iinclude
-CFLAGS?=-O0 -ffreestanding -std=gnu11
-LDFLAGS?=-nostdlib
-LIBS?=-lgcc
-ARCH?=i386
+ARCH?=x86
+DESTDIR?=base-system
+PREFIX?=/usr
# -- Do not edit below this line --
-CC:=i686-elf-gcc
VERSION:="$(shell git describe --abbrev=4 --dirty --always --tags)"
-INCLUDE:=$(INCLUDE)
-CFLAGS:=$(CFLAGS) -Wall -Wextra -DVERSION=\"$(VERSION)\" -ggdb -fstack-protector-all
-LDFLAGS:=$(LDFLAGS)
-LIBS:=$(LIBS)
ARCH:=$(ARCH)
+DESTDIR:=base-system/
+PREFIX:=/usr/
+export ARCH VERSION PREFIX
-ARCHDIR=arch/$(ARCH)
+SUBDIRS:=kernel \
+ bin \
+ lib \
+ sbin \
+ usr.sbin \
-include $(ARCHDIR)/make.config
+.PHONY: all clean install install-headers $(SUBDIRS)
-CFLAGS:=$(CFLAGS) $(KERNEL_ARCH_CFLAGS)
-LDFLAGS:=$(LDFLAGS) $(KERNEL_ARCH_LDFLAGS)
-LIBS:=$(LIBS) $(KERNEL_ARCH_LIBS)
+all: $(SUBDIRS)
-KERNEL=vmbox
+subdirs: $(SUBDIRS)
-LIBK_OBJS=libk/string.o \
- libk/io.o \
- libk/stack_protector.o \
- libk/ubsan.o \
+$(SUBDIRS):
+ $(MAKE) $(MAKECMDGOALS) -C $@
-KERNEL_OBJS=$(KERNEL_ARCH_OBJS) \
- kernel/init.o \
- kernel/panic.o \
- kernel/vfs.o \
- kernel/sched.o \
- kernel/kthread.o \
+clean: $(SUBDIRS)
-DRIVER_OBJS=drivers/video/framebuffer.o \
- drivers/input/keyboard.o \
- drivers/pci/pci.o \
- drivers/pci/ide.o \
- drivers/tty/tty_vga.o \
-
-OBJS=$(ARCHDIR)/boot/crti.o \
- $(ARCHDIR)/crtbegin.o \
- $(KERNEL_OBJS) \
- $(DRIVER_OBJS) \
- $(LIBK_OBJS) \
- $(ARCHDIR)/crtend.o \
- $(ARCHDIR)/boot/crtn.o \
-
-LINK_LIST=$(LDFLAGS) \
- $(KERNEL_OBJS) \
- $(DRIVER_OBJS) \
- $(LIBK_OBJS) \
- $(LIBS) \
-
-.PHONY: all clean install install-headers install-kernel
-.SUFFIXES: .o .c .s
-
-all: $(KERNEL)
-
-$(KERNEL): $(OBJS) $(ARCHDIR)/linker.ld
- @$(CC) -T $(ARCHDIR)/linker.ld -o $@ $(LINK_LIST)
- @echo [LD] $@
-
-$(ARCHDIR)/crtbegin.o $(ARCHDIR)/crtend.o:
- @OBJ=`$(CC) $(CFLAGS) $(LDFLAGS) -print-file-name=$(@F)` && cp "$$OBJ" $@
-
-.c.o:
- @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE)
- @echo [CC] $@
-
-.s.o:
- @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE)
- @echo [AS] $@
-
-clean:
- $(RM) $(KERNEL)
- $(RM) $(OBJS) *.o */*.o */*/*.o
- $(RM) $(OBJS:.o=.d) *.d */*.d */*/*.d
-
-install: install-headers install-kernel
-
-install-headers:
- mkdir -p $(DESTDIR)$(INCLUDEDIR)
- cp -R --preserve-timestamps include/. $(DESTDIR)$(INCLUDEDIR)/.
-
-install-kernel: $(KERNEL)
- mkdir -p $(DESTDIR)$(BOOTDIR)
- cp $(KERNEL) $(DESTDIR)$(BOOTDIR)
-
-install-disk: $(KERNEL)
- rm a.img
- bximage -q -func=create -fd=1.44M a.img
- mkdosfs a.img
- syslinux -i a.img
- mcopy -i a.img img/libcom32.c32 ::libcom32.c32
- mcopy -i a.img img/mboot.c32 ::mboot.c32
- mcopy -i a.img img/syslinux.cfg ::syslinux.cfg
- mcopy -i a.img vmbox ::vmbox
-
-run: $(KERNEL)
- qemu-system-i386 -kernel $(KERNEL) -serial stdio -m 1G -drive file=a.img,format=raw -append "root=/dev/sda init=/bin/sh"
-
-debug: $(KERNEL)
- qemu-system-i386 -kernel $(KERNEL) -s -S -m 1G -drive file=a.img,format=raw -append "root=/dev/sda init=/bin/sh" &
-
--include $(OBJS:.o=.d)
+install: $(SUBDIRS)
diff --git a/arch/i386/boot/boot.s b/arch/i386/boot/boot.s
deleted file mode 100644
index 5357910..0000000
--- a/arch/i386/boot/boot.s
+++ /dev/null
@@ -1,149 +0,0 @@
-.set ALIGN, 1<<0
-.set MEMINFO, 1<<1
-.set FLAGS, ALIGN | MEMINFO
-.set MAGIC, 0x1BADB002
-.set CHECKSUM, -(MAGIC + FLAGS)
-
-.section .multiboot.data, "aw"
-.align 4
-.long MAGIC
-.long FLAGS
-.long CHECKSUM
-
-.section .bootstrap_stack, "aw", @nobits
-stack_bottom:
-.skip 16384
-stack_top:
-
-.section .bss, "aw", @nobits
- .align 4096
-boot_page_directory:
- .skip 4096
-boot_page_table0:
- .skip 4096
-boot_page_table1:
- .skip 4096
-
-.section .multiboot.text, "a"
-.global _start
-.type _start, @function
-_start:
- movl $(boot_page_table0 - 0xC0000000), %edi
- movl $0, %esi
- movl $1023, %ecx
-
-1: cmpl $_kernel_start, %esi
- jl 2f
- cmpl $(_kernel_end - 0xC0000000), %esi
- jge 3f
-
- movl %esi, %edx
- orl $0x003, %edx
- movl %edx, (%edi)
-
-2: addl $4096, %esi
- addl $4, %edi
- loop 1b
-
-
-3: movl $boot_page_directory, %ecx
- subl $0xC0000000, %ecx
- orl $0x003, %ecx
- movl %ecx, boot_page_directory - 0xC0000000 + 1023 * 4
-
- movl $boot_page_table0, %ecx
- subl $0xC0000000, %ecx
- orl $0x003, %ecx
- movl %ecx, boot_page_directory - 0xC0000000
- movl %ecx, boot_page_directory - 0xC0000000 + 768 * 4
-
- movl $boot_page_table1, %ecx
- subl $0xC0000000, %ecx
- orl $0x003, %ecx
- movl %ecx, boot_page_directory - 0xC0000000 + 1022 * 4
-
- movl $boot_page_directory, %ecx
- subl $0xC0000000, %ecx
- movl %ecx, %cr3
-
- movl %cr0, %ecx
- orl $0x80000000, %ecx
- movl %ecx, %cr0
-
- lea 4f, %ecx
- jmp *%ecx
-
-.section .text
-
-4: movl $stack_top, %esp
- and $-16, %esp
-
- call setup_stack_guard
-
- xorl %ebp, %ebp
- pushl %ebx
- pushl %eax
- call i386_entry
-
- cli
-1: hlt
- jmp 1b
-
-.global setup_stack_guard
-.type setup_stack_guard, @function
-setup_stack_guard:
- pushl %eax
- pushl %ebx
- pushl %ecx
-
- movl $1, %eax
- movl $0, %ecx
- cpuid
- shrl $30, %ecx
- andl $1, %ecx
- jnz start_loop
- jmp fail
-start_loop:
- rdrand %eax
- jc done
- loop start_loop
-fail:
- movl $-1, %eax
-done:
- movl %eax, __stack_chk_guard
- popl %ecx
- popl %ebx
- popl %eax
- ret
-
-.global enable_paging
-.type enable_paging, @function
-enable_paging:
- pushl %ebp
- movl %esp, %ebp
-
- movl 8(%esp), %eax
- movl %eax, %cr3
-
- movl %cr0, %eax
- orl $0x80000001, %eax
- movl %eax, %cr0
-
- movl $0, %eax
- popl %ebp
- ret
-
-.global flush_gdt
-.type flush_gdt, @function
-flush_gdt:
- cli
- lgdt (gp)
- movw $0x10, %ax
- movw %ax, %ds
- movw %ax, %es
- movw %ax, %fs
- movw %ax, %gs
- movw %ax, %ss
- jmp $0x08, $.flush
-.flush:
- ret
diff --git a/arch/i386/boot/crti.s b/arch/i386/boot/crti.s
deleted file mode 100644
index 8386b77..0000000
--- a/arch/i386/boot/crti.s
+++ /dev/null
@@ -1,15 +0,0 @@
-.section .init
-
-.global _init
-.type _init, @function
-_init:
- pushl %ebp
- movl %esp, %ebp
-
-.section .fini
-
-.global _fini
-.type _fini, @function
-_fini:
- pushl %ebp
- movl %esp, %ebp
diff --git a/arch/i386/boot/crtn.s b/arch/i386/boot/crtn.s
deleted file mode 100644
index 447afb1..0000000
--- a/arch/i386/boot/crtn.s
+++ /dev/null
@@ -1,7 +0,0 @@
-.section .init
- popl %ebp
- ret
-
-.section .fini
- popl %ebp
- ret
diff --git a/arch/i386/include/kernel/multiboot.h b/arch/i386/include/kernel/multiboot.h
deleted file mode 100644
index abbd8a9..0000000
--- a/arch/i386/include/kernel/multiboot.h
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef I386_MULTIBOOT_H
-#define I386_MULTIBOOT_H
-
-#include <stdint.h>
-
-#define MBOOT_HEADER_MAGIC 0x1BADB002
-#define MBOOT_LOADER_MAGIC 0x2BADB002
-
-// Multiboot flags
-#define MBOOT_INFO_MMAP 0x00000001
-#define MBOOT_INFO_BOOTDEV 0x00000002
-#define MBOOT_INFO_CMDLINE 0x00000004
-#define MBOOT_INFO_MODS 0x00000008
-#define MBOOT_INFO_AOUT_SYMS 0x00000010
-#define MBOOT_INFO_ELF_HEADER 0x00000020
-#define MBOOT_INFO_MEM_MAP 0x00000040
-#define MBOOT_INFO_DRIVE_INFO 0x00000080
-#define MBOOT_INFO_CONFIG_TBL 0x00000100
-#define MBOOT_INFO_BL_NAME 0x00000200
-#define MBOOT_INFO_APM_TBL 0x00000400
-#define MBOOT_INFO_VBE 0x00000800
-#define MBOOT_INFO_FRAMEBUFFER 0x00001000
-
-// Memory types
-#define MBOOT_MEM_AVAILABLE 1
-#define MBOOT_MEM_RESERVED 2
-#define MBOOT_MEM_ACPI_REC 3
-#define MBOOT_MEM_NVS 4
-#define MBOOT_MEM_BADRAM 5
-
-struct aout_symbol_table {
- uint32_t tabsize;
- uint32_t strsize;
- uint32_t addr;
- uint32_t reserved;
-};
-
-struct elf_section_header {
- uint32_t num;
- uint32_t size;
- uint32_t addr;
- uint32_t shndx;
-};
-
-struct mboot_header {
- uint32_t magic;
- uint32_t flags;
- uint32_t checksum;
- uint32_t header_addr;
- uint32_t load_addr;
- uint32_t load_end_addr;
- uint32_t bss_end_addr;
- uint32_t entry_addr;
- uint32_t mode_type;
- uint32_t width;
- uint32_t height;
- uint32_t depth;
-};
-
-struct mboot_info {
- uint32_t flags;
- uint32_t mem_lower;
- uint32_t mem_upper;
- uint32_t boot_device;
- uint32_t cmdline;
- uint32_t mods_count;
- uint32_t mods_addr;
- union {
- struct aout_symbol_table aout_sym;
- struct elf_section_header elf_sec;
- } u;
- uint32_t mmap_length;
- uint32_t mmap_addr;
- uint32_t drives_length;
- uint32_t drives_addr;
- uint32_t config_table;
- uint32_t boot_loader_name;
- uint32_t apm_table;
- uint32_t vbe_control_info;
- uint32_t vbe_mode_info;
- uint16_t vbe_mode;
- uint16_t vbe_interface_seg;
- uint16_t vbe_interface_off;
- uint16_t vbe_interface_len;
- uint64_t framebuffer_addr;
- uint32_t framebuffer_pitch;
- uint32_t framebuffer_width;
- uint32_t framebuffer_height;
- uint8_t framebuffer_bpp;
- uint8_t framebuffer_type;
-};
-
-struct mboot_mmap_entry {
- uint32_t size;
- uint32_t addr_low;
- uint32_t addr_high;
- uint32_t len_low;
- uint32_t len_high;
- uint32_t type;
-} __attribute__((packed));
-
-#endif
diff --git a/arch/i386/kernel/isr.s b/arch/i386/kernel/isr.s
deleted file mode 100644
index 55db35e..0000000
--- a/arch/i386/kernel/isr.s
+++ /dev/null
@@ -1,129 +0,0 @@
-.section .text
-
-.macro isr_err_stub num
-.global isr_stub_\num
-.type isr_stub_\num, @function
-isr_stub_\num:
- cli
- pushl $\num
- jmp isr_frame_asm
-.endm
-.macro isr_no_err_stub num
-.global isr_stub_\num
-.type isr_stub_\num, @function
-isr_stub_\num:
- cli
- pushl $0
- pushl $\num
- jmp isr_frame_asm
-.endm
-
-.macro irq_stub num
-.global irq_stub_\num
-.type irq_stub_\num, @function
-irq_stub_\num:
- cli
- pushl $0
- pushl $\num+32
- jmp isr_frame_asm
-.endm
-
-.global syscall_stub
-syscall_stub:
- cli
- pushl $0
- pushl $0x80
- jmp isr_frame_asm
-
-isr_frame_asm:
- pushl %eax
- pushl %ebx
- pushl %ecx
- pushl %edx
- pushl %esi
- pushl %edi
-
- movl %cr0, %eax
- pushl %eax
- movl %cr2, %eax
- pushl %eax
- movl %cr3, %eax
- pushl %eax
- movl %cr4, %eax
- pushl %eax
-
- pushl %esp
- call set_kernel_esp
- addl $4, %esp
-
- cld
- call interrupt_handler
-
- popl %eax
- movl %eax, %cr4
- popl %eax
- movl %eax, %cr3
- popl %eax
- movl %eax, %cr2
- popl %eax
- movl %eax, %cr0
-
- popl %edi
- popl %esi
- popl %edx
- popl %ecx
- popl %ebx
- popl %eax
- addl $8, %esp
-
- iret
-
-isr_no_err_stub 0
-isr_no_err_stub 1
-isr_no_err_stub 2
-isr_no_err_stub 3
-isr_no_err_stub 4
-isr_no_err_stub 5
-isr_no_err_stub 6
-isr_no_err_stub 7
-isr_err_stub 8
-isr_no_err_stub 9
-isr_err_stub 10
-isr_err_stub 11
-isr_err_stub 12
-isr_err_stub 13
-isr_err_stub 14
-isr_no_err_stub 15
-isr_no_err_stub 16
-isr_err_stub 17
-isr_no_err_stub 18
-isr_no_err_stub 19
-isr_no_err_stub 20
-isr_err_stub 21
-isr_no_err_stub 22
-isr_no_err_stub 23
-isr_no_err_stub 24
-isr_no_err_stub 25
-isr_no_err_stub 26
-isr_no_err_stub 27
-isr_no_err_stub 28
-isr_err_stub 29
-isr_err_stub 30
-isr_no_err_stub 31
-
-irq_stub 0
-irq_stub 1
-irq_stub 2
-irq_stub 3
-irq_stub 4
-irq_stub 5
-irq_stub 6
-irq_stub 7
-irq_stub 8
-irq_stub 9
-irq_stub 10
-irq_stub 11
-irq_stub 12
-irq_stub 13
-irq_stub 14
-irq_stub 15
diff --git a/arch/i386/kernel/jump_userspace.s b/arch/i386/kernel/jump_userspace.s
deleted file mode 100644
index add144a..0000000
--- a/arch/i386/kernel/jump_userspace.s
+++ /dev/null
@@ -1,21 +0,0 @@
-.global jump_userspace
-.type jump_userspace, @function
-jump_userspace:
- movw $0x23, %ax
- movw %ax, %ds
- movw %ax, %es
- movw %ax, %fs
- movw %ax, %gs
-
- movl %esp, %eax
- pushl $0x23
- pushl %eax
- pushf
- push $0x1B
- pushl $start_init
-
- pushl %esp
- call set_kernel_esp
- addl $4, %esp
-
- iret
diff --git a/arch/i386/kernel/spinlock.s b/arch/i386/kernel/spinlock.s
deleted file mode 100644
index c8235ca..0000000
--- a/arch/i386/kernel/spinlock.s
+++ /dev/null
@@ -1,30 +0,0 @@
-.section .text
-
-.global aquire_lock
-.type aquire_lock, @function
-aquire_lock:
- pushl %ebp
- movl %esp, %ebp
-locked:
- movl 8(%esp), %eax
- lock incl (%eax)
- jc spin_wait
-
- popl %ebp
- ret
-spin_wait:
- test %eax, 1
- jnz spin_wait
- jmp locked
-
-.global release_lock
-.type release_lock, @function
-release_lock:
- pushl %ebp
- movl %esp, %ebp
-
- movl 8(%ebp), %eax
- lock decl (%eax)
-
- popl %ebp
- ret
diff --git a/arch/i386/kernel/stack_trace.s b/arch/i386/kernel/stack_trace.s
deleted file mode 100644
index fbd77ed..0000000
--- a/arch/i386/kernel/stack_trace.s
+++ /dev/null
@@ -1,31 +0,0 @@
-.section .text
-
-.global walk_stack
-.type walk_stack, @function
-walk_stack:
- pushl %ebp
- movl %esp, %ebp
-
- pushl %edi
- movl -4(%ebp), %edi
- pushl %ebx
- movl -8(%ebp), %ebx
-
- xorl %eax, %eax
- movl 8(%esp), %ebx
- movl 16(%esp), %edi
- movl 20(%esp), %ecx
-walk:
- testl %ebx, %ebx
- jz done
- movl 4(%ebx), %edx
- movl 0(%ebx), %ebx
- movl %edx, (%edi)
- addl $4, %edi
- inc %eax
- loop walk
-done:
- popl %ebx
- popl %edi
- popl %ebp
- ret
diff --git a/arch/i386/kernel/switch_thread.s b/arch/i386/kernel/switch_thread.s
deleted file mode 100644
index f1168d5..0000000
--- a/arch/i386/kernel/switch_thread.s
+++ /dev/null
@@ -1,28 +0,0 @@
-.global switch_thread
-.type switch_thread, @function
-switch_thread:
- pushl %ebp
- movl %esp, %ebp
-
- pushl %ebx
- pushl %esi
- pushl %edi
- pushl %ebp
-
- movl 8(%ebp), %esi
- movl 12(%ebp), %edi
-
- movl %esp, (%edi);
- movl %cr3, %ecx
- movl %ecx, 4(%edi)
-
- movl (%esi), %esp
- movl 4(%esi), %ecx
- movl %ecx, %cr3
-
- popl %ebp
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
- ret
diff --git a/arch/i386/linker.ld b/arch/i386/linker.ld
deleted file mode 100644
index 734310f..0000000
--- a/arch/i386/linker.ld
+++ /dev/null
@@ -1,30 +0,0 @@
-ENTRY(_start)
-
-SECTIONS {
- . = 0x00100000;
- _kernel_start = .;
- .multiboot.data : {
- *(.multiboot.data)
- }
- .multiboot.text : {
- *(.multiboot.text)
- }
-
- . += 0xC0000000;
- .text ALIGN(4K) : AT(ADDR(.text) - 0xC0000000) {
- *(.text)
- }
- .rodata ALIGN(4K) : AT(ADDR(.rodata) - 0xC0000000) {
- *(.rodata)
- }
- .data ALIGN(4K) : AT(ADDR(.data) - 0xC0000000) {
- *(.data)
- }
- .bss ALIGN(4K) : AT(ADDR(.bss) - 0xC0000000) {
- *(COMMON)
- *(.bss)
- *(.bootstrap_stack)
- }
-
- _kernel_end = .;
-}
diff --git a/arch/i386/make.config b/arch/i386/make.config
deleted file mode 100644
index 557f01a..0000000
--- a/arch/i386/make.config
+++ /dev/null
@@ -1,20 +0,0 @@
-KERNEL_ARCH_INCLUDE=$(ARCHDIR)/include
-KERNEL_ARCH_CFLAGS=-I$(KERNEL_ARCH_INCLUDE)
-KERNEL_ARCH_LDFLAGS=
-KERNEL_ARCH_LIBS=
-
-KERNEL_ARCH_OBJS=$(ARCHDIR)/boot/boot.o \
- $(ARCHDIR)/kernel/idt.o \
- $(ARCHDIR)/kernel/gdt.o \
- $(ARCHDIR)/kernel/isr.o \
- $(ARCHDIR)/kernel/stack_trace.o \
- $(ARCHDIR)/kernel/multiboot.o \
- $(ARCHDIR)/kernel/serial.o \
- $(ARCHDIR)/kernel/pic.o \
- $(ARCHDIR)/kernel/timer.o \
- $(ARCHDIR)/kernel/spinlock.o \
- $(ARCHDIR)/kernel/syscall.o \
- $(ARCHDIR)/kernel/paging.o \
- $(ARCHDIR)/kernel/pmem.o \
- $(ARCHDIR)/kernel/kmalloc.o \
- $(ARCHDIR)/kernel/switch_thread.o \
diff --git a/bin/Makefile b/bin/Makefile
new file mode 100644
index 0000000..e23bd68
--- /dev/null
+++ b/bin/Makefile
@@ -0,0 +1,18 @@
+SUBDIRS:=cat \
+ echo \
+ login \
+
+export ARCH VERSION PREFIX
+
+.PHONY: all clean $(SUBDIRS)
+
+all: $(SUBDIRS)
+
+subdirs: $(SUBDIRS)
+
+$(SUBDIRS):
+ $(MAKE) $(MAKECMDGOALS) -C $@
+
+clean: $(SUBDIRS)
+
+install: $(SUBDIRS)
diff --git a/etc/fstab b/etc/fstab
new file mode 100644
index 0000000..5dc3ee1
--- /dev/null
+++ b/etc/fstab
@@ -0,0 +1,4 @@
+# Static information about the filesystems.
+# See fstab(5) for details.
+
+# <file sysetm> <dir> <type> <options> <dump> <pass>
diff --git a/etc/group b/etc/group
new file mode 100644
index 0000000..bb0d851
--- /dev/null
+++ b/etc/group
@@ -0,0 +1,18 @@
+root:x:0:root
+bin:x:1:root,bin,daemon
+daemon:x:2:root,bin,daemon
+disk:x:3:root
+adm:x:4:root,daemon
+tty:x:5:root
+mem:x:6:
+kmem:x:7:
+wheel:x:8:root
+log:x:9:root
+proc:x:10:root
+audio:x:11:
+video:x:11:
+network:x:12:
+power:x:13:
+sudo:x:14:root
+users:x:100:
+nobody:x:65534:
diff --git a/etc/passwd b/etc/passwd
new file mode 100644
index 0000000..c814925
--- /dev/null
+++ b/etc/passwd
@@ -0,0 +1,4 @@
+root:x:0:0:Super User:/root:/bin/sh
+bin:x:1:1::/:/sbin/nologin
+daemon:x:2:2::/:/sbin/nologin
+nobody:x:65534:99:Nobody:/:/sbin/nologin
diff --git a/etc/shadow b/etc/shadow
new file mode 100644
index 0000000..fd36873
--- /dev/null
+++ b/etc/shadow
@@ -0,0 +1,4 @@
+root::0:::::::
+bin:!:0:::::::
+daemon:!:0:::::::
+nobody:!:0:::::::
diff --git a/etc/shells b/etc/shells
new file mode 100644
index 0000000..b357b99
--- /dev/null
+++ b/etc/shells
@@ -0,0 +1,4 @@
+# List of valid login shells
+# See shells(5) for details.
+
+/bin/sh
diff --git a/include/kernel/input/keyboard.h b/include/kernel/input/keyboard.h
deleted file mode 100644
index a0d1470..0000000
--- a/include/kernel/input/keyboard.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef KERNEL_KEYBOARD_H
-#define KERNEL_KEYBOARD_H
-
-#include <kernel/asm.h>
-
-#define KB_STAT 0x64
-#define KB_DATA 0x60
-
-#define KB_DIB 0x01
-#define KB_SHIFT (1<<0)
-#define KB_CTL (1<<1)
-#define KB_ALT (1<<2)
-#define KB_CPSLK (1<<3)
-#define KB_NUMLK (1<<4)
-#define KB_SCLLK (1<<5)
-#define KB_E0ESC (1<<6)
-
-#define KB_HOME 0xE0
-#define KB_END 0xE1
-#define KB_UP 0xE2
-#define KB_DOWN 0xE3
-#define KB_LEFT 0xE4
-#define KB_RGHT 0xE5
-#define KB_PGUP 0xE6
-#define KB_PGDN 0xE7
-#define KB_INS 0xE8
-#define KB_DEL 0xE9
-
-char keyboard_getchar(void);
-void keyboard_handler(struct isr_frame *frame);
-
-#endif
diff --git a/include/kernel/interrupt.h b/include/kernel/interrupt.h
deleted file mode 100644
index b707fe7..0000000
--- a/include/kernel/interrupt.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef KERNEL_INTERRUPT_H
-#define KERNEL_INTERRUPT_H
-
-#include <kernel/asm.h>
-#include <stdint.h>
-#include <stddef.h>
-
-void register_isr_handler(unsigned int isr, void (*handler)(struct isr_frame *frame));
-void clear_isr_handler(unsigned int isr);
-
-void isr_dispatch(struct isr_frame frame);
-
-#endif
diff --git a/include/kernel/panic.h b/include/kernel/panic.h
deleted file mode 100644
index adfcd71..0000000
--- a/include/kernel/panic.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef KERNEL_PANIC_H
-#define KERNEL_PANIC_H
-
-#include <kernel/asm.h>
-#include <stdint.h>
-#include <stddef.h>
-
-void panic(const char *str);
-
-#endif
diff --git a/include/kernel/sched.h b/include/kernel/sched.h
deleted file mode 100644
index 00a5d95..0000000
--- a/include/kernel/sched.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef KERNEL_SCHED_H
-#define KERNEL_SCHED_H
-
-#include <kernel/asm.h>
-#include <kernel/kthread.h>
-#include <stdint.h>
-
-void sched_init(void);
-void schedule_next(void);
-void schedule_thread(struct kthread *thread);
-
-void block_thread(struct kthread *thread);
-void unblock_thread(struct kthread *thread);
-
-void sched_lock(void);
-void sched_unlock(void);
-
-void switch_thread(struct kthread *old, struct kthread *new);
-
-#endif
diff --git a/include/kernel/serial.h b/include/kernel/serial.h
deleted file mode 100644
index 4767722..0000000
--- a/include/kernel/serial.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef KERNEL_SERIAL_H
-#define KERNEL_SERIAL_H
-
-#include <stdint.h>
-#include <stddef.h>
-
-int serial_init(void);
-void serial_putchar(char c);
-char serial_getchar(void);
-
-static inline void serial_write(const char *data, size_t size) {
- for (size_t i = 0; i < size; i++)
- serial_putchar(data[i]);
-}
-
-static inline void serial_read(char *data, size_t size) {
- for (size_t i = 0; i < size; i++)
- data[i] = serial_getchar();
-}
-
-#endif
diff --git a/include/kernel/video/framebuffer.h b/include/kernel/video/framebuffer.h
deleted file mode 100644
index 500e71b..0000000
--- a/include/kernel/video/framebuffer.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef KERNEL_FRAMEBUFFER_H
-#define KERNEL_FRAMEBUFFER_H
-
-#include <stddef.h>
-#include <stdint.h>
-
-#define VGA_WIDTH 80
-#define VGA_HEIGHT 25
-
-static uint16_t *const VGA_MEMORY = (uint16_t*)0xC03FF000;
-
-void fb_init(void);
-void fb_setcolor(uint8_t color);
-void fb_putchar(char c);
-void fb_setpos(int x, int y);
-void fb_offsetpos(int dx, int dy);
-
-static inline void fb_write(const char *data, size_t size) {
- for (size_t i = 0; i < size; i++)
- fb_putchar(data[i]);
-}
-
-#endif
diff --git a/include/kernel/video/vga.h b/include/kernel/video/vga.h
deleted file mode 100644
index b639a3c..0000000
--- a/include/kernel/video/vga.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef KERNEL_VGA_H
-#define KERNEL_VGA_H
-
-#include <stdint.h>
-
-enum vga_color {
- VGA_COLOR_BLACK = 0,
- VGA_COLOR_BLUE = 1,
- VGA_COLOR_GREEN = 2,
- VGA_COLOR_CYAN = 3,
- VGA_COLOR_RED = 4,
- VGA_COLOR_MAGENTA = 5,
- VGA_COLOR_BROWN = 6,
- VGA_COLOR_LIGHT_GREY = 7,
- VGA_COLOR_DARK_GREY = 8,
- VGA_COLOR_LIGHT_BLUE = 9,
- VGA_COLOR_LIGHT_GREEN = 10,
- VGA_COLOR_LIGHT_CYAN = 11,
- VGA_COLOR_LIGHT_RED = 12,
- VGA_COLOR_LIGHT_MAGENTA = 13,
- VGA_COLOR_LIGHT_BROWN = 14,
- VGA_COLOR_LIGHT_WHITE = 15,
-};
-
-static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) {
- return fg | bg << 4;
-}
-
-static inline uint16_t vga_entry(unsigned char uc, uint8_t color) {
- return (uint16_t)uc | (uint16_t)color << 8;
-}
-
-#endif
diff --git a/include/libk/container_of.h b/include/libk/container_of.h
deleted file mode 100644
index fdc400c..0000000
--- a/include/libk/container_of.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef LIBK_CONTAINER_OF_H
-#define LIBK_CONTAINER_OF_H
-
-#ifndef container_of
-#define container_of(ptr, type, member) ({ \
- const typeof(((type*)0)->member)*__mptr = (ptr); \
- (type*)((char*)__mptr - offsetof(type, member)); })
-#endif
-
-#endif
diff --git a/include/libk/data/list.h b/include/libk/data/list.h
deleted file mode 100644
index 69eee3a..0000000
--- a/include/libk/data/list.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef LIBK_LIST_H
-#define LIBK_LIST_H
-
-#include <stddef.h>
-
-struct list_head {
- struct list_head *next;
- struct list_head *prev;
-};
-
-static inline void list_add(struct list_head *new, struct list_head *head) {
- struct list_head *temp = head;
- while (temp->next != NULL)
- temp = temp->next;
-
- temp->next = new;
- new->prev = temp;
- new->next = NULL;
-}
-
-static inline void list_del(struct list_head *item) {
- struct list_head *next = item->next;
- struct list_head *prev = item->prev;
- if (next != NULL)
- next->prev = prev;
- if (prev != NULL)
- prev->next = next;
- item->next = NULL;
- item->prev = NULL;
-}
-
-#endif
diff --git a/include/libk/data/ringbuf.h b/include/libk/data/ringbuf.h
deleted file mode 100644
index cc6d77b..0000000
--- a/include/libk/data/ringbuf.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef LIBK_RINGBUF_H
-#define LIBK_RINGBUF_H
-
-#include <kernel/kmalloc.h>
-#include <kernel/string.h>
-#include <stdint.h>
-
-struct ringbuf {
- void *buffer;
- void *buf_end;
- uint32_t capacity;
- uint32_t count;
- uint32_t size;
- void *head;
- void *tail;
-};
-
-static inline void rb_init(struct ringbuf *rb, uint32_t capacity, uint32_t size) {
- rb->buffer = kmalloc(capacity * size);
- rb->buf_end = (char*)rb->buffer + (capacity * size);
- rb->capacity = capacity;
- rb->size = size;
- rb->head = rb->buffer;
- rb->tail = rb->buffer;
-}
-
-static inline int rb_push_back(struct ringbuf *rb, const void *item, size_t size) {
- if (rb->count == rb->capacity)
- return -1;
- if (size > rb->size)
- return -1;
-
- void *tmp = rb->tail + rb->size;
- if (tmp > rb->head + rb->capacity * rb->size)
- rb->tail = rb->head;
- memcpy(rb->tail, item, size);
- rb->tail += rb->size;
- rb->count++;
- return 0;
-}
-
-static inline void rb_pop_front(struct ringbuf *rb, void *item) {
- memcpy(item, rb->tail, rb->size);
- rb->tail = (char*)rb->tail + rb->size;
- if (rb->tail == rb->buf_end)
- rb->tail = rb->buffer;
- rb->count--;
-}
-
-#endif
diff --git a/include/libk/io.h b/include/libk/io.h
deleted file mode 100644
index 72dc5d7..0000000
--- a/include/libk/io.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef LIBK_IO_H
-#define LIBK_IO_H
-
-#include <stdarg.h>
-
-char* convert(unsigned int num, int base);
-int vkprintf(const char *fmt, va_list args);
-int kprintf(const char *fmt, ...);
-
-#endif
diff --git a/include/libk/kmalloc.h b/include/libk/kmalloc.h
deleted file mode 100644
index 6573d28..0000000
--- a/include/libk/kmalloc.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef LIBK_KMALLOC_H
-#define LIBK_KMALLOC_H
-
-#include <stdint.h>
-#include <stddef.h>
-
-struct mem_block {
- void *start;
- size_t size;
- int alloc;
- struct mem_block *next;
- struct mem_block *prev;
-};
-
-void kmalloc_init(void);
-void* kmalloc(size_t sz);
-void kfree(void *ptr);
-
-#endif
diff --git a/include/libk/string.h b/include/libk/string.h
deleted file mode 100644
index 1fb4af1..0000000
--- a/include/libk/string.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef LIBK_STRING_H
-#define LIBK_STRING_H
-
-#include <stddef.h>
-
-int memcmp(const void *str1, const void *str2, size_t n);
-void* memcpy(void* __restrict dest, const void* __restrict src, size_t n);
-void* memmove(void* __restrict dest, const void* __restrict src, size_t n);
-void* memset(void *str, int c, size_t n);
-int strncmp(const char *str1, const char *str2, size_t n);
-int strcmp(const char *str1, const char *str2);
-size_t strlen(const char *str);
-char* strncpy(char* __restrict dest, const char* __restrict src, size_t n);
-char* strcpy(char* __restrict dest, const char* __restrict src);
-char* strncat(char* __restrict dest, const char* __restrict src, size_t n);
-char* strcat(char* __restrict dest, const char* __restrict src);
-char* strtok(char* __restrict str, const char* __restrict delim);
-
-#endif
diff --git a/arch/i386/include/kernel/asm.h b/kernel/arch/x86/include/kernel/asm.h
index cc570c5..18f53c4 100644
--- a/arch/i386/include/kernel/asm.h
+++ b/kernel/arch/x86/include/kernel/asm.h
@@ -3,6 +3,7 @@
#include <kernel/gdt.h>
#include <stdint.h>
+#include <cpuid.h>
#define PCI_CONFIG_ADDR 0xCF8
#define PCI_CONFIG_DATA 0xCFC
@@ -47,6 +48,12 @@ struct isr_frame {
uint32_t eflags;
} __attribute__((packed));
+struct cpuid_info {
+ char vendorID[12];
+ uint32_t feat_ecx;
+ uint32_t feat_edx;
+};
+
void isr_stub_0(void);
void isr_stub_1(void);
void isr_stub_2(void);
@@ -99,12 +106,14 @@ void irq_stub_15(void);
void isr_stub_128(void);
-void aquire_lock(int *lock);
-void release_lock(int *lock);
-
void enable_paging(uint32_t new_cr3);
+int cpuid_check(void);
void flush_gdt(void);
+static inline void cpuid(int code, uint32_t *ecx, uint32_t *ebx) {
+ __asm__ volatile("cpuid" : "=a"(*ecx), "=d"(*ebx) : "a"(code) : "ecx","ebx");
+}
+
static inline void outb(uint16_t port, uint8_t value) {
__asm__ volatile("outb %0, %1" : : "a"(value), "Nd"(port));
}
diff --git a/arch/i386/include/kernel/gdt.h b/kernel/arch/x86/include/kernel/gdt.h
index ec02719..aa05408 100644
--- a/arch/i386/include/kernel/gdt.h
+++ b/kernel/arch/x86/include/kernel/gdt.h
@@ -14,7 +14,7 @@ struct gdt_entry {
struct gdt_ptr {
uint16_t limit;
- uint32_t base;
+ uint64_t base;
} __attribute__((packed));
struct tss_entry {
diff --git a/arch/i386/include/kernel/idt.h b/kernel/arch/x86/include/kernel/idt.h
index 29ec39f..29ec39f 100644
--- a/arch/i386/include/kernel/idt.h
+++ b/kernel/arch/x86/include/kernel/idt.h
diff --git a/arch/i386/include/kernel/paging.h b/kernel/arch/x86/include/kernel/paging.h
index d8bb8f3..3a3c298 100644
--- a/arch/i386/include/kernel/paging.h
+++ b/kernel/arch/x86/include/kernel/paging.h
@@ -2,7 +2,6 @@
#define I386_PAGING_H
#include <kernel/asm.h>
-#include <kernel/multiboot.h>
#include <stdint.h>
#define PAGE_SIZE 4096
diff --git a/arch/i386/include/kernel/pic.h b/kernel/arch/x86/include/kernel/pic.h
index 187d553..187d553 100644
--- a/arch/i386/include/kernel/pic.h
+++ b/kernel/arch/x86/include/kernel/pic.h
diff --git a/arch/i386/include/kernel/pmem.h b/kernel/arch/x86/include/kernel/pmem.h
index e6e4f57..ea4fe29 100644
--- a/arch/i386/include/kernel/pmem.h
+++ b/kernel/arch/x86/include/kernel/pmem.h
@@ -1,7 +1,6 @@
#ifndef I386_PMEM_H
#define I386_PMEM_H
-#include <kernel/multiboot.h>
#include <stdint.h>
#include <stddef.h>
@@ -11,6 +10,9 @@ struct pfa_page {
void pfa_init(struct mboot_info *header);
+uintptr_t pfa_alloc_dma(size_t num_pages);
+uintptr_t pfa_alloc(size_t num_pages);
+
void pfa_free_dma(uintptr_t paddr, size_t num_pages);
void pfa_free(uintptr_t paddr, size_t num_pages);
diff --git a/arch/i386/include/kernel/syscall.h b/kernel/arch/x86/include/kernel/syscall.h
index a657527..a657527 100644
--- a/arch/i386/include/kernel/syscall.h
+++ b/kernel/arch/x86/include/kernel/syscall.h
diff --git a/arch/i386/include/kernel/timer.h b/kernel/arch/x86/include/kernel/timer.h
index c0b3a73..c0b3a73 100644
--- a/arch/i386/include/kernel/timer.h
+++ b/kernel/arch/x86/include/kernel/timer.h
diff --git a/arch/i386/include/kernel/vmem.h b/kernel/arch/x86/include/kernel/vmem.h
index 94aa32d..94aa32d 100644
--- a/arch/i386/include/kernel/vmem.h
+++ b/kernel/arch/x86/include/kernel/vmem.h
diff --git a/arch/i386/kernel/gdt.c b/kernel/arch/x86/kernel/gdt.c
index 0d9e1d2..57424aa 100644
--- a/arch/i386/kernel/gdt.c
+++ b/kernel/arch/x86/kernel/gdt.c
@@ -18,7 +18,7 @@ void gdt_set_gate(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_
}
void write_tss(int num, uint32_t ss0, uint32_t esp0) {
- uint32_t base = (uint32_t)&tss_entry;
+ uint64_t base = (uint64_t)&tss_entry;
uint32_t limit = base + sizeof(struct tss_entry);
gdt_set_gate(num, base, limit, 0x89, 0x00);
@@ -35,13 +35,9 @@ void write_tss(int num, uint32_t ss0, uint32_t esp0) {
tss_entry.iomap_base = sizeof(tss_entry);
}
-void set_kernel_esp(uint32_t esp) {
- tss_entry.esp0 = esp;
-}
-
void gdt_install(void) {
gp.limit = (sizeof(struct gdt_entry) * 6) - 1;
- gp.base = (uint32_t)&desc;
+ gp.base = (uint64_t)&desc;
gdt_set_gate(0, 0, 0, 0, 0);
gdt_set_gate(1, 0, 0xFFFFF, 0x9A, 0xCF);
@@ -49,9 +45,9 @@ void gdt_install(void) {
gdt_set_gate(3, 0, 0xFFFFF, 0xFA, 0xCF);
gdt_set_gate(4, 0, 0xFFFFF, 0xF2, 0xCF);
- uint32_t esp;
- __asm__ volatile("movl %%esp, %0" : "=r"(esp));
- write_tss(5, 0x10, esp);
+ uint64_t rsp;
+ __asm__ volatile("movq %%rsp, %0" : "=r"(rsp));
+ write_tss(5, 0x10, rsp);
flush_gdt();
flush_tss();
diff --git a/arch/i386/kernel/idt.c b/kernel/arch/x86/kernel/idt.c
index a178801..a178801 100644
--- a/arch/i386/kernel/idt.c
+++ b/kernel/arch/x86/kernel/idt.c
diff --git a/arch/i386/kernel/kmalloc.c b/kernel/arch/x86/kernel/kmalloc.c
index ea77428..9e5254c 100644
--- a/arch/i386/kernel/kmalloc.c
+++ b/kernel/arch/x86/kernel/kmalloc.c
@@ -56,6 +56,8 @@ void* kmalloc(size_t sz) {
}
void kfree(void *ptr) {
+ if (ptr == NULL)
+ return;
struct mem_block *temp = first;
while (temp != NULL) {
if (temp->start == (uintptr_t)ptr) {
diff --git a/arch/i386/kernel/multiboot.c b/kernel/arch/x86/kernel/multiboot.c
index dedf163..dedf163 100644
--- a/arch/i386/kernel/multiboot.c
+++ b/kernel/arch/x86/kernel/multiboot.c
diff --git a/arch/i386/kernel/paging.c b/kernel/arch/x86/kernel/paging.c
index a0bbb92..a0bbb92 100644
--- a/arch/i386/kernel/paging.c
+++ b/kernel/arch/x86/kernel/paging.c
diff --git a/arch/i386/kernel/pic.c b/kernel/arch/x86/kernel/pic.c
index 0d29473..0d29473 100644
--- a/arch/i386/kernel/pic.c
+++ b/kernel/arch/x86/kernel/pic.c
diff --git a/arch/i386/kernel/pmem.c b/kernel/arch/x86/kernel/pmem.c
index 40e3400..edf71d9 100644
--- a/arch/i386/kernel/pmem.c
+++ b/kernel/arch/x86/kernel/pmem.c
@@ -6,6 +6,7 @@
#include <libk/io.h>
#include <libk/string.h>
+static uintptr_t bitmap[5];
static struct pfa_page freelist;
void pfa_init(struct mboot_info *header) {
@@ -17,6 +18,9 @@ void pfa_init(struct mboot_info *header) {
}
}
+uintptr_t pfa_alloc_dma(size_t num_pages) {
+}
+
uintptr_t pfa_alloc(size_t num_pages) {
struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP;
map_page(freelist.next, PAGE_TMP_MAP, PD_PRES | PD_RW);
@@ -27,6 +31,23 @@ uintptr_t pfa_alloc(size_t num_pages) {
return ret;
}
+void pfa_free_dma(uintptr_t paddr, size_t num_pages) {
+ if (paddr % PAGE_SIZE != 0)
+ panic("Task attempted to free non-aligned memory");
+ if (paddr >= KSTART && paddr < KEND)
+ return;
+ if (paddr >= 0x00080000 && paddr < 0x00100000)
+ return;
+
+ int index = 0;
+ int bit = 0;
+ for (uintptr_t i = paddr; i < paddr + (num_pages * PAGE_SIZE); i += PAGE_SIZE) {
+ index = i / PAGE_SIZE / 32;
+ bit = i / PAGE_SIZE % 32;
+ bitmap[index] |= 1 << bit;
+ }
+}
+
void pfa_free(uintptr_t paddr, size_t num_pages) {
uintptr_t addr;
struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP;
diff --git a/arch/i386/kernel/serial.c b/kernel/arch/x86/kernel/serial.c
index dc2a8bd..dc2a8bd 100644
--- a/arch/i386/kernel/serial.c
+++ b/kernel/arch/x86/kernel/serial.c
diff --git a/arch/i386/kernel/syscall.c b/kernel/arch/x86/kernel/syscall.c
index 200af4f..1fa73e9 100644
--- a/arch/i386/kernel/syscall.c
+++ b/kernel/arch/x86/kernel/syscall.c
@@ -19,7 +19,7 @@ void handle_syscall(struct isr_frame *frame) {
sys_write(frame);
break;
default:
- panic("Invalid system call number");
+ kprintf("Invalid system call number %d\n", frame->eax);
+ break;
}
- return 0;
}
diff --git a/arch/i386/kernel/timer.c b/kernel/arch/x86/kernel/timer.c
index a7d88dd..bd57cc2 100644
--- a/arch/i386/kernel/timer.c
+++ b/kernel/arch/x86/kernel/timer.c
@@ -8,8 +8,9 @@ void timer_handler(struct isr_frame *frame) {
num_ticks++;
if (num_ticks == 3) {
num_ticks = 0;
- schedule_next();
+ //schedule_next();
}
+ pic_eoi(frame->isr_vector-32);
}
void timer_init(void) {
@@ -20,5 +21,5 @@ void timer_init(void) {
outb(0x40, divisor && 0xFF00 >> 8);
enable_ints();
- register_irq_handler(0, timer_handler);
+ //register_isr_handler(32, timer_handler);
}
diff --git a/kernel/interrupt.c b/kernel/core/interrupt.c
index 9639aea..6d9e69d 100644
--- a/kernel/interrupt.c
+++ b/kernel/core/interrupt.c
@@ -1,4 +1,5 @@
#include <kernel/interrupt.h>
+#include <kernel/panic.h>
#include <kernel/asm.h>
static void (*isr_handlers[MAX_ISR])(struct isr_frame *frame);
diff --git a/kernel/panic.c b/kernel/core/panic.c
index 65279f0..a44a73c 100644
--- a/kernel/panic.c
+++ b/kernel/core/panic.c
@@ -1,8 +1,10 @@
#include <kernel/panic.h>
+#include <kernel/spinlock.h>
#include <libk/io.h>
#include <stdint.h>
#include <stddef.h>
+static struct spinlock panic_lock = {0};
static int panicked = 0;
void walk_stack(uintptr_t *addrs, size_t n);
@@ -19,8 +21,11 @@ void stack_trace(void) {
}
void panic(const char *str) {
+ disable_ints();
+ spin_lock(&panic_lock);
panicked = 1;
- kprintf("KERNEL PANIC: %s\n", str);
+ spin_unlock(&panic_lock);
+ kprintf("KERNEL PANIC - NOT SYNCING: %s\n", str);
stack_trace();
while (1);
}
diff --git a/kernel/sched.c b/kernel/core/sched.c
index b6096da..b6096da 100644
--- a/kernel/sched.c
+++ b/kernel/core/sched.c
diff --git a/drivers/input/keyboard.c b/kernel/drivers/input/keyboard.c
index f2a8eba..f2a8eba 100644
--- a/drivers/input/keyboard.c
+++ b/kernel/drivers/input/keyboard.c
diff --git a/drivers/video/framebuffer.c b/kernel/drivers/video/framebuffer.c
index 3df3df4..3df3df4 100644
--- a/drivers/video/framebuffer.c
+++ b/kernel/drivers/video/framebuffer.c
diff --git a/kernel/init.c b/kernel/init.c
deleted file mode 100644
index d4a3638..0000000
--- a/kernel/init.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <libk/io.h>
-#include <libk/string.h>
-#include <libk/kmalloc.h>
-#include <kernel/sched.h>
-#include <kernel/kthread.h>
-#include <kernel/pci.h>
-#include <kernel/serial.h>
-
-void jump_userspace(void);
-
-char rootfs[1024];
-char init_bin[1024];
-int gdbstub = 0;
-
-void process_cmd(char *cmdline) {
- char *token = strtok(cmdline, " ");
- while (token != NULL) {
- if (strncmp(token, "root=", 5) == 0)
- strcpy(rootfs, &token[5]);
- if (strncmp(token, "init=", 5) == 0)
- strcpy(init_bin, &token[5]);
- if (strncmp(token, "gdb", 3) == 0)
- gdbstub = 1;
- token = strtok(NULL, " ");
- }
-}
-
-void kernel_main(char *cmdline) {
- kprintf("Box kernel version %s\n", VERSION);
- process_cmd(cmdline);
-
- serial_init();
- sched_init();
- //pci_check_buses();
-}
diff --git a/libk/io.c b/kernel/libk/io.c
index eedc171..eedc171 100644
--- a/libk/io.c
+++ b/kernel/libk/io.c
diff --git a/libk/string.c b/kernel/libk/string.c
index be59397..be59397 100644
--- a/libk/string.c
+++ b/kernel/libk/string.c
diff --git a/lib/Makefile b/lib/Makefile
new file mode 100644
index 0000000..c307643
--- /dev/null
+++ b/lib/Makefile
@@ -0,0 +1,16 @@
+SUBDIRS:=
+
+export ARCH VERSION PREFIX
+
+.PHONY: all clean $(SUBDIRS)
+
+all: $(SUBDIRS)
+
+subdirs: $(SUBDIRS)
+
+$(SUBDIRS):
+ $(MAKE) $(MAKECMDGOALS) -C $@
+
+clean: $(SUBDIRS)
+
+install: $(SUBDIRS)
diff --git a/libk/stack_protector.c b/libk/stack_protector.c
deleted file mode 100644
index a929ae0..0000000
--- a/libk/stack_protector.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <kernel/panic.h>
-#include <stdint.h>
-
-uintptr_t __stack_chk_guard;
-
-__attribute__((noreturn)) void __stack_chk_fail(void) {
- panic("Detected attempted stack manipulation in kernel");
- while(1);
-}
diff --git a/sbin/Makefile b/sbin/Makefile
new file mode 100644
index 0000000..73669f8
--- /dev/null
+++ b/sbin/Makefile
@@ -0,0 +1,17 @@
+SUBDIRS:=nologin \
+
+export VERSION PREFIX
+
+.PHONY: all clean $(SUBDIRS)
+
+all: $(SUBDIRS)
+
+subdirs: $(SUBDIRS)
+
+$(SUBDIRS):
+ $(MAKE) $(MAKECMDGOALS) -C $@
+
+clean: $(SUBDIRS)
+
+install: $(SUBDIRS)
+
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
new file mode 100644
index 0000000..62e125c
--- /dev/null
+++ b/usr.bin/Makefile
@@ -0,0 +1,17 @@
+SUBDIRS:=
+
+export ARCH VERSION PREFIX
+
+.PHONY: all clean $(SUBDIRS)
+
+all: $(SUBDIRS)
+
+subdirs: $(SUBDIRS)
+
+$(SUBDIRS):
+ $(MAKE) $(MAKECMDGOALS) -C $@
+
+clean: $(SUBDIRS)
+
+install: $(SUBDIRS)
+
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
new file mode 100644
index 0000000..c68d120
--- /dev/null
+++ b/usr.sbin/Makefile
@@ -0,0 +1,17 @@
+SUBDIRS:=bxpkg \
+ gfdisk \
+
+export ARCH VERSION PREFIX
+
+.PHONY: all clean $(SUBDIRS)
+
+all: $(SUBDIRS)
+
+subdirs: $(SUBDIRS)
+
+$(SUBDIRS):
+ $(MAKE) $(MAKECMDGOALS) -C $@
+
+clean: $(SUBDIRS)
+
+install: $(SUBDIRS)