From 20ab9e1d6ea4ab331de2319a1a3a6e512a8caa4b Mon Sep 17 00:00:00 2001 From: Rick Rongen Date: Sun, 21 Mar 2021 17:34:38 +0100 Subject: [PATCH] feat: gdt, attributes move, reorder Added late gdt setup with initial tss Moved attributes to include root Reordered some imports --- include/attributes.h | 19 ++++ include/elf.h | 6 +- include/myke/attributes.h | 19 ---- include/myke/cpu/gdt.h | 10 ++ include/myke/cpu/idt.h | 6 +- include/myke/driver.h | 2 +- include/myke/drivers/pci/pci.h | 6 +- include/myke/libk/libk.h | 6 +- include/myke/libk/syscall.h | 4 +- include/myke/util/power.h | 4 +- kernel/command.c | 16 +-- kernel/cpu/gdt.S | 18 ++++ kernel/cpu/gdt.c | 192 +++++++++++++++++++++++++++++++++ kernel/debug/debug.c | 6 +- kernel/drivers/pci/ide.c | 19 ++-- kernel/drivers/pci/pci.c | 5 +- kernel/fs/blockdev.c | 12 +-- kernel/fs/fat.c | 26 ++--- kernel/fs/mbr.c | 12 +-- kernel/fs/ustar.c | 9 +- kernel/kernel.c | 11 +- kernel/libk/kprint.c | 10 +- kernel/libk/libk.c | 7 +- kernel/libk/syscall.c | 4 +- kernel/mem/mem.c | 8 +- kernel/mem/paging.c | 12 +-- kernel/tasks/task.c | 18 ++-- kernel/util/power.c | 5 +- 28 files changed, 351 insertions(+), 121 deletions(-) create mode 100644 include/attributes.h delete mode 100644 include/myke/attributes.h create mode 100644 include/myke/cpu/gdt.h create mode 100644 kernel/cpu/gdt.S create mode 100644 kernel/cpu/gdt.c diff --git a/include/attributes.h b/include/attributes.h new file mode 100644 index 0000000..9333903 --- /dev/null +++ b/include/attributes.h @@ -0,0 +1,19 @@ +// +// Created by rick on 24-02-21. +// + +#ifndef NEW_KERNEL_ATTRIBUTES_H +#define NEW_KERNEL_ATTRIBUTES_H + +// generic +#define att_used __attribute((used)) + +// function +#define att_noreturn __attribute((noreturn)) +#define att_cdecl __attribute((cdecl)) +// structure +#define att_packed __attribute((packed)) +// field +#define att_aligned(size) __attribute((aligned(size))) + +#endif //NEW_KERNEL_ATTRIBUTES_H diff --git a/include/elf.h b/include/elf.h index d5a1c94..071a0e7 100644 --- a/include/elf.h +++ b/include/elf.h @@ -6,7 +6,7 @@ #define NEW_KERNEL_ELF_H #include -#include +#include #define SHT_NULL 0 #define SHT_PROGBITS 1 @@ -59,7 +59,7 @@ struct elf32_section_header { uint32_t sh_info; uint32_t sh_addr_align; uint32_t sh_ent_size; -} packed; +} att_packed; struct elf32_symtab_entry { uint32_t st_name; @@ -68,6 +68,6 @@ struct elf32_symtab_entry { uint8_t st_info; uint8_t st_other; uint16_t st_shndx; -} packed; +} att_packed; #endif //NEW_KERNEL_ELF_H diff --git a/include/myke/attributes.h b/include/myke/attributes.h deleted file mode 100644 index 9c01876..0000000 --- a/include/myke/attributes.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by rick on 24-02-21. -// - -#ifndef NEW_KERNEL_ATTRIBUTES_H -#define NEW_KERNEL_ATTRIBUTES_H - -// generic -#define used __attribute((used)) - -// function -#define noreturn __attribute((noreturn)) -#define cdecl __attribute((cdecl)) -// structure -#define packed __attribute((packed)) -// field -#define at_aligned(size) __attribute((aligned(size))) - -#endif //NEW_KERNEL_ATTRIBUTES_H diff --git a/include/myke/cpu/gdt.h b/include/myke/cpu/gdt.h new file mode 100644 index 0000000..4c942e8 --- /dev/null +++ b/include/myke/cpu/gdt.h @@ -0,0 +1,10 @@ +// +// Created by rick on 19-03-21. +// + +#ifndef NEW_KERNEL_GDT_H +#define NEW_KERNEL_GDT_H + +void gdt_init(); + +#endif //NEW_KERNEL_GDT_H diff --git a/include/myke/cpu/idt.h b/include/myke/cpu/idt.h index d0b50f1..e35ca03 100644 --- a/include/myke/cpu/idt.h +++ b/include/myke/cpu/idt.h @@ -6,7 +6,7 @@ #ifndef MY_KERNEL_IDT_H #define MY_KERNEL_IDT_H -#include +#include #define KERNEL_CS 0x08 @@ -22,12 +22,12 @@ typedef struct { * Bits 3-0: bits 1110 = decimal 14 = "32 bit interrupt gate" */ uint8_t flags; uint16_t high_offset; /* Higher 16 bits of handler function address */ -} packed idt_gate_t; +} att_packed idt_gate_t; typedef struct { uint16_t limit; uint32_t base; -} packed idt_register_t; +} att_packed idt_register_t; #define IDT_REGISTERS 256 diff --git a/include/myke/driver.h b/include/myke/driver.h index 8386d51..d5de1d3 100644 --- a/include/myke/driver.h +++ b/include/myke/driver.h @@ -5,7 +5,7 @@ #ifndef NEW_KERNEL_DRIVER_H #define NEW_KERNEL_DRIVER_H -#include +#include #include #ifndef STRUCT_ALIGNMENT diff --git a/include/myke/drivers/pci/pci.h b/include/myke/drivers/pci/pci.h index 39af85d..64126f7 100644 --- a/include/myke/drivers/pci/pci.h +++ b/include/myke/drivers/pci/pci.h @@ -8,7 +8,7 @@ #include #include #include -#include +#include #define PCI_CLASS_MASS_STORAGE 0x01 #define PCI_CLASS_BRIDGE 0x06 @@ -190,7 +190,7 @@ typedef union { bool fast_b2b_enable: 1; bool interrupt_disable: 1; uint8_t reserved2: 5; - } packed command; + } att_packed command; } pci_command_register_t; typedef union { @@ -209,7 +209,7 @@ typedef union { bool received_master_abort: 1; bool signaled_system_error: 1; bool detected_parity_error: 1; - } packed status; + } att_packed status; } pci_status_register_t; void pci_print_info(); diff --git a/include/myke/libk/libk.h b/include/myke/libk/libk.h index 350d8f0..aa5a144 100644 --- a/include/myke/libk/libk.h +++ b/include/myke/libk/libk.h @@ -5,7 +5,7 @@ #ifndef NEW_KERNEL_LIBK_H #define NEW_KERNEL_LIBK_H -#include +#include #include extern void *_kernel_start; @@ -17,8 +17,8 @@ bool k_addr_in_kspace(void *addr); void k_wait_for_interrupt(); -void noreturn k_panics(const char *msg); +void att_noreturn k_panics(const char *msg); -void noreturn k_panic(); +void att_noreturn k_panic(); #endif //NEW_KERNEL_LIBK_H diff --git a/include/myke/libk/syscall.h b/include/myke/libk/syscall.h index da2d598..a019b29 100644 --- a/include/myke/libk/syscall.h +++ b/include/myke/libk/syscall.h @@ -6,14 +6,14 @@ #define NEW_KERNEL_SYSCALL_H #include -#include +#include #define SYSCALL_START_SCHEDULER 0x01 #define SYSCALL_YIELD_JOB 0x02 #define SYSCALL_YIELD_IRQ 0x03 #define SYSCALL_SUSPEND 0x04 -void noreturn syscall_start_scheduler(); +void att_noreturn syscall_start_scheduler(); void syscall_yield_job(); diff --git a/include/myke/util/power.h b/include/myke/util/power.h index 88bfa64..882c1db 100644 --- a/include/myke/util/power.h +++ b/include/myke/util/power.h @@ -5,8 +5,8 @@ #ifndef NEW_KERNEL_POWER_H #define NEW_KERNEL_POWER_H -#include +#include -void noreturn power_shutdown(); +void att_noreturn power_shutdown(); #endif //NEW_KERNEL_POWER_H diff --git a/kernel/command.c b/kernel/command.c index 444ae8c..c66dd57 100644 --- a/kernel/command.c +++ b/kernel/command.c @@ -1,22 +1,22 @@ // // Created by rick on 23-02-21. // -#include +#include #include +#include #include #include +#include #include -#include -#include -#include #include -#include #include +#include #include #include -#include -#include +#include +#include +#include #include #ifdef ENABLE_SELF_TEST @@ -172,7 +172,7 @@ void store_bootloader_info(multiboot_info_t *multiboot_info) { } } -void noreturn main_loop(void *data) { +void att_noreturn main_loop(void *data) { while (true) { char *msg = readline(NULL); char *args = strchr(msg, ' '); diff --git a/kernel/cpu/gdt.S b/kernel/cpu/gdt.S new file mode 100644 index 0000000..a7d9010 --- /dev/null +++ b/kernel/cpu/gdt.S @@ -0,0 +1,18 @@ +.code32 +.extern gdt_ptr + +.global _gdt_switch +_gdt_switch: + lgdt gdt_ptr + movw $0x10,%ax + movw %ax,%ds + movw %ax,%es + movw %ax,%fs + movw %ax,%gs + ljmp $0x8, $_gdt_switch_continue +_gdt_switch_continue: + movw $0x2a, %ax // 0x28 + 0x03 = 0x2a + ltr %ax + ret + + diff --git a/kernel/cpu/gdt.c b/kernel/cpu/gdt.c new file mode 100644 index 0000000..164af63 --- /dev/null +++ b/kernel/cpu/gdt.c @@ -0,0 +1,192 @@ +// +// Created by rick on 19-03-21. +// +#include +#include + +#include +#include + +typedef struct gdt { + uint32_t base; + uint32_t limit; + union { + uint8_t access_byte; + struct { + bool accessed: 1; + bool read_write: 1; // for executable, if reading is allowed. For Non-exec if writing is allowed + // data sector: direction + // grows up(false) or down(true). + // executable sector: conforming + // if true higher privilege levels can execute this code (e.g. ring 3 can exec ring 0 code) the privilege level it self is not changed. + // if false, only the specified ring can execute the code + bool direction_conforming: 1; + bool executable: 1; + bool is_sector: 1; + uint8_t privilege: 2; + bool present: 1; + } att_packed; + }; + union { + uint8_t flags_byte: 4; + struct { + uint8_t unused: 2; + bool size: 1; // false 16bit, true 32bit + bool granularity: 1; // false 1 byte, true 4KiB + } att_packed; + }; +} gdt_t; + +struct tss_ring { + uint32_t esp; + uint16_t ss; + uint16_t: 16; // skipped +} att_packed; + +typedef struct tss { + uint16_t link; + uint16_t: 16; // skipped + struct tss_ring r0; + struct tss_ring r1; + struct tss_ring r2; + struct { + uint32_t cr3; + uint32_t eip; + uint32_t eflags; + uint32_t eax; + uint32_t ecx; + uint32_t edx; + uint32_t ebx; + uint32_t esp; + uint32_t ebp; + uint32_t esi; + uint32_t edi; + uint16_t es; + uint16_t: 16; + uint16_t cs; + uint16_t: 16; + uint16_t ss; + uint16_t: 16; + uint16_t ds; + uint16_t: 16; + uint16_t fs; + uint16_t: 16; + uint16_t gs; + uint16_t: 16; + uint16_t ldtr; + uint16_t: 16; + } att_packed regs; + uint16_t: 16; + uint16_t iopb_offset; +} att_packed tss_t; +_Static_assert(sizeof(tss_t) == 104, "TSS incorrect size"); + +typedef struct gdtr { + uint16_t size; + uint32_t offset; +} att_packed gdtr_t; + +#define num_gdts 5 + +extern void _gdt_switch(); + +tss_t tss = { + .iopb_offset = sizeof(tss_t), + .r0.ss = 0x10, +}; + +gdt_t gdts[num_gdts] = { + { // 0x08 kernel code + .present = true, + .base = 0, + .limit = 0xFFFFFFFF, + .is_sector = true, + .size = true, + .granularity = true, + .executable = true, + .read_write = true, + .privilege = 0, + }, { // 0x10 kernel data + .present = true, + .base = 0, + .limit = 0xFFFFFFFF, + .is_sector = true, + .size = true, + .granularity = true, + .executable = false, + .read_write = true, + }, { // 0x18 user code + .present = true, + .base = 0, + .limit = 0xFFFFFFFF, + .privilege = 3, + .is_sector = true, + .size = true, + .granularity = true, + .executable = true, + .read_write = true, + }, { // 0x20 user data + .present = true, + .base = 0, + .limit = 0xFFFFFFFF, + .privilege = 3, + .is_sector = true, + .size = true, + .granularity = true, + .executable = true, + .read_write = true, + }, { // 0x28 tss + .base = (uint32_t) &tss, + .limit = sizeof(tss_t), + .present = true, + .executable = true, + .accessed = true, + .size = true, + } +}; +uint64_t gdt_values[num_gdts + 1] = {0}; +gdtr_t gdt_ptr = { + .size = sizeof(uint64_t) * (num_gdts + 1) - 1, + .offset = (uint32_t) &gdt_values, +}; +_Static_assert(sizeof(gdt_ptr) == 6, "GDT PTR incorrect size"); + +uint64_t gdt_encode(gdt_t *gdt) { + // high limit must be full 4k + uint64_t limit = gdt->limit; + if (limit > 65536 && (limit & 0xFFF) != 0xFFF && !gdt->granularity) { + return 0; + } else { + limit >>= 12; + } + uint64_t value = 0 + | (limit & 0xFFFF) + | ((gdt->base & 0xFFFF) << 16) + | ((uint64_t) ((gdt->base >> 16) & 0xFF) << 32) + | ((uint64_t) (gdt->access_byte) << 40) + | ((limit >> 16) << 48) + | ((uint64_t) (gdt->flags_byte) << 52) + | ((uint64_t) (gdt->base >> 24) << 56); + return value; +} + +void gdt_activate() { + gdt_values[0] = 0; // first is zero + for (int i = 0; i < num_gdts; ++i) { + gdt_values[i + 1] = gdt_encode(&gdts[i]); + if (gdt_values[i + 1] == 0) { + // todo failed to encode + k_panics("Failed to encode GDT\n"); + } + } + _gdt_switch(); +} + +void gdt_init() { + // Replace the early gdt with a new one + // this one will be extensible and support stuff like TSS + + tss.r0.esp = 0; // todo + + gdt_activate(); +} \ No newline at end of file diff --git a/kernel/debug/debug.c b/kernel/debug/debug.c index 2894bd1..edc6915 100644 --- a/kernel/debug/debug.c +++ b/kernel/debug/debug.c @@ -4,11 +4,12 @@ #include #include +#include +#include #define DEBUG_INIT #include -#include #include #include @@ -73,7 +74,8 @@ void debug_store_info(struct multiboot_info *info) { if (sizeof(struct elf32_section_header) != info->u.elf_sec.size) { k_panics("ELF size not correct"); } - elf_headers = (struct elf32_section_header *) info->u.elf_sec.addr; + elf_headers = calloc(info->u.elf_sec.num, sizeof(struct elf32_section_header)); + memcpy(elf_headers, (const void *) info->u.elf_sec.addr, sizeof(struct elf32_section_header) * info->u.elf_sec.num); elf_header_cnt = info->u.elf_sec.num; debug_find_sections(info->u.elf_sec.shndx); } diff --git a/kernel/drivers/pci/ide.c b/kernel/drivers/pci/ide.c index b03ffe2..92156d6 100644 --- a/kernel/drivers/pci/ide.c +++ b/kernel/drivers/pci/ide.c @@ -3,19 +3,20 @@ // // https://wiki.osdev.org/PCI_IDE_Controller +#include #include +#include #include #include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include #include +#include +#include #include #define ATA_SR_BSY 0x80 // Busy @@ -414,7 +415,7 @@ void ide_register_block_devices() { } } -uint8_t used ide_pci_validate(const pci_device *device) { +uint8_t att_used ide_pci_validate(const pci_device *device) { if (device->class != PCI_CLASS_MASS_STORAGE || device->subclass != PCI_SUB_CLASS_IDE || (device->programInterface != 0x8A && device->programInterface != 0x80)) { @@ -424,7 +425,7 @@ uint8_t used ide_pci_validate(const pci_device *device) { return PCI_VALIDATE_OK; } -uint8_t used ide_pci_initialize(pci_device *device) { +uint8_t att_used ide_pci_initialize(pci_device *device) { if (!ide_pci_init_channels(device)) { return PCI_INIT_FAIL; diff --git a/kernel/drivers/pci/pci.c b/kernel/drivers/pci/pci.c index 002ec70..29722c6 100644 --- a/kernel/drivers/pci/pci.c +++ b/kernel/drivers/pci/pci.c @@ -3,8 +3,9 @@ // // https://wiki.osdev.org/PCI -#include +#include #include +#include #include #include @@ -44,7 +45,7 @@ pci_device pci_devices[MAX_PCI_DEVICES]; void pci_check_bus(uint8_t bus); -uint8_t used pci_secondary_bus_use(const pci_device *device) { +uint8_t att_used pci_secondary_bus_use(const pci_device *device) { uint8_t secondary_bus = pci_config_read_byte(device->bus, device->slot, device->func, PCI_CONFIG_SECONDARY_BUS_NUMBER); pci_check_bus(secondary_bus); diff --git a/kernel/fs/blockdev.c b/kernel/fs/blockdev.c index d9b3a2a..26b042e 100644 --- a/kernel/fs/blockdev.c +++ b/kernel/fs/blockdev.c @@ -2,15 +2,15 @@ // Created by rick on 06-02-21. // +#include +#include #include #include -#include -#include -#include -#include -#include #include +#include +#include +#include #define MAX_BLOCK_DEVS 64 @@ -122,7 +122,7 @@ void block_dev_scan() { } } -void noreturn block_dev_task(void *data) { +void att_noreturn block_dev_task(void *data) { while (true) { semaphore_wait(block_semaphore); block_dev_scan(); diff --git a/kernel/fs/fat.c b/kernel/fs/fat.c index 23ff654..f5a91e7 100644 --- a/kernel/fs/fat.c +++ b/kernel/fs/fat.c @@ -2,13 +2,13 @@ // Created by rick on 07-02-21. // +#include +#include #include #include -#include +#include #include -#include -#include #define FAT_TYPE_12 1 #define FAT_TYPE_16 2 @@ -31,7 +31,7 @@ typedef struct { uint16_t heads_sides; uint32_t hidden_sectors; uint32_t large_total_sectors; - } packed bpb; + } att_packed bpb; union { struct { uint8_t drive_number; @@ -40,7 +40,7 @@ typedef struct { uint32_t serial; uint8_t label[11]; uint8_t system_id[8]; - } packed ebr_12_16; + } att_packed ebr_12_16; struct { uint32_t sectors_per_fat; uint16_t flags; @@ -55,21 +55,21 @@ typedef struct { uint32_t serial; uint8_t label[11]; uint8_t system_id[8]; - } packed ebr_32; + } att_packed ebr_32; }; -} packed fat_bpb; +} att_packed fat_bpb; typedef struct { uint8_t hours: 5; uint8_t minutes: 6; uint8_t seconds: 5; -} packed time_83; +} att_packed time_83; typedef struct { uint8_t hours: 5; uint8_t minutes: 6; uint8_t seconds: 5; -} packed date_83; +} att_packed date_83; typedef struct { union { @@ -86,7 +86,7 @@ typedef struct { date_83 last_mod_date; uint16_t low_first_cluster; uint32_t file_size; - } packed name_83; + } att_packed name_83; struct { uint8_t order; uint16_t text_1[5]; @@ -96,9 +96,9 @@ typedef struct { uint16_t text_2[6]; uint16_t reserved; uint16_t text_3[2]; - } packed long_name; + } att_packed long_name; }; -} packed fat_directory_entry; +} att_packed fat_directory_entry; void print_chars(char *chars, int amount) { for (int i = 0; i < amount; ++i) { @@ -107,7 +107,7 @@ void print_chars(char *chars, int amount) { } } -uint8_t used fat_check_device(const block_device_t *device, uint8_t *first_sector) { +uint8_t att_used fat_check_device(const block_device_t *device, uint8_t *first_sector) { fat_bpb bpb; memcpy((uint8_t *) &bpb, first_sector, sizeof(fat_bpb)); if (bpb.bpb.sectors_per_fat == 0 || bpb.bpb.sectors_per_cluster == 0) { diff --git a/kernel/fs/mbr.c b/kernel/fs/mbr.c index a1567a1..f315df7 100644 --- a/kernel/fs/mbr.c +++ b/kernel/fs/mbr.c @@ -2,15 +2,15 @@ // Created by rick on 06-02-21. // +#include +#include #include #include -#include #include -#include #include #include -#include +#include typedef struct { uint8_t bootable; @@ -23,14 +23,14 @@ typedef struct { uint16_t ending_cylinder: 10; uint32_t start_lba; uint32_t num_lbas; -} packed mbr_partition_table_entry; +} att_packed mbr_partition_table_entry; typedef struct { uint32_t unique_id; uint16_t reserved; mbr_partition_table_entry entries[4]; uint8_t signature[2]; -} packed mbr_table; +} att_packed mbr_table; typedef struct { const block_device_t *device; @@ -52,7 +52,7 @@ mbr_block_dev_access(const block_device_t *device, uint8_t direction, uint32_t l return info->device->access(info->device, direction, actual_lba, sectors, target); } -uint8_t used mbr_check_device(const block_device_t *device, uint8_t *first_sector) { +uint8_t att_used mbr_check_device(const block_device_t *device, uint8_t *first_sector) { mbr_table table; memcpy((uint8_t *) &table, first_sector + (device->block_size - sizeof(mbr_table)), sizeof(mbr_table)); if (table.signature[0] != 0x55 && table.signature[1] != 0xAA) { // AA 55 but in little endian diff --git a/kernel/fs/ustar.c b/kernel/fs/ustar.c index dc7e5bb..1547a5f 100644 --- a/kernel/fs/ustar.c +++ b/kernel/fs/ustar.c @@ -1,12 +1,13 @@ // // Created by rick on 11-03-21. // +#include +#include +#include +#include #include #include -#include -#include -#include typedef struct { char filename[100]; @@ -25,7 +26,7 @@ typedef struct { uint64_t device_major; uint64_t device_minor; char prefix[155]; -} packed ustar_sector; +} att_packed ustar_sector; typedef struct { ustar_sector sector; diff --git a/kernel/kernel.c b/kernel/kernel.c index a1a2b01..0dc3cfd 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,9 +1,12 @@ -#include +#include #include +#include #define DEBUG_INIT +#include #include +#include #include #include #include @@ -17,8 +20,6 @@ #include #include #include -#include -#include const int version_major = 0, version_minor = 0, @@ -38,7 +39,7 @@ void init_pci_system() { pci_init_drivers(); } -void noreturn used kmain(multiboot_info_t *multiboot_info, uint32_t mb_name) { +void att_noreturn att_used kmain(multiboot_info_t *multiboot_info, uint32_t mb_name) { // early init isr_install(); vga_clear_screen(); @@ -57,6 +58,8 @@ void noreturn used kmain(multiboot_info_t *multiboot_info, uint32_t mb_name) { // initialize memory management init_mmap(multiboot_info); + gdt_init(); + // initialize kprint functionality kprint_init(); diff --git a/kernel/libk/kprint.c b/kernel/libk/kprint.c index 18d76fd..94e3e70 100644 --- a/kernel/libk/kprint.c +++ b/kernel/libk/kprint.c @@ -2,13 +2,13 @@ // Created by rick on 28-01-21. // -#include +#include #include +#include -#include -#include -#include #include +#include +#include #define MAX_HANDLERS 8 #define STREAM_SIZE (32*1024) @@ -49,7 +49,7 @@ void kprint_init() { kprint_stream = stream_create(STREAM_SIZE); } -void noreturn kprint_task(void *_) { +void att_noreturn kprint_task(void *_) { uint32_t last_read = 0; uint8_t data[PRINT_BUFFER_SIZE + 1] = {0}; while (true) { diff --git a/kernel/libk/libk.c b/kernel/libk/libk.c index 7afd4e7..f6263d2 100644 --- a/kernel/libk/libk.c +++ b/kernel/libk/libk.c @@ -2,8 +2,9 @@ // Created by rick on 02-02-21. // +#include + #include -#include #include bool k_addr_in_kspace(void *addr) { @@ -14,13 +15,13 @@ void k_wait_for_interrupt() { __asm__ __volatile__("hlt;"); } -void noreturn k_panics(const char *msg) { +void att_noreturn k_panics(const char *msg) { // todo this is not printed kprint_sync(msg); k_panic(); } -void noreturn k_panic() { +void att_noreturn k_panic() { kprint_sync("PANIC!"); while (1) { __asm__ __volatile__("cli;" diff --git a/kernel/libk/syscall.c b/kernel/libk/syscall.c index 8648bc3..dfda4ec 100644 --- a/kernel/libk/syscall.c +++ b/kernel/libk/syscall.c @@ -2,10 +2,10 @@ // Created by rick on 22-02-21. // +#include #include #include -#include void syscall1(uint32_t arg1) { __asm__("int $0x80" @@ -19,7 +19,7 @@ void syscall2(uint32_t arg1, uint32_t arg2) { : "a"(arg1), "b"(arg2)); } -void noreturn syscall_start_scheduler() { +void att_noreturn syscall_start_scheduler() { syscall1(SYSCALL_START_SCHEDULER); while (1) { __asm__("hlt"); }; } diff --git a/kernel/mem/mem.c b/kernel/mem/mem.c index 4526681..7a6fcbc 100644 --- a/kernel/mem/mem.c +++ b/kernel/mem/mem.c @@ -2,13 +2,13 @@ // Created by rick on 22-04-20. // +#include #include #include -#include -#include #include -#include +#include +#include #define MEMMAP_ENTRIES 16 @@ -25,7 +25,7 @@ typedef struct { uint32_t address; uint32_t length; uint32_t type; -} packed mmap_entry; +} att_packed mmap_entry; int last_memmap_entry = 0; mmap_entry memmap[MEMMAP_ENTRIES] = { diff --git a/kernel/mem/paging.c b/kernel/mem/paging.c index ac9371c..fecd022 100644 --- a/kernel/mem/paging.c +++ b/kernel/mem/paging.c @@ -2,11 +2,11 @@ // Created by rick on 21-02-21. // +#include #include #include #include -#include #define TABLE_ADDR_MASK 0xFFFFF000 #define DIRECTORY_SIZE 1024 @@ -25,10 +25,10 @@ typedef struct { bool page_size: 1; bool global: 1; // ignored uint8_t avail: 3; - } packed; + } att_packed; uint32_t addr; }; -} packed page_directory_entry; +} att_packed page_directory_entry; typedef struct { union { @@ -43,12 +43,12 @@ typedef struct { char ignored: 1; bool global: 1; uint8_t available: 3; - } packed; + } att_packed; uint32_t addr; }; -} packed page_table_entry; +} att_packed page_table_entry; -page_directory_entry page_directory[DIRECTORY_SIZE] at_aligned(4096); +page_directory_entry page_directory[DIRECTORY_SIZE] att_aligned(4096); void page_pre_init() { for (int i = 0; i < DIRECTORY_SIZE; ++i) { diff --git a/kernel/tasks/task.c b/kernel/tasks/task.c index 525320a..0f86613 100644 --- a/kernel/tasks/task.c +++ b/kernel/tasks/task.c @@ -2,15 +2,15 @@ // Created by rick on 22-02-21. // -#include +#include #include +#include #include -#include #include -#include -#include #include +#include +#include #define stack_end(task) ((task)->stack + ((task)->stack_page_count * PAGE_SIZE)) @@ -48,7 +48,7 @@ typedef struct { task_entrypoint entrypoint; void *entry_data; char alignment[4]; -} packed task_stack_start; +} att_packed task_stack_start; volatile uint32_t task_locked = 0; @@ -62,12 +62,12 @@ uint32_t last_tid = 0; extern switch_task(task_registers_t **, task_registers_t*); -extern cdecl noreturn void __task_entry_point(); +extern att_cdecl att_noreturn void __task_entry_point(); -extern noreturn void __task_entry_point_inner(); +extern att_noreturn void __task_entry_point_inner(); // explicit cdecl calling convention -void cdecl noreturn task_entry_point(task_entrypoint entrypoint, void *entry_data) { +void att_cdecl att_noreturn task_entry_point(task_entrypoint entrypoint, void *entry_data) { entrypoint(entry_data); // task_end_self(); while (true); // halt @@ -114,7 +114,7 @@ void task_suspend() { task_switch_next(); } -void noreturn task_idle(void *data) { +void att_noreturn task_idle(void *data) { while (true) __asm__("hlt"); } diff --git a/kernel/util/power.c b/kernel/util/power.c index 79c455d..6b52d34 100644 --- a/kernel/util/power.c +++ b/kernel/util/power.c @@ -2,12 +2,13 @@ // Created by rick on 03-03-21. // +#include + #include -#include #include #include -void noreturn power_shutdown() { +void att_noreturn power_shutdown() { port_word_out(PORT_ACPI, PORT_ACPI_SHUTDOWN); port_word_out(PORT_QEMU_COMMAND, PORT_QEMU_COMMAND_SHUTDOWN); port_word_out(PORT_VBOX, PORT_VBOX_SHUTDOWN);