diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/atomic.h | 2 | ||||
| -rw-r--r-- | kernel/include/idt.h | 2 | ||||
| -rw-r--r-- | kernel/src/apic/apic.c | 24 | ||||
| -rw-r--r-- | kernel/src/apic/ioapic.c | 15 | ||||
| -rw-r--r-- | kernel/src/boot/multiboot2.c | 2 | ||||
| -rw-r--r-- | kernel/src/check/panic.c | 5 | ||||
| -rw-r--r-- | kernel/src/cpu/gdt.c | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/idt.c | 12 | ||||
| -rw-r--r-- | kernel/src/cpu/io.c | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/msr.c | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/tss.c | 2 | ||||
| -rw-r--r-- | kernel/src/devices/timer.c | 5 | ||||
| -rw-r--r-- | kernel/src/main.c | 3 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 2 | ||||
| -rw-r--r-- | kernel/src/misc/graphics.c | 2 | ||||
| -rw-r--r-- | kernel/src/scheduler/ap_startup.c | 2 | ||||
| -rw-r--r-- | kernel/src/scheduler/atomic.c | 2 | ||||
| -rw-r--r-- | kernel/src/sys/syscall.c | 6 | ||||
| -rw-r--r-- | kernel/src/sys/userspace.c | 4 |
19 files changed, 58 insertions, 44 deletions
diff --git a/kernel/include/atomic.h b/kernel/include/atomic.h index 01a2433..6f59937 100644 --- a/kernel/include/atomic.h +++ b/kernel/include/atomic.h @@ -4,7 +4,7 @@ #include <types.h> struct mutex_t { - volatile uint64_t* addr; + __volatile__ uint64_t* addr; }; typedef struct mutex_t mutex_t; diff --git a/kernel/include/idt.h b/kernel/include/idt.h index f6d2247..ffb0859 100644 --- a/kernel/include/idt.h +++ b/kernel/include/idt.h @@ -25,6 +25,8 @@ struct idtp { } __attribute__((packed)); typedef struct idtp idtp; +void enable_interrupts(void); +void disable_interrupts(void); void init_idt(void); void load_idt(idtp* pointer); void init_idt_table(void); diff --git a/kernel/src/apic/apic.c b/kernel/src/apic/apic.c index 7fa57bf..3dff70f 100644 --- a/kernel/src/apic/apic.c +++ b/kernel/src/apic/apic.c @@ -21,7 +21,7 @@ uint8_t curr_cpu_apic_id() // CpuId(1, 0, &info); // return (uint8_t)(info.EBX >> 24); - return (uint8_t)(((*((volatile uint32_t*)((uint64_t)lapic_addr + 0x20))) >> 24) & 0xFF); + return (uint8_t)(((*((__volatile__ uint32_t*)((uint64_t)lapic_addr + 0x20))) >> 24) & 0xFF); } void init_ap_cpus() @@ -39,19 +39,19 @@ void init_ap_cpus() // send INIT IPI // clear APIC errors - *((volatile uint32_t*)(lapic_addr + 0x280)) = 0; + *((__volatile__ uint32_t*)(lapic_addr + 0x280)) = 0; // select AP - *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24); + *((__volatile__ uint32_t*)(lapic_addr + 0x310)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24); // trigger INIT IPI - *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x00C500; + *((__volatile__ uint32_t*)(lapic_addr + 0x300)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x00C500; // wait for delivery - do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12)); + do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((__volatile__ uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12)); // select AP - *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24); + *((__volatile__ uint32_t*)(lapic_addr + 0x310)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24); // deassert - *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x008500; + *((__volatile__ uint32_t*)(lapic_addr + 0x300)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x008500; // wait for delivery - do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12)); + do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((__volatile__ uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12)); // wait 10 msec wait(10); @@ -59,15 +59,15 @@ void init_ap_cpus() for(size_t j = 0; j < 2; j++) { // clear APIC errors - *((volatile uint32_t*)(lapic_addr + 0x280)) = 0; + *((__volatile__ uint32_t*)(lapic_addr + 0x280)) = 0; // select AP - *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24); + *((__volatile__ uint32_t*)(lapic_addr + 0x310)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24); // trigger STARTUP IPI for 0800:0000 - *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff0f800) | 0x000608; + *((__volatile__ uint32_t*)(lapic_addr + 0x300)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x300)) & 0xfff0f800) | 0x000608; // wait 200 usec wait(1); // wait for delivery - do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12)); + do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((__volatile__ uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12)); } } diff --git a/kernel/src/apic/ioapic.c b/kernel/src/apic/ioapic.c index 4c3fd69..1322c47 100644 --- a/kernel/src/apic/ioapic.c +++ b/kernel/src/apic/ioapic.c @@ -3,26 +3,27 @@ #include <paging.h> #include <libk/stdio.h> #include <msr.h> +#include <idt.h> void ioapic_eoi() { - *((volatile uint32_t*)((uint64_t)lapic_addr + 0xB0)) = 0; + *((__volatile__ uint32_t*)((uint64_t)lapic_addr + 0xB0)) = 0; } uint32_t ioapic_read(const uint8_t offset) { /* tell IOREGSEL where we want to read from */ - *(volatile uint32_t*)(uint64_t)ioapic_addr = offset; + *(__volatile__ uint32_t*)(uint64_t)ioapic_addr = offset; /* return the data from IOWIN */ - return *(volatile uint32_t*)((uint64_t)ioapic_addr + 0x10); + return *(__volatile__ uint32_t*)((uint64_t)ioapic_addr + 0x10); } void ioapic_write(const uint8_t offset, const uint32_t val) { /* tell IOREGSEL where we want to write to */ - *(volatile uint32_t*)(uint64_t)ioapic_addr = offset; + *(__volatile__ uint32_t*)(uint64_t)ioapic_addr = offset; /* write the value to IOWIN */ - *(volatile uint32_t*)((uint64_t)ioapic_addr + 0x10) = val; + *(__volatile__ uint32_t*)((uint64_t)ioapic_addr + 0x10) = val; } void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector) @@ -68,7 +69,5 @@ void apic_remap_interrupts() ioapic_set_irq(0x1, bspid, 0x21); // keyboard write_msr(APIC_BASE_MSR, read_msr(APIC_BASE_MSR) | (1<<11)); - *((volatile uint32_t*)(lapic_addr + 0xF0)) = (*(volatile uint32_t*)(lapic_addr + 0xF0) | 0x1FF ); - - __asm__ volatile ("sti;"); + *((__volatile__ uint32_t*)(lapic_addr + 0xF0)) = (*(__volatile__ uint32_t*)(lapic_addr + 0xF0) | 0x1FF ); } diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c index 1e38cd7..dd3ab78 100644 --- a/kernel/src/boot/multiboot2.c +++ b/kernel/src/boot/multiboot2.c @@ -56,7 +56,7 @@ void read_mb2(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) { if (multiboot_magic != MB2_MAGIC) { // not loaded by multiboot2 bootloader - __asm__ volatile ("hlt;"); + __asm__ __volatile__ ("hlt;"); } // we will store framebuffer information here diff --git a/kernel/src/check/panic.c b/kernel/src/check/panic.c index 769c72f..894f22f 100644 --- a/kernel/src/check/panic.c +++ b/kernel/src/check/panic.c @@ -1,6 +1,7 @@ #include <libk/stdio.h> #include <panic.h> #include <graphics.h> +#include <idt.h> uint64_t panic_rsp; @@ -44,8 +45,8 @@ void panic(const char *s, ...) printf("ss: 0x%x ", *((uint64_t*)panic_rsp + i++)); } - __asm__ volatile ("cli;"); + disable_interrupts(); for(;;) { - __asm__ volatile ("hlt;"); + __asm__ __volatile__ ("hlt;"); } } diff --git a/kernel/src/cpu/gdt.c b/kernel/src/cpu/gdt.c index fe7e080..58db962 100644 --- a/kernel/src/cpu/gdt.c +++ b/kernel/src/cpu/gdt.c @@ -26,7 +26,7 @@ void add_gdt_tss(uint32_t num, uint64_t offset, uint32_t limit, uint8_t access, void reload_gdt() { - __asm__ volatile ( + __asm__ __volatile__ ( // reload segment registers "mov $0x10, %ax;" "mov %ax, %ds;" @@ -39,7 +39,7 @@ void reload_gdt() void load_gdt(gdt_p* pointer) { - __asm__ volatile ("lgdt (%0);" : : "r"(pointer) : ); + __asm__ __volatile__ ("lgdt (%0);" : : "r"(pointer) : ); reload_gdt(); } diff --git a/kernel/src/cpu/idt.c b/kernel/src/cpu/idt.c index 3578f53..1b0fffb 100644 --- a/kernel/src/cpu/idt.c +++ b/kernel/src/cpu/idt.c @@ -6,9 +6,19 @@ __attribute__((aligned(0x10))) static idt_entry idt_table[256]; idtp idt_pointer; +void enable_interrupts(void) +{ + __asm__ __volatile__ ("sti;"); +} + +void disable_interrupts(void) +{ + __asm__ __volatile__ ("cli;"); +} + void load_idt(idtp* pointer) { - __asm__ volatile ("lidt (%0);" : : "r"(pointer) : ); + __asm__ __volatile__ ("lidt (%0);" : : "r"(pointer) : ); } void add_to_idt(uint16_t num, uint64_t offset, uint16_t selector, uint8_t type) diff --git a/kernel/src/cpu/io.c b/kernel/src/cpu/io.c index a5adfd6..4b5e5ac 100644 --- a/kernel/src/cpu/io.c +++ b/kernel/src/cpu/io.c @@ -4,13 +4,13 @@ uint8_t inb(uint32_t port) { uint8_t ret; - __asm__ volatile ("inb %%dx, %%al;" : "=a"(ret) : "d"(port)); + __asm__ __volatile__ ("inb %%dx, %%al;" : "=a"(ret) : "d"(port)); return ret; } void outb(uint32_t port, uint8_t value) { - __asm__ volatile ("outb %%al, %%dx;" : : "d"(port), "a"(value)); + __asm__ __volatile__ ("outb %%al, %%dx;" : : "d"(port), "a"(value)); } void io_wait(void) diff --git a/kernel/src/cpu/msr.c b/kernel/src/cpu/msr.c index 75fc602..e904d5f 100644 --- a/kernel/src/cpu/msr.c +++ b/kernel/src/cpu/msr.c @@ -6,7 +6,7 @@ uint64_t read_msr(uint32_t addr) uint64_t edx; uint64_t ecx = addr; - __asm__ volatile ("rdmsr;" : "=a"(eax), "=d"(edx) : "c"(ecx) :); + __asm__ __volatile__ ("rdmsr;" : "=a"(eax), "=d"(edx) : "c"(ecx) :); return (edx << 32) | eax; } @@ -17,5 +17,5 @@ void write_msr(uint32_t addr, uint64_t value) uint64_t edx = value >> 32; uint64_t ecx = addr; - __asm__ volatile ("wrmsr;" : : "a"(eax), "d"(edx), "c"(ecx) :); + __asm__ __volatile__ ("wrmsr;" : : "a"(eax), "d"(edx), "c"(ecx) :); } diff --git a/kernel/src/cpu/tss.c b/kernel/src/cpu/tss.c index d2c16d3..03b3475 100644 --- a/kernel/src/cpu/tss.c +++ b/kernel/src/cpu/tss.c @@ -7,7 +7,7 @@ tss_type tss; void load_tss() { - __asm__ volatile ("push %rax; mov $0x28, %ax; ltr %ax; pop %rax;"); + __asm__ __volatile__ ("push %rax; mov $0x28, %ax; ltr %ax; pop %rax;"); } void init_tss() diff --git a/kernel/src/devices/timer.c b/kernel/src/devices/timer.c index 09ed21c..c2fa887 100644 --- a/kernel/src/devices/timer.c +++ b/kernel/src/devices/timer.c @@ -3,6 +3,7 @@ #include <heap.h> #include <libk/list.h> #include <io.h> +#include <idt.h> uint32_t tick = 0; uint32_t seconds = 0; @@ -31,11 +32,11 @@ void timer_handler() void wait(uint64_t ms) { - __asm__ volatile ("cli;"); + disable_interrupts(); wait_queue* queue = (wait_queue*)kalloc(sizeof(wait_queue)); queue->ticks = (int64_t)ms; add_to_list(&queue->list, &timer_queue.list, timer_queue.list.next); - __asm__ volatile ("sti;"); + enable_interrupts(); while (queue->ticks > 0) ; diff --git a/kernel/src/main.c b/kernel/src/main.c index a88dd51..106576f 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -48,11 +48,12 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) list_sys_tables(); parse_madt(); apic_remap_interrupts(); + enable_interrupts(); init_ap_cpus(); jump_userspace(); for(;;) { - __asm__ volatile ("hlt;"); + __asm__ __volatile__ ("hlt;"); } return 0; } diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index c3195de..cb9bd70 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -59,7 +59,7 @@ void init_paging(void) void page_fault(uint64_t error) { uint64_t addr; - __asm__ volatile ("mov %%cr2, %0;" : "=r"(addr) : : "memory"); + __asm__ __volatile__ ("mov %%cr2, %0;" : "=r"(addr) : : "memory"); printf("address: 0x%x, error code: 0x%x\n", addr, error); diff --git a/kernel/src/misc/graphics.c b/kernel/src/misc/graphics.c index 33dd441..7ab67f3 100644 --- a/kernel/src/misc/graphics.c +++ b/kernel/src/misc/graphics.c @@ -14,7 +14,7 @@ void fb_draw_pixel(fb_t fb, int32_t x, int32_t y, uint32_t col) if (x >= (int32_t)fb.width || y >= (int32_t)fb.height) return; uint32_t fb_offset = (uint32_t)y * fb.pitch + (uint32_t)x * fb.bpp / 8; - volatile uint32_t* fb_buff = (uint32_t*)fb.addr; + __volatile__ uint32_t* fb_buff = (uint32_t*)fb.addr; fb_buff[fb_offset / 4] = col; } diff --git a/kernel/src/scheduler/ap_startup.c b/kernel/src/scheduler/ap_startup.c index 4e70f17..f4a2055 100644 --- a/kernel/src/scheduler/ap_startup.c +++ b/kernel/src/scheduler/ap_startup.c @@ -20,6 +20,6 @@ void ap_startup(void) { unlock(cnt_lock); for(;;) { - __asm__ volatile ("hlt;"); + __asm__ __volatile__ ("hlt;"); } } diff --git a/kernel/src/scheduler/atomic.c b/kernel/src/scheduler/atomic.c index 41ce3b9..c466f0b 100644 --- a/kernel/src/scheduler/atomic.c +++ b/kernel/src/scheduler/atomic.c @@ -12,7 +12,7 @@ void init_mutex(mutex_t* mutex) bool test_and_set(mutex_t mutex, bool value) { bool rax; - __asm__ volatile ("lock xchg %%rax, (%%rbx);" : "=a"(rax) : "b"(mutex.addr), "a"(value)); + __asm__ __volatile__ ("lock xchg %%rax, (%%rbx);" : "=a"(rax) : "b"(mutex.addr), "a"(value)); return rax; } diff --git a/kernel/src/sys/syscall.c b/kernel/src/sys/syscall.c index c526e39..debd70f 100644 --- a/kernel/src/sys/syscall.c +++ b/kernel/src/sys/syscall.c @@ -8,9 +8,9 @@ void syscall_handler() uint64_t rax; uint64_t rdi; uint64_t rsi; - __asm__ volatile ("mov %%rax, %0;" : "=r"(rax) : :); - __asm__ volatile ("mov %%rdi, %0;" : "=r"(rdi) : :); - __asm__ volatile ("mov %%rsi, %0;" : "=r"(rsi) : :); + __asm__ __volatile__ ("mov %%rax, %0;" : "=r"(rax) : :); + __asm__ __volatile__ ("mov %%rdi, %0;" : "=r"(rdi) : :); + __asm__ __volatile__ ("mov %%rsi, %0;" : "=r"(rsi) : :); switch(rax) { case SYSCALL_READ: syscall_read(); diff --git a/kernel/src/sys/userspace.c b/kernel/src/sys/userspace.c index fc89746..00cd758 100644 --- a/kernel/src/sys/userspace.c +++ b/kernel/src/sys/userspace.c @@ -6,9 +6,9 @@ void begin_userspace() { // read - __asm__ volatile ("mov $0x0, %rax; syscall;"); + __asm__ __volatile__ ("mov $0x0, %rax; syscall;"); // write - __asm__ volatile ("mov $0x1, %rax; syscall;"); + __asm__ __volatile__ ("mov $0x1, %rax; syscall;"); while(true) { } |
