diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-09-03 23:53:53 +0200 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-09-04 16:42:56 +0200 |
| commit | 6e9b3275d75e0cdbae1e8f7e4dda8880bb6346bc (patch) | |
| tree | d6c7daf073f41ec2df196a322e8d1210d8e126a1 /kernel/src | |
| parent | 11ced165e0df11cc3c889eb0cc402467361c421b (diff) | |
gdt & tss
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/boot/boot.S | 9 | ||||
| -rw-r--r-- | kernel/src/boot/boot64.S | 3 | ||||
| -rw-r--r-- | kernel/src/cpu/gdt.c | 53 | ||||
| -rw-r--r-- | kernel/src/cpu/irq.c | 5 | ||||
| -rw-r--r-- | kernel/src/cpu/irq_stub.S | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/tss.c | 15 | ||||
| -rw-r--r-- | kernel/src/fs/ext2.c | 6 | ||||
| -rw-r--r-- | kernel/src/main.c | 18 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 7 | ||||
| -rw-r--r-- | kernel/src/sys/syscall.S | 0 | ||||
| -rw-r--r-- | kernel/src/sys/userspace.c | 9 | ||||
| -rw-r--r-- | kernel/src/sys/userspace_asm.S | 20 |
12 files changed, 122 insertions, 27 deletions
diff --git a/kernel/src/boot/boot.S b/kernel/src/boot/boot.S index 81584ce..e0c5326 100644 --- a/kernel/src/boot/boot.S +++ b/kernel/src/boot/boot.S @@ -1,10 +1,10 @@ .code32 -.global _start .extern begin_long_mode .set KERNEL_VMA, 0xc0000000 .section .boot.text, "a" +.global _start _start: cli mov $stack_top - KERNEL_VMA, %esp @@ -136,7 +136,7 @@ no_long_mode: .section .text 4: - lgdt gdt_pointer + lgdt gdtp ljmp $0x08, $begin_long_mode @@ -189,9 +189,6 @@ gdt_data = . - gdt .byte PRESENT | NOT_SYS | RW .byte GRAN_4K | SZ_32 | 0xF .byte 0 -gdt_tss = . - gdt - .long 0x00000068 - .long 0x00CF8900 -gdt_pointer: +gdtp: .word . - gdt - 1 .quad gdt diff --git a/kernel/src/boot/boot64.S b/kernel/src/boot/boot64.S index 50ee7cd..68eae38 100644 --- a/kernel/src/boot/boot64.S +++ b/kernel/src/boot/boot64.S @@ -1,8 +1,7 @@ -.global begin_long_mode - .section .text .code64 +.global begin_long_mode begin_long_mode: // reload segment registers mov $0x10, %eax diff --git a/kernel/src/cpu/gdt.c b/kernel/src/cpu/gdt.c new file mode 100644 index 0000000..b4f1ec0 --- /dev/null +++ b/kernel/src/cpu/gdt.c @@ -0,0 +1,53 @@ +#include <gdt.h> +#include <tss.h> + +gdt_seg_entry gdt[7]; +gdt_p gdt_pointer; + +void add_gdt_entry(uint32_t num, uint32_t offset, uint32_t limit, uint8_t access, uint8_t flags) +{ + gdt[num].offset1 = offset & 0xffff; + gdt[num].offset2 = (offset >> 16) & 0xff; + gdt[num].offset3 = (uint8_t)(offset >> 24) & 0xff; + gdt[num].limit = limit & 0xffff; + gdt[num].limitflags = (limit >> 16) & 0xf; + gdt[num].access = access; + gdt[num].limitflags = flags << 4; +} + +void add_gdt_tss(uint32_t num, uint64_t offset, uint32_t limit, uint8_t access, uint8_t flags) +{ + add_gdt_entry(num, offset & 0xffffffff, limit, access, flags); +} + +void reload_gdt() +{ + __asm__ volatile ( + "mov $0x10, %ax;" + "mov %ax, %ds;" + "mov %ax, %es;" + "mov %ax, %ss;" + ); +} + +void load_gdt(gdt_p* pointer) +{ + __asm__ volatile ("lgdt (%0);" : : "r"(pointer) : ); + reload_gdt(); +} + +void init_gdt() +{ + gdt_pointer.offset = (uint64_t)&gdt; + gdt_pointer.size = sizeof(gdt) - 1; + + add_gdt_entry(0, 0, 0, 0, 0); + add_gdt_entry(1, 0, 0xfffff, 0x9a, 0xa); + add_gdt_entry(2, 0, 0xfffff, 0x92, 0xc); + add_gdt_entry(3, 0, 0xfffff, 0xfa, 0xa); + add_gdt_entry(4, 0, 0xfffff, 0xf2, 0xc); + add_gdt_tss(5, (uint64_t)&tss, sizeof(tss_type), 0x89, 0); + + load_gdt(&gdt_pointer); + init_tss(); +} diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c index 096860a..a19a7f1 100644 --- a/kernel/src/cpu/irq.c +++ b/kernel/src/cpu/irq.c @@ -8,7 +8,7 @@ #include <paging.h> #include <libk/stdio.h> -const char* exception_name[] = { +const char* const exception_name[] = { "Divide-by-zero Error", "Debug", "Non-maskable Interrupt", @@ -120,8 +120,9 @@ void isr13_handler(uint64_t error) void isr14_handler(uint64_t error) { - page_fault(error); printf("%s\n", exception_name[14]); + printf("error: %d\n", error); + page_fault(error); } void isr15_handler(void) diff --git a/kernel/src/cpu/irq_stub.S b/kernel/src/cpu/irq_stub.S index 4db722e..9b2b2d8 100644 --- a/kernel/src/cpu/irq_stub.S +++ b/kernel/src/cpu/irq_stub.S @@ -38,11 +38,9 @@ isr\number: .macro isr_error number .global isr\number isr\number: - add $8, %rsp + pop %rdi pushall cld - # setting error to 0 - mov $0, %rdi call isr\number\()_handler popall iretq diff --git a/kernel/src/cpu/tss.c b/kernel/src/cpu/tss.c new file mode 100644 index 0000000..c7f9dc2 --- /dev/null +++ b/kernel/src/cpu/tss.c @@ -0,0 +1,15 @@ +#include <tss.h> + +tss_type tss; + +void load_tss() +{ + __asm__ volatile ("mov $0x28, %ax; ltr %ax;"); +} + +void init_tss() +{ + tss.iopb = sizeof(tss_type); + + load_tss(); +} diff --git a/kernel/src/fs/ext2.c b/kernel/src/fs/ext2.c index 11f26fc..5395dd0 100644 --- a/kernel/src/fs/ext2.c +++ b/kernel/src/fs/ext2.c @@ -24,6 +24,12 @@ void read_superblock(ext2_superblock_t* superblock) memcpy(superblock, block, sizeof(ext2_superblock_t)); } +void ext2_init() +{ + ext2_superblock = (ext2_superblock_t*)kalloc(sizeof(ext2_superblock_t)); + read_superblock(ext2_superblock); +} + void read_bg_desc(uint32_t bg_desc, ext2_bg_desc_t* ext2_bg_desc) { uint32_t starting_block_num = BLOCK_SIZE == 1024 ? 2 : 1; diff --git a/kernel/src/main.c b/kernel/src/main.c index c575a0e..45d2eeb 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -11,27 +11,23 @@ #include <disc.h> #include <ext2.h> #include <timer.h> +#include <gdt.h> +#include <userspace.h> +#include <tss.h> int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic); int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) { + init_gdt(); init_paging(); init_idt(); init_timer(TICKS_PER_SECOND); init_heap(); read_mb2(multiboot_bootinfo, multiboot_magic); - - // init disc disc_init(); - - // read superblock - ext2_superblock = (ext2_superblock_t*)kalloc(sizeof(ext2_superblock_t)); - read_superblock(ext2_superblock); - - ls(path_to_inode("/")); - - // free superblock - kfree(ext2_superblock); + ext2_init(); +// ls(path_to_inode("/")); +// jump_userspace(); for(;;) { __asm__ volatile ("hlt;"); diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index 531c300..630fb6d 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -51,9 +51,10 @@ void init_paging(void) page_table_lvl3[2] = (uint64_t)page_table_lvl2_2 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA; page_table_lvl3[3] = (uint64_t)page_table_lvl2_3 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA; - // higher half map first 4mb - map_addr(KERNEL_VMA, 0x00000000, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); - map_addr(KERNEL_VMA + PAGE_SIZE, 0x00000000 + PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); + // higher half map first 6mb + for (size_t i = 0; i < 3; i++) { + map_addr(KERNEL_VMA + PAGE_SIZE * i, 0x00000000 + PAGE_SIZE * i, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); + } load_pt_lvl4(page_table_lvl4); } diff --git a/kernel/src/sys/syscall.S b/kernel/src/sys/syscall.S new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/kernel/src/sys/syscall.S diff --git a/kernel/src/sys/userspace.c b/kernel/src/sys/userspace.c new file mode 100644 index 0000000..4add4d5 --- /dev/null +++ b/kernel/src/sys/userspace.c @@ -0,0 +1,9 @@ +#include <types.h> +#include <userspace.h> + +void begin_userspace() +{ + while(true) { + + } +} diff --git a/kernel/src/sys/userspace_asm.S b/kernel/src/sys/userspace_asm.S new file mode 100644 index 0000000..5838051 --- /dev/null +++ b/kernel/src/sys/userspace_asm.S @@ -0,0 +1,20 @@ +.text + +.extern begin_userspace + +.global jump_userspace +jump_userspace: + mov $0x23, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + + mov %esp, %eax + push $0x23 + push %rax + pushf + push $0x1b + sub $8, %rsp + movabs $begin_userspace, %rsp + iretq |
