diff options
-rw-r--r-- | .gitignore | 41 | ||||
-rw-r--r-- | Makefile | 116 | ||||
-rw-r--r-- | arch/i386/boot/boot.s | 149 | ||||
-rw-r--r-- | arch/i386/boot/crti.s | 15 | ||||
-rw-r--r-- | arch/i386/boot/crtn.s | 7 | ||||
-rw-r--r-- | arch/i386/include/kernel/multiboot.h | 102 | ||||
-rw-r--r-- | arch/i386/kernel/isr.s | 129 | ||||
-rw-r--r-- | arch/i386/kernel/jump_userspace.s | 21 | ||||
-rw-r--r-- | arch/i386/kernel/spinlock.s | 30 | ||||
-rw-r--r-- | arch/i386/kernel/stack_trace.s | 31 | ||||
-rw-r--r-- | arch/i386/kernel/switch_thread.s | 28 | ||||
-rw-r--r-- | arch/i386/linker.ld | 30 | ||||
-rw-r--r-- | arch/i386/make.config | 20 | ||||
-rw-r--r-- | bin/Makefile | 18 | ||||
-rw-r--r-- | etc/fstab | 4 | ||||
-rw-r--r-- | etc/group | 18 | ||||
-rw-r--r-- | etc/passwd | 4 | ||||
-rw-r--r-- | etc/shadow | 4 | ||||
-rw-r--r-- | etc/shells | 4 | ||||
-rw-r--r-- | include/kernel/input/keyboard.h | 32 | ||||
-rw-r--r-- | include/kernel/interrupt.h | 13 | ||||
-rw-r--r-- | include/kernel/panic.h | 10 | ||||
-rw-r--r-- | include/kernel/sched.h | 20 | ||||
-rw-r--r-- | include/kernel/serial.h | 21 | ||||
-rw-r--r-- | include/kernel/video/framebuffer.h | 23 | ||||
-rw-r--r-- | include/kernel/video/vga.h | 33 | ||||
-rw-r--r-- | include/libk/container_of.h | 10 | ||||
-rw-r--r-- | include/libk/data/list.h | 32 | ||||
-rw-r--r-- | include/libk/data/ringbuf.h | 50 | ||||
-rw-r--r-- | include/libk/io.h | 10 | ||||
-rw-r--r-- | include/libk/kmalloc.h | 19 | ||||
-rw-r--r-- | include/libk/string.h | 19 | ||||
-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.c | 35 | ||||
-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/Makefile | 16 | ||||
-rw-r--r-- | libk/stack_protector.c | 9 | ||||
-rw-r--r-- | sbin/Makefile | 17 | ||||
-rw-r--r-- | usr.bin/Makefile | 17 | ||||
-rw-r--r-- | usr.sbin/Makefile | 17 |
64 files changed, 226 insertions, 1024 deletions
@@ -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 @@ -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) |