mirror of
https://git.stationery.faith/corn/corn.git
synced 2024-11-25 07:00:02 +00:00
refactor, improve exception message
This commit is contained in:
parent
b9754579df
commit
417d5b17b8
6 changed files with 130 additions and 85 deletions
|
@ -1,92 +1,111 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The memcmp() function compares the first n bytes (each interpreted as unsigned char) of the memory
|
* The memcmp() function compares the first n bytes (each interpreted as unsigned char) of the memory
|
||||||
* areas s1 and s2.
|
* areas s1 and s2.
|
||||||
*/
|
*/
|
||||||
extern int memcmp(const void *restrict s1, const void *restrict s2, unsigned long n);
|
int memcmp(const void *restrict s1, const void *restrict s2, unsigned long n);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The memcpy() function copies n bytes from memory area src to memory area dest.
|
* The memcpy() function copies n bytes from memory area src to memory area dest.
|
||||||
* The memory areas must not overlap.
|
* The memory areas must not overlap.
|
||||||
*/
|
*/
|
||||||
extern void *memcpy(void *restrict dest, const void *restrict src, unsigned long n);
|
void *memcpy(void *restrict dest, const void *restrict src, unsigned long n);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The memmove() function copies n bytes from memory area src to memory area dest. The memory areas
|
* The memmove() function copies n bytes from memory area src to memory area dest. The memory areas
|
||||||
* may overlap: copying takes place as though the bytes in src are first copied into a temporary array
|
* may overlap: copying takes place as though the bytes in src are first copied into a temporary array
|
||||||
* that does not overlap src or dest, and the bytes are then copied from the temporary array to dest.
|
* that does not overlap src or dest, and the bytes are then copied from the temporary array to dest.
|
||||||
*/
|
*/
|
||||||
extern void *memmove(void *dest, const void *src, unsigned long n);
|
void *memmove(void *dest, const void *src, unsigned long n);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The memset() function fills the first n bytes of the memory area pointed to by s with the constant
|
* The memset() function fills the first n bytes of the memory area pointed to by s with the constant
|
||||||
* byte c.
|
* byte c.
|
||||||
*/
|
*/
|
||||||
extern void *memset(void *restrict dest, int c, unsigned long n);
|
void *memset(void *restrict dest, int c, unsigned long n);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The strcmp() function compares the two strings s1 and s2. The locale is not taken into account
|
* The strcmp() function compares the two strings s1 and s2. The locale is not taken into account
|
||||||
* (for a locale-aware comparison, see strcoll(3)). The comparison is done using unsigned characters.
|
* (for a locale-aware comparison, see strcoll(3)). The comparison is done using unsigned characters.
|
||||||
*/
|
*/
|
||||||
extern int strncmp(const char *restrict s1, const char *restrict s2, unsigned long n);
|
int strncmp(const char *restrict s1, const char *restrict s2, unsigned long n);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copys the string pointed to by src , into a string at the buffer pointer to by dest.
|
* Copys the string pointed to by src , into a string at the buffer pointer to by dest.
|
||||||
* The dest buffer must be long enough to hold src.
|
* The dest buffer must be long enough to hold src.
|
||||||
*/
|
*/
|
||||||
extern char *strcpy(char *restrict dest, const char *restrict src);
|
char *strcpy(char *restrict dest, const char *restrict src);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copys the string pointed to by src , into a string at the buffer pointer to by dest.
|
* Copys the string pointed to by src , into a string at the buffer pointer to by dest.
|
||||||
* The dest buffer must be long enough to hold src or size n.
|
* The dest buffer must be long enough to hold src or size n.
|
||||||
*/
|
*/
|
||||||
extern char *strncpy(char *restrict dest, const char *restrict src, unsigned long n);
|
char *strncpy(char *restrict dest, const char *restrict src, unsigned long n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the length of the string pointed to by str, excluding
|
||||||
|
* the terminating null byte
|
||||||
|
* @param str - the string pointer
|
||||||
|
* @returns the length of the string in bytes
|
||||||
|
*/
|
||||||
|
size_t strlen(const char *str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concatenate the string pointed to by src after the string pointed
|
||||||
|
* to by dst.
|
||||||
|
* @param dst - the pointer to the destination string
|
||||||
|
* @param src - the pointer to the source string
|
||||||
|
* @returns dst
|
||||||
|
*/
|
||||||
|
char *strcat(char *restrict dst, const char *restrict src);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns 1 if c is a space
|
* @returns 1 if c is a space
|
||||||
*/
|
*/
|
||||||
extern int isspace(int c);
|
int isspace(int c);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns 1 if c is a digit (0 - 9)
|
* @returns 1 if c is a digit (0 - 9)
|
||||||
*/
|
*/
|
||||||
extern int isdigit(int c);
|
int isdigit(int c);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* converts single digit int to base 36
|
* converts single digit int to base 36
|
||||||
* @param i - int
|
* @param i - int
|
||||||
* @returns c - base 36 char
|
* @returns c - base 36 char
|
||||||
*/
|
*/
|
||||||
extern char itoc(int i);
|
char itoc(int i);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* converts single base 36 chat into int
|
* converts single base 36 chat into int
|
||||||
* @param c - base 36 char
|
* @param c - base 36 char
|
||||||
* @returns i - int
|
* @returns i - int
|
||||||
*/
|
*/
|
||||||
extern int ctoi(char c);
|
int ctoi(char c);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the initial portiion of the string pointed to by s to int.
|
* Converts the initial portiion of the string pointed to by s to int.
|
||||||
* @param s - the string to convert
|
* @param s - the string to convert
|
||||||
* @returns the number inside s or 0 on error
|
* @returns the number inside s or 0 on error
|
||||||
*/
|
*/
|
||||||
extern int atoi(const char* s);
|
int atoi(const char* s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the initial portiion of the string pointed to by s to long.
|
* Converts the initial portiion of the string pointed to by s to long.
|
||||||
* @param s - the string to convert
|
* @param s - the string to convert
|
||||||
* @returns the number inside s or 0 on error
|
* @returns the number inside s or 0 on error
|
||||||
*/
|
*/
|
||||||
extern long int atol(const char* s);
|
long int atol(const char* s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the initial portiion of the string pointed to by s to long long.
|
* Converts the initial portiion of the string pointed to by s to long long.
|
||||||
* @param s - the string to convert
|
* @param s - the string to convert
|
||||||
* @returns the number inside s or 0 on error
|
* @returns the number inside s or 0 on error
|
||||||
*/
|
*/
|
||||||
extern long long int atoll(const char* s);
|
long long int atoll(const char* s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a integer to asci inside a string with a given radix (base).
|
* Converts a integer to asci inside a string with a given radix (base).
|
||||||
|
@ -94,7 +113,7 @@ extern long long int atoll(const char* s);
|
||||||
* @param buffer - the string buffer
|
* @param buffer - the string buffer
|
||||||
* @param radix - the base to convert
|
* @param radix - the base to convert
|
||||||
*/
|
*/
|
||||||
extern char *itoa(int n, char *buffer, int radix);
|
char *itoa(int n, char *buffer, int radix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a long to asci inside a string with a given radix (base).
|
* Converts a long to asci inside a string with a given radix (base).
|
||||||
|
@ -102,7 +121,7 @@ extern char *itoa(int n, char *buffer, int radix);
|
||||||
* @param buffer - the string buffer
|
* @param buffer - the string buffer
|
||||||
* @param radix - the base to convert
|
* @param radix - the base to convert
|
||||||
*/
|
*/
|
||||||
extern char *ltoa(long int n, char *buffer, int radix);
|
char *ltoa(long int n, char *buffer, int radix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a unsigned integer to asci inside a string with a given radix (base).
|
* Converts a unsigned integer to asci inside a string with a given radix (base).
|
||||||
|
@ -110,7 +129,7 @@ extern char *ltoa(long int n, char *buffer, int radix);
|
||||||
* @param buffer - the string buffer
|
* @param buffer - the string buffer
|
||||||
* @param radix - the base to convert
|
* @param radix - the base to convert
|
||||||
*/
|
*/
|
||||||
extern char *utoa(unsigned int n, char *buffer, int radix);
|
char *utoa(unsigned int n, char *buffer, int radix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a unsigned long to asci inside a string with a given radix (base).
|
* Converts a unsigned long to asci inside a string with a given radix (base).
|
||||||
|
@ -118,7 +137,7 @@ extern char *utoa(unsigned int n, char *buffer, int radix);
|
||||||
* @param buffer - the string buffer
|
* @param buffer - the string buffer
|
||||||
* @param radix - the base to convert
|
* @param radix - the base to convert
|
||||||
*/
|
*/
|
||||||
extern char *ultoa(unsigned long int n, char *buffer, int radix);
|
char *ultoa(unsigned long int n, char *buffer, int radix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the string in str to an int value based on the given base.
|
* Converts the string in str to an int value based on the given base.
|
||||||
|
@ -128,7 +147,7 @@ extern char *ultoa(unsigned long int n, char *buffer, int radix);
|
||||||
* @param base - the base to convert to
|
* @param base - the base to convert to
|
||||||
* @returns 0 on error or success, error if endptr is still equal to str
|
* @returns 0 on error or success, error if endptr is still equal to str
|
||||||
*/
|
*/
|
||||||
extern int strtoi(const char *str, char **endptr, int base);
|
int strtoi(const char *str, char **endptr, int base);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the string in str to an long value based on the given base.
|
* Converts the string in str to an long value based on the given base.
|
||||||
|
@ -138,7 +157,7 @@ extern int strtoi(const char *str, char **endptr, int base);
|
||||||
* @param base - the base to convert to
|
* @param base - the base to convert to
|
||||||
* @returns 0 on error or success, error if endptr is still equal to str
|
* @returns 0 on error or success, error if endptr is still equal to str
|
||||||
*/
|
*/
|
||||||
extern long int strtol(const char *str, char **endptr, int base);
|
long int strtol(const char *str, char **endptr, int base);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the string in str to an long long value based on the given base.
|
* Converts the string in str to an long long value based on the given base.
|
||||||
|
@ -148,4 +167,4 @@ extern long int strtol(const char *str, char **endptr, int base);
|
||||||
* @param base - the base to convert to
|
* @param base - the base to convert to
|
||||||
* @returns 0 on error or success, error if endptr is still equal to str
|
* @returns 0 on error or success, error if endptr is still equal to str
|
||||||
*/
|
*/
|
||||||
extern long long int strtoll(const char *str, char **endptr, int base);
|
long long int strtoll(const char *str, char **endptr, int base);
|
||||||
|
|
|
@ -7,11 +7,13 @@ extern idt_pic_mouse
|
||||||
extern idt_pic_eoi
|
extern idt_pic_eoi
|
||||||
|
|
||||||
%macro PUSHALL 0
|
%macro PUSHALL 0
|
||||||
|
push rax
|
||||||
push rbx
|
push rbx
|
||||||
push rcx
|
push rcx
|
||||||
push rdx
|
push rdx
|
||||||
push rsi
|
push rbp
|
||||||
push rdi
|
push rdi
|
||||||
|
push rsi
|
||||||
push r8
|
push r8
|
||||||
push r9
|
push r9
|
||||||
push r10
|
push r10
|
||||||
|
@ -31,11 +33,13 @@ extern idt_pic_eoi
|
||||||
pop r10
|
pop r10
|
||||||
pop r9
|
pop r9
|
||||||
pop r8
|
pop r8
|
||||||
pop rdi
|
|
||||||
pop rsi
|
pop rsi
|
||||||
|
pop rdi
|
||||||
|
pop rbp
|
||||||
pop rdx
|
pop rdx
|
||||||
pop rcx
|
pop rcx
|
||||||
pop rbx
|
pop rbx
|
||||||
|
pop rax
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
; call the exception handler with the interrupt number
|
; call the exception handler with the interrupt number
|
||||||
|
|
|
@ -73,68 +73,81 @@ void idt_init(void) {
|
||||||
|
|
||||||
// Intel manual vol 3 ch 6.3.1
|
// Intel manual vol 3 ch 6.3.1
|
||||||
char *EXCEPTIONS[] = {
|
char *EXCEPTIONS[] = {
|
||||||
"Exception 0x00 Divide Error",
|
"0x00 Division Error",
|
||||||
"Exception 0x01 Debug Exception",
|
"0x01 Debug",
|
||||||
"Exception 0x02 NMI Interrupt",
|
"0x02 NMI",
|
||||||
"Exception 0x03 Breakpoint",
|
"0x03 Breakpoint",
|
||||||
"Exception 0x04 Overflow",
|
"0x04 Overflow",
|
||||||
"Exception 0x05 BOUND Range Exceeded",
|
"0x05 BOUND Range Exceeded",
|
||||||
"Exception 0x06 Invalid Opcode",
|
"0x06 Invalid Opcode",
|
||||||
"Exception 0x07 Device Not Available",
|
"0x07 Device Not Available",
|
||||||
"Exception 0x08 Double Fault",
|
"0x08 Double Fault",
|
||||||
"Exception 0x09 Coprocessor Segment Overrun",
|
"0x09 Coprocessor Segment Overrun",
|
||||||
"Exception 0x0A Invalid TSS",
|
"0x0A Invalid TSS",
|
||||||
"Exception 0x0B Segment Not Present",
|
"0x0B Segment Not Present",
|
||||||
"Exception 0x0C Stack-Segment Fault",
|
"0x0C Stack-Segment Fault",
|
||||||
"Exception 0x0D General Protection",
|
"0x0D General Protection Fault",
|
||||||
"Exception 0x0E Page Fault",
|
"0x0E Page Fault",
|
||||||
"Exception 0x0F Reserved",
|
"0x0F Reserved",
|
||||||
"Exception 0x10 x87 FPU Floating-Point Error",
|
"0x10 x87 Floating-Point Error",
|
||||||
"Exception 0x11 Alignment Check",
|
"0x11 Alignment Check",
|
||||||
"Exception 0x12 Machine Check",
|
"0x12 Machine Check",
|
||||||
"Exception 0x13 SIMD Floaing-Point Exception",
|
"0x13 SIMD Floaing-Point Exception",
|
||||||
"Exception 0x14 Virtualization Exception",
|
"0x14 Virtualization Exception",
|
||||||
"Exception 0x15 Control Protection Exception",
|
"0x15 Control Protection Exception",
|
||||||
"Exception 0x16 Reserved",
|
"0x16 Reserved",
|
||||||
"Exception 0x17 Reserved",
|
"0x17 Reserved",
|
||||||
"Exception 0x18 Reserved",
|
"0x18 Reserved",
|
||||||
"Exception 0x19 Reserved",
|
"0x19 Reserved",
|
||||||
"Exception 0x1A Reserved",
|
"0x1A Reserved",
|
||||||
"Exception 0x1B Reserved",
|
"0x1B Reserved",
|
||||||
"Exception 0x1C Reserved",
|
"0x1C Hypervisor Injection Exception",
|
||||||
"Exception 0x1D Reserved",
|
"0x1D VMM Communication Exception",
|
||||||
"Exception 0x1E Reserved",
|
"0x1E Security Exception",
|
||||||
"Exception 0x1F Reserved",
|
"0x1F Reserved",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void idt_exception_handler(uint64_t exception, uint64_t code) {
|
||||||
|
// TODO don't just panic
|
||||||
|
char buf[24];
|
||||||
|
char msg[256] = "Exception ";
|
||||||
|
|
||||||
|
strcat(msg, EXCEPTIONS[exception]);
|
||||||
|
|
||||||
|
strcat(msg, "\nError code 0x");
|
||||||
|
ultoa(code, buf, 16);
|
||||||
|
strcat(msg, buf);
|
||||||
|
|
||||||
|
// page faults store the offending address in cr2
|
||||||
|
if(exception == 0x0E) {
|
||||||
|
strcat(msg, "\nPage fault address: 0x");
|
||||||
|
void *addr;
|
||||||
|
__asm__ volatile ("mov %%cr2, %0" : "=r"(addr));
|
||||||
|
ultoa((size_t)addr, buf, 16);
|
||||||
|
strcat(msg, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
panic(msg);
|
||||||
|
}
|
||||||
|
|
||||||
void idt_pic_eoi(uint8_t exception) {
|
void idt_pic_eoi(uint8_t exception) {
|
||||||
pic_eoi(exception - PIC_REMAP_OFFSET);
|
pic_eoi(exception - PIC_REMAP_OFFSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t timer = 0;
|
int counter = 0;
|
||||||
|
|
||||||
void idt_pic_timer(void) {
|
void idt_pic_timer(void) {
|
||||||
timer += 1;
|
// print a message once we know the timer works
|
||||||
char buf[20];
|
// but avoid spamming the logs
|
||||||
ltoa(timer, buf, 10);
|
if (counter == 3) {
|
||||||
serial_out_str(buf);
|
serial_out_str("pic timer!\n");
|
||||||
serial_out_str("\n");
|
}
|
||||||
|
if (counter <= 3) {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void idt_pic_keyboard(void) {
|
void idt_pic_keyboard(void) {}
|
||||||
serial_out_str("ps2 kbd");
|
|
||||||
}
|
|
||||||
|
|
||||||
void idt_pic_mouse(void) {
|
void idt_pic_mouse(void) {}
|
||||||
serial_out_str("ps2 mouse");
|
|
||||||
}
|
|
||||||
|
|
||||||
void idt_exception_handler(uint64_t exception, uint64_t code) {
|
|
||||||
// TODO don't just panic
|
|
||||||
char buf[80];
|
|
||||||
char *end = strcpy(buf, EXCEPTIONS[exception]);
|
|
||||||
end = strcpy(end, "\nError code 0x");
|
|
||||||
ltoa(code, end, 16);
|
|
||||||
panic(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,12 @@
|
||||||
_Noreturn void _panic_impl(char *line, char *file, char *msg) {
|
_Noreturn void _panic_impl(char *line, char *file, char *msg) {
|
||||||
cli();
|
cli();
|
||||||
serial_out_str("\n\n!!! PANIC !!!\n");
|
serial_out_str("\n\n!!! PANIC !!!\n");
|
||||||
serial_out_str(msg);
|
serial_out_str("In file ");
|
||||||
serial_out_str("\nin file ");
|
|
||||||
serial_out_str(file);
|
serial_out_str(file);
|
||||||
serial_out_str(" at line ");
|
serial_out_str(" at line ");
|
||||||
serial_out_str(line);
|
serial_out_str(line);
|
||||||
|
serial_out_str(":\n");
|
||||||
|
serial_out_str(msg);
|
||||||
serial_out('\n');
|
serial_out('\n');
|
||||||
while (1) {
|
while (1) {
|
||||||
halt();
|
halt();
|
||||||
|
|
|
@ -5,14 +5,11 @@
|
||||||
#include <shim.h>
|
#include <shim.h>
|
||||||
|
|
||||||
void kmain(struct boot_info *info) {
|
void kmain(struct boot_info *info) {
|
||||||
char buf[20];
|
|
||||||
*(char*)0xB8000 = 'c';
|
|
||||||
memory_init(info->map);
|
memory_init(info->map);
|
||||||
//*(char*)(0xB8002 + 0x20'0000) = 'd';
|
serial_out_str("entered kmain\n");
|
||||||
itoa((long)info, buf, 16);
|
*(char*)(0xB8000 + 0x144) = 'h';
|
||||||
itoa(*(long*)info, buf, 16);
|
*(char*)(0xB8000 + 0x146) = 'i';
|
||||||
//fb_init(1024, 768);
|
//fb_init(1024, 768);
|
||||||
serial_out_str(buf);
|
|
||||||
while (1) {
|
while (1) {
|
||||||
// loop so we dont halt
|
// loop so we dont halt
|
||||||
// this allows interrupts to fire
|
// this allows interrupts to fire
|
||||||
|
|
11
src/lib.c
11
src/lib.c
|
@ -54,6 +54,17 @@ char *strncpy(char *restrict dest, const char *restrict src, unsigned long n) {
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t strlen(const char *str) {
|
||||||
|
const char *p;
|
||||||
|
for(p = str; *p != 0; p++) {}
|
||||||
|
return p - str;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *strcat(char *restrict dst, const char *restrict src) {
|
||||||
|
strcpy(dst + strlen(dst), src);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
int isspace(int c) {
|
int isspace(int c) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case ' ':
|
case ' ':
|
||||||
|
|
Loading…
Reference in a new issue