From f7503e6c6fcb00086376499df3f292dc11f04e23 Mon Sep 17 00:00:00 2001 From: pjht Date: Sun, 28 Feb 2021 13:46:33 -0600 Subject: [PATCH] Stash pop --- Makefile | 21 ++++++++++++++--- init/main.c | 4 +++- kernel/Doxyfile | 2 +- kernel/cpu/i386/idt.c | 2 +- kernel/cpu/i386/isr.c | 34 +++++++++++++++++----------- kernel/cpu/i386/isr.h | 10 +++++--- kernel/cpu/i386/paging.c | 12 ++++++++++ kernel/cpu/i386/tasking_helpers.asm | 22 +++++++++++++++++- kernel/cpu/i386/tasking_helpers_c.c | 6 ++++- kernel/cpu/isr.h | 10 +++++--- kernel/cpu/tasking_helpers.h | 8 ++++++- kernel/kmalloc.c | 4 ++++ kernel/pmem.c | 2 ++ kernel/rpc.c | 2 +- kernel/tasking.c | 23 +++++++++++++------ kernel/tasking.h | 8 ++++--- kernel/timer/pit/timer.c | 2 +- libc/Doxyfile | 2 +- libc/sys/syscalls.h | 1 + tar_fs/tar_fs | Bin 35212 -> 37240 bytes vga_drv/vtconsole.c | 0 vga_drv/vtconsole.h | 0 22 files changed, 134 insertions(+), 41 deletions(-) mode change 100755 => 100644 vga_drv/vtconsole.c mode change 100755 => 100644 vga_drv/vtconsole.h diff --git a/Makefile b/Makefile index a4eaf96..a5b6534 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ AR = $(shell cat psinfo/$(PLAT)/ar.txt) NASM = $(shell cat psinfo/$(PLAT)/nasm.txt) EMU = $(shell cat psinfo/$(PLAT)/emu.txt) CFLAGS = -Isysroot/usr/include -Wextra -Wall -Wno-unused-parameter -g -ffreestanding -QFLAGS = -hda ext2.img -m 2G -boot d -cdrom os.iso -serial file:serout #-chardev socket,id=s1,port=3000,host=localhost -serial chardev:s1 +QFLAGS = -m 2G -boot d -cdrom os.iso -serial file:serout #-chardev socket,id=s1,port=3000,host=localhost -serial chardev:s1 CWD = $(shell pwd) .PHONY: sysroot @@ -31,19 +31,29 @@ run: os.iso @$(EMU) $(QFLAGS) & tail -f serout +run_nobuild: + rm -f serout + touch serout + @$(EMU) $(QFLAGS) & + tail -f serout + debug: os.iso kernel/kernel.elf @$(EMU) -s $(QFLAGS) & gdb #gdbgui -g i386-elf-gdb --project $(CWD) -os.iso: kernel/kernel.elf init vfs devfs vga_drv initrd_drv tar_fs pci sysroot/usr/share/man # vfs devfs initrd vga_drv initrd_drv pci +os.iso: kernel/kernel.elf init vfs devfs vga_drv initrd_drv tar_fs pci ps2 sysroot/usr/share/man # vfs devfs initrd vga_drv initrd_drv pci @cp kernel/kernel.elf sysroot/boot @cd initrd; tar -f ../sysroot/boot/initrd.tar -c * - @grub-mkrescue -o $@ sysroot >/dev/null 2>/dev/null + @grub-mkrescue -o $@ sysroot crts: kernel/crt0.o @cp $^ sysroot/usr/lib +ps2: crts libc + @cd $@ && make + @cp $@/$@ initrd/$@ + init: crts libc @cd $@ && make @cp $@/$@ initrd/$@ @@ -107,3 +117,8 @@ clean: doc: $(C_SOURCES) $(C_HEADERS) @doxygen kernel/Doxyfile > /dev/null @doxygen libc/Doxyfile > /dev/null + +install: + @echo Path to flash drive?; \ + read drive; \ + echo $$(drive); diff --git a/init/main.c b/init/main.c index 7508d47..ca5cb8d 100644 --- a/init/main.c +++ b/init/main.c @@ -123,5 +123,7 @@ int main() { serial_print("Could not open the VGA device file!\n"); exit(1); } - posix_spawn(NULL,"/initrd/pci",NULL,NULL,NULL,NULL); + posix_spawn(NULL,"/initrd/ps2",NULL,NULL,NULL,NULL); + // posix_spawn(NULL,"/initrd/pci",NULL,NULL,NULL,NULL); + for(;;); } diff --git a/kernel/Doxyfile b/kernel/Doxyfile index e321910..8ca373f 100644 --- a/kernel/Doxyfile +++ b/kernel/Doxyfile @@ -5,7 +5,7 @@ TYPEDEF_HIDES_STRUCT = YES EXTRACT_STATIC = YES WARN_NO_PARAMDOC = YES WARN_AS_ERROR = YES -INPUT = /Users/peterterpstra/Desktop/projects/os/kernel +INPUT = ./kernel RECURSIVE = YES EXCLUDE = kernel/cpu/x86_64 HTML_DYNAMIC_SECTIONS = YES diff --git a/kernel/cpu/i386/idt.c b/kernel/cpu/i386/idt.c index 2381d58..8fac479 100644 --- a/kernel/cpu/i386/idt.c +++ b/kernel/cpu/i386/idt.c @@ -34,7 +34,7 @@ typedef struct { #define IDT_ENTRIES 256 //!< Number of entries in the IDT -static idt_gate_t idt[IDT_ENTRIES]; //!< The IDT +idt_gate_t idt[IDT_ENTRIES] __attribute__((aligned(4096))); //!< The IDT static idt_register_t idt_reg; //!< The value to load into the IDTR #define LOW_16(address) (uint16_t)((address) & 0xFFFF) //!< Macro to get the low 16 bits of an address diff --git a/kernel/cpu/i386/isr.c b/kernel/cpu/i386/isr.c index 59ca89e..049e93f 100644 --- a/kernel/cpu/i386/isr.c +++ b/kernel/cpu/i386/isr.c @@ -6,7 +6,6 @@ #include "../../vga_err.h" #include "../../address_spaces.h" #include "../halt.h" -#include "../isr.h" #include "../paging.h" #include "../serial.h" //#include "../../rpc.h" @@ -20,8 +19,15 @@ #include #include -void irq_handler(registers_t* r); -static isr_t irq_handlers[16]; //!< Handlers for the PIC interrupts +/** + * Represents a registeted interrupt handler +*/ +typedef struct { + pid_t pid; //!< The PID thast registered the handler, or 0 if it it a kernel handler + void* handler; //!< The address of the handler +} isr_handler_info; + +static isr_handler_info irq_handlers[16]={0}; //!< Handlers for the PIC interrupts void isr_install() { idt_set_gate(0,(uint32_t)isr0); @@ -203,7 +209,7 @@ void isr_handler(registers_t* r) { case 80: switch (r->eax) { case SYSCALL_CREATEPROC: - tasking_create_task((void*)r->ebx,(void*)r->ecx,0,(void*)r->edx,(void*)r->esi,0); + tasking_create_task((void*)r->ebx,(void*)r->ecx,0,(void*)r->edx,(void*)r->esi,0,0); break; case SYSCALL_YIELD: tasking_yield(); @@ -259,7 +265,7 @@ void isr_handler(registers_t* r) { memcpy((char*)r->ebx,initrd,initrd_sz); break; case SYSCALL_NEW_THREAD: { - uint32_t tid=tasking_new_thread((void*)r->ebx,tasking_get_PID(),(void*)r->edx); + uint32_t tid=tasking_new_thread((void*)r->ebx,tasking_get_PID(),(void*)r->edx,0); if ((uint32_t*)r->ecx!=NULL) { *((uint32_t*)r->ecx)=tid; } @@ -289,7 +295,8 @@ void isr_handler(registers_t* r) { case SYSCALL_RPC_IS_INIT: r->ecx=kernel_rpc_is_init((pid_t)r->ebx); break; - default: + case SYSCALL_REGISTER_IRQ_HANDLER: + isr_register_handler((int)r->ebx,tasking_get_PID(),(void*)r->ecx); break; } break; @@ -298,11 +305,12 @@ void isr_handler(registers_t* r) { } -void isr_register_handler(int n,isr_t handler) { +void isr_register_handler(int n,pid_t pid,void* handler) { if (n>16) { return; } - irq_handlers[n] = handler; + irq_handlers[n].pid = pid; + irq_handlers[n].handler = handler; } /** @@ -315,12 +323,12 @@ void irq_handler(registers_t* r) { if (r->int_no >= 40) port_byte_out(0xA0,0x20); /* slave */ port_byte_out(0x20,0x20); /* master */ /* Handle the interrupt in a more modular way */ - if (irq_handlers[r->int_no-32] != NULL) { - isr_t handler = irq_handlers[r->int_no-32]; - if((uint32_t)handler<32768) { - kernel_rpc_call((pid_t)handler,"irq_handler",NULL,NULL); + if (irq_handlers[r->int_no-32].handler!=NULL) { + isr_handler_info info = irq_handlers[r->int_no-32]; + if(info.pid==0) { + ((isr_t)info.handler)(r); } else { - handler(r); + tasking_new_thread(info.handler,info.pid,(void*)(r->int_no-32),1); } } } diff --git a/kernel/cpu/i386/isr.h b/kernel/cpu/i386/isr.h index 8ef33c6..039acde 100644 --- a/kernel/cpu/i386/isr.h +++ b/kernel/cpu/i386/isr.h @@ -6,6 +6,7 @@ #define ISR_H #include +#include /** * Saved state of the CPU when an interrupt occurs @@ -38,9 +39,12 @@ void isr_install(); /** * Register an IRQ handler - * \param n the IRQ to register a handler for - * \param handler the handler to register + * + * If the PID is 0, the handler will be called directly, otherwise a thread will be made in the PID starting at the handler's address. + * \param n The IRQ to register a handler for + * \param pid The PID that will handle the interrupt. + * \param handler The address of the handler. */ -void isr_register_handler(int n,isr_t handler); +void isr_register_handler(int n,pid_t pid,void* handler); #endif diff --git a/kernel/cpu/i386/paging.c b/kernel/cpu/i386/paging.c index 0543e7b..d945714 100644 --- a/kernel/cpu/i386/paging.c +++ b/kernel/cpu/i386/paging.c @@ -190,6 +190,18 @@ void unmap_pages(void* start_virt,int num_pages,int free_phys) { } } +extern int idt; + +/** + * Makes the IDT readonly +*/ +void paging_readonly_idt() { + void* idt_addr=&idt; + void* idt_phys=virt_to_phys(idt_addr); + map_pages(idt_addr,idt_phys,1,0,0); + invl_page(idt_addr); +} + void paging_init() { for (size_t i=0;i +#include /** * Saved state of the CPU when an interrupt occurs @@ -38,9 +39,12 @@ void isr_install(); /** * Register an IRQ handler - * \param n the IRQ to register a handler for - * \param handler the handler to register + * + * If the PID is 0, the handler will be called directly, otherwise a thread will be made in the PID starting at the handler's address. + * \param n The IRQ to register a handler for + * \param pid The PID that will handle the interrupt. + * \param handler The address of the handler. */ -void isr_register_handler(int n,isr_t handler); +void isr_register_handler(int n,pid_t pid,void* handler); #endif diff --git a/kernel/cpu/tasking_helpers.h b/kernel/cpu/tasking_helpers.h index ec43ced..2b4966d 100644 --- a/kernel/cpu/tasking_helpers.h +++ b/kernel/cpu/tasking_helpers.h @@ -18,6 +18,11 @@ void switch_to_thread_asm(Thread* thread); */ void task_init(); +/** + * Initializes a usermode task without interrupts enabled +*/ +void task_init_no_int(); + /** * An assembly helper for waiting for an unblocked thread * Starts interrupts, halts, then clears interrupts. @@ -31,8 +36,9 @@ void wait_for_unblocked_thread_asm(); * \param param2 The thread's start function second parameter * \param kmode Whether the thread is a kernel mode thread * \param eip The start address of the thread + * \param is_irq_handler Whether the kernel stack is for an interrupt handler thread */ -void setup_kstack(Thread* thread,void* param1,void* param2,char kmode,void* eip); +void setup_kstack(Thread* thread,void* param1,void* param2,char kmode,void* eip,char is_irq_handler); /** * Frees a kernel stack so it can be used again diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c index 8a834ad..c248045 100644 --- a/kernel/kmalloc.c +++ b/kernel/kmalloc.c @@ -6,6 +6,8 @@ #include #include #include +#include "cpu/serial.h" +#include "cpu/halt.h" #define KMALLOC_BMAP_SZ (((KMALLOC_SZ*1024)/4)/8) //!< The size of the kmalloc bitmap @@ -85,6 +87,8 @@ void* kmalloc(size_t size) { } } if (remaining_blks!=0) { + serial_printf("Kmalloc fail!\n"); + halt(); return NULL; } for (size_t i=0;icode,pid,virtaddr); + pid_t tid=tasking_new_thread(func->code,pid,virtaddr,0); tasking_set_rpc_calling_thread(pid,tid); // Block the thread and wait for an unblock from rpc_return tasking_block(THREAD_WAITING_FOR_RPC); diff --git a/kernel/tasking.c b/kernel/tasking.c index 82592ed..3f5ea3e 100644 --- a/kernel/tasking.c +++ b/kernel/tasking.c @@ -90,7 +90,7 @@ void schedule_thread(Thread* thread) { } } -void tasking_create_task(void* eip,void* address_space,char kmode,void* param1,void* param2,char isThread) { +void tasking_create_task(void* eip,void* address_space,char kmode,void* param1,void* param2,char isThread,char is_irq_handler) { if (next_pid>MAX_PROCS && !isThread) { serial_printf("Failed to create a process, as 32k processes have been created already.\n"); halt(); //Cannot ever create more than 32k processes, as I don't currently reuse PIDs. @@ -118,9 +118,19 @@ void tasking_create_task(void* eip,void* address_space,char kmode,void* param1,v num_procs++; } proc->first_thread=thread; - setup_kstack(thread,param1,param2,kmode,eip); + setup_kstack(thread,param1,param2,kmode,eip,is_irq_handler); schedule_thread(thread); - // serial_printf("Created thread with PID %d and TID %d.\n",proc->pid,thread->tid); + serial_printf("Created thread with PID %d and TID %d.\n",proc->pid,thread->tid); + serial_printf("Structure values:\n"); + serial_printf("kernel_esp=%x\n",thread->kernel_esp); + serial_printf("kernel_esp_top=%x\n",thread->kernel_esp_top); + serial_printf("address_space=%x\n",thread->address_space); + serial_printf("tid=%d\n",thread->tid); + serial_printf("state=%d\n",thread->state); + serial_printf("next_thread_in_process=%x\n",thread->next_thread_in_process); + serial_printf("next_ready_to_run=%x\n",thread->next_ready_to_run); + serial_printf("prev_ready_to_run=%x\n",thread->prev_ready_to_run); + serial_printf("process=%x\n",thread->process); } void tasking_init() { @@ -128,7 +138,7 @@ void tasking_init() { memset(&processes[i],0,sizeof(Process)); } - tasking_create_task(NULL,get_address_space(),1,NULL,NULL,0); + tasking_create_task(NULL,get_address_space(),1,NULL,NULL,0,0); } char tasking_is_privleged() { @@ -147,8 +157,8 @@ int* tasking_get_errno_address() { return ¤t_thread->errno; } -pid_t tasking_new_thread(void* start,pid_t pid,void* param) { - tasking_create_task(start,NULL,0,param,(void*)pid,1); +pid_t tasking_new_thread(void* start,pid_t pid,void* param,char is_irq_handler) { + tasking_create_task(start,NULL,0,param,(void*)pid,1,is_irq_handler); return processes[pid].first_thread->tid; } @@ -389,7 +399,6 @@ void* tasking_get_rpc_ret_buf() { void tasking_thread_exit() { tasking_block(THREAD_EXITED); - free_kstack(current_thread->kernel_esp_top); } char tasking_check_proc_exists(pid_t pid) { diff --git a/kernel/tasking.h b/kernel/tasking.h index f0040d7..e7f5ad3 100644 --- a/kernel/tasking.h +++ b/kernel/tasking.h @@ -57,7 +57,7 @@ typedef struct Thread { pid_t rpc_calling_pid; //!< The PID of the thread that called this RPC (only used for RPC handler threads) pid_t rpc_calling_tid; //!< The TID of the thread that called this RPC (only used for RPC handler threads) void* rpc_ret_buf; //!< The return buffer of the RPC call that the thread made -} Thread; +} __attribute__((packed)) Thread; extern Thread* current_thread; @@ -69,8 +69,9 @@ extern Thread* current_thread; * \param param1 The thread's start function first parameter * \param param2 The thread's start function second parameter * \param isThread Whether we are creating a new process or a thread in a process. If we are creating a theead, param2_arg becomes the PID for the newly created thread. + * \param is_irq_handler Whether the new task is an irq handler task */ -void tasking_create_task(void* eip,void* address_space,char kmode,void* param1,void* param2,char isThread); +void tasking_create_task(void* eip,void* address_space,char kmode,void* param1,void* param2,char isThread,char is_irq_handler); /** * Initialize tasking */ @@ -100,9 +101,10 @@ int* tasking_get_errno_address(); * \param start The start address of the task * \param pid The PID that gets the new thread * \param param The thread's start function parameter + * \param is_irq_handler Whether the new thread is an irq handler thread * \return the TID of the thread */ -pid_t tasking_new_thread(void* start,pid_t pid,void* param); +pid_t tasking_new_thread(void* start,pid_t pid,void* param,char is_irq_handler); /** * Terminate the current thread diff --git a/kernel/timer/pit/timer.c b/kernel/timer/pit/timer.c index a7a50a4..3f4927d 100644 --- a/kernel/timer/pit/timer.c +++ b/kernel/timer/pit/timer.c @@ -19,7 +19,7 @@ void timer_init(int freq) { } else { serial_printf("Setting PIT to %dHz using divisor of %d\n",freq,div); } - isr_register_handler(0,timer_handler); + isr_register_handler(0,0,timer_handler); port_byte_out(0x43,0b00110110); // Set timer 0 to lobyte/hibyte access, and mode 3 (square wave generator) port_byte_out(0x40,div&0xFF); port_byte_out(0x40,(div>>8)&0xFF); diff --git a/libc/Doxyfile b/libc/Doxyfile index d6afa20..9383399 100644 --- a/libc/Doxyfile +++ b/libc/Doxyfile @@ -5,7 +5,7 @@ TYPEDEF_HIDES_STRUCT = YES EXTRACT_STATIC = YES WARN_NO_PARAMDOC = YES WARN_AS_ERROR = YES -INPUT = /Users/peterterpstra/Desktop/projects/os/libc +INPUT = ./libc RECURSIVE = YES EXCLUDE = libc/elf.h libc/grub/multiboot2.h HTML_DYNAMIC_SECTIONS = YES diff --git a/libc/sys/syscalls.h b/libc/sys/syscalls.h index c8bd592..11e8cb0 100644 --- a/libc/sys/syscalls.h +++ b/libc/sys/syscalls.h @@ -28,5 +28,6 @@ #define SYSCALL_RPC_RET 18 #define SYSCALL_RPC_MARK_AS_INIT 21 #define SYSCALL_RPC_IS_INIT 22 +#define SYSCALL_REGISTER_IRQ_HANDLER 23 #endif diff --git a/tar_fs/tar_fs b/tar_fs/tar_fs index 10a2d00ac82451d44452a8cb2fd3978d045a45c7..228a4e573f7f863f1109f5aad9cffc61583640ea 100755 GIT binary patch literal 37240 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

80N5<&MVg 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 CA^AK2 diff --git a/vga_drv/vtconsole.c b/vga_drv/vtconsole.c old mode 100755 new mode 100644 diff --git a/vga_drv/vtconsole.h b/vga_drv/vtconsole.h old mode 100755 new mode 100644