diff --git a/include/config.h b/include/config.h index 3a1e9e3..30a79f3 100644 --- a/include/config.h +++ b/include/config.h @@ -20,6 +20,10 @@ "\x1b[38;5;196m/_/ /_/ /_/ \r\n\x1b[0m"\ " --- version \x1b[38;5;220m"PEPPEROS_VERSION_MAJOR"."PEPPEROS_VERSION_MINOR"."PEPPEROS_VERSION_PATCH"\x1b[0m built on \x1b[38;5;40m"__DATE__" "__TIME__"\x1b[0m\r\n" +/* pedicel */ +#define PEDICEL_PROMPT "pedicel$ " +#define PEDICEL_INPUT_SIZE 128 + /* process */ #define PROCESS_NAME_MAX 64 #define PROCESS_STACK_SIZE 0x10000 // 64kb diff --git a/include/string/string.h b/include/string/string.h index dca35bc..78859ec 100644 --- a/include/string/string.h +++ b/include/string/string.h @@ -12,5 +12,6 @@ char *strcpy(char *dest, const char *src); char *strcat(char *dest, const char *src); void strncpy(char* dst, const char* src, size_t n); +int strncmp(const char* s1, const char* s2, size_t n); #endif \ No newline at end of file diff --git a/src/arch/x86/idt.c b/src/arch/x86/idt.c index b698162..eb99a4a 100644 --- a/src/arch/x86/idt.c +++ b/src/arch/x86/idt.c @@ -24,6 +24,8 @@ extern char vector_0_handler[]; // Timer ticks extern volatile uint64_t ticks; +extern struct init_status init; + /* * idt_set_entry - Sets an Interrupt Descriptor Table entry * @vector: Vector number in the IDT @@ -122,6 +124,19 @@ static void page_fault_handler(struct cpu_status_t* ctx) CHECK_BIT(ctx->error_code, 7) ? " SGX_VIOLATION" : "", cr2); + if (init.all) { + printf("\x1b[38;5;231mPage Fault at rip=0x%p, err=%u (%s%s%s%s%s%s%s%s) when accessing addr=0x%p\x1b[0m", ctx->iret_rip, ctx->error_code, + CHECK_BIT(ctx->error_code, 0) ? "PAGE_PROTECTION_VIOLATION " : "PAGE_NOT_PRESENT ", + CHECK_BIT(ctx->error_code, 1) ? "ON_WRITE " : "ON_READ ", + CHECK_BIT(ctx->error_code, 2) ? "IN_USER_MODE" : "IN_KERNEL_MODE", + CHECK_BIT(ctx->error_code, 3) ? " WAS_RESERVED" : "", + CHECK_BIT(ctx->error_code, 4) ? " ON_INSTRUCTION_FETCH" : "", + CHECK_BIT(ctx->error_code, 5) ? " PK_VIOLATION" : "", + CHECK_BIT(ctx->error_code, 6) ? " ON_SHADOWSTACK_ACCESS" : "", + CHECK_BIT(ctx->error_code, 7) ? " SGX_VIOLATION" : "", + cr2); + } + panic(ctx, "page fault"); } @@ -157,12 +172,6 @@ static void gp_fault_handler(struct cpu_status_t* ctx) panic(ctx, "gp fault"); } -// DEBUG -void kbdproc_main(void* arg) -{ - printf("Key pressed/released.\r\n"); -} - /* * interrupt_dispatch - Interrupt dispatcher * @context: CPU context @@ -261,7 +270,7 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) case 33: // Keyboard Interrupt keyboard_handler(); - process_create("keyboard-initiated", kbdproc_main, NULL); // DEBUG + //process_create("keyboard-initiated", kbdproc_main, NULL); // DEBUG outb(0x20, 0x20); break; diff --git a/src/kapps/kshell.c b/src/kapps/kshell.c index b416d69..7090e6e 100644 --- a/src/kapps/kshell.c +++ b/src/kapps/kshell.c @@ -5,6 +5,11 @@ */ #include +#include +#include +#include +#include +#include /* * pedicel_main - Kernel shell main function @@ -13,8 +18,39 @@ * This is the entry point for the kernel shell process. * It is used to start programs and to test different things * on different real hardware easily. + * + * Named after the root part of the pepper. */ void pedicel_main(void* arg) { - printf("Entering the kernel shell...\r\n"); + printf("Welcome to the kernel shell!\r\nType 'help' for a list of commands.\r\n"); + + for (;;) { + char input_buf[PEDICEL_INPUT_SIZE] = {0}; + printf(PEDICEL_PROMPT); + keyboard_getline(input_buf, PEDICEL_INPUT_SIZE); + + if (strncmp(input_buf, "help", 4) == 0) { + printf("\r\npanic - trigger a test panic\r\n" + "syscall - trigger int 0x80\r\n" + "pf - trigger a page fault\r\n"); + continue; + } + + if (strncmp(input_buf, "panic", 5) == 0) { + panic(NULL, "test panic"); + } + + if (strncmp(input_buf, "syscall", 7) == 0) { + __asm__ volatile("int $0x80"); + continue; + } + + if (strncmp(input_buf, "pf", 2) == 0) { + volatile uint64_t* fault = (uint64_t*)0xdeadbeef; + fault[0] = 1; + } + + printf("%s: command not found\r\n", input_buf); + } } \ No newline at end of file diff --git a/src/string/string.c b/src/string/string.c index 3c7c7af..6b51c58 100644 --- a/src/string/string.c +++ b/src/string/string.c @@ -69,4 +69,33 @@ void strncpy(char* dst, const char* src, size_t n) { size_t i = 0; while(i++ != n && (*dst++ = *src++)); +} + + +/* + * strncmp - compare two strings up to n characters + * @s1: first string + * @s2: second string + * @n: number of bytes to compare + * + * Taken from: https://github.com/DevSolar/pdclib/blob/master/functions/string/strncmp.c + * + * Return: + * $0 - @s1 and @s2 are equal + * $<0 - @s1 is less than @s2 + * $>0 - @s1 is greater than @s2 + */ +int strncmp(const char* s1, const char* s2, size_t n) +{ + while ( n && *s1 && ( *s1 == *s2 ) ) { + ++s1; + ++s2; + --n; + } + if ( n == 0 ) { + return 0; + } + else { + return ( *(unsigned char *)s1 - *(unsigned char *)s2 ); + } } \ No newline at end of file