diff options
Diffstat (limited to 'kernel/src/arch/x86_64/cpu/smp.cpp')
| -rw-r--r-- | kernel/src/arch/x86_64/cpu/smp.cpp | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/kernel/src/arch/x86_64/cpu/smp.cpp b/kernel/src/arch/x86_64/cpu/smp.cpp deleted file mode 100644 index a06f4c5..0000000 --- a/kernel/src/arch/x86_64/cpu/smp.cpp +++ /dev/null @@ -1,88 +0,0 @@ - -#include <cstdint> - -#include <arch/x86_64/cpu/smp.hpp> -#include <generic/time.hpp> - -#include <arch/x86_64/cpu/data.hpp> - -#include <arch/x86_64/cpu/gdt.hpp> -#include <arch/x86_64/cpu/lapic.hpp> -#include <arch/x86_64/interrupts/idt.hpp> -#include <generic/mm/paging.hpp> - -#include <generic/locks/spinlock.hpp> -#include <etc/bootloaderinfo.hpp> - -#include <drivers/tsc.hpp> - -#include <arch/x86_64/syscalls/syscalls.hpp> - -#include <arch/x86_64/cpu/sse.hpp> - -#include <etc/logging.hpp> - -#include <etc/libc.hpp> - -#include <limine.h> - -#include <drivers/io.hpp> - -#include <atomic> - -using namespace arch::x86_64::cpu; - -int balance_how_much_cpus = 1; - -int how_much_cpus = 1; -std::atomic<int> temp_how_much_cpus[12]; - -locks::spinlock mp_lock; - -void mp::sync(std::uint8_t id) { - if(how_much_cpus != 1) { - temp_how_much_cpus[id].fetch_add(1, std::memory_order_acq_rel); - while (how_much_cpus != temp_how_much_cpus[id].load(std::memory_order_acquire)) { - asm volatile("nop"); - } - time::sleep(1000*1000); // perform 1 second sleep - temp_how_much_cpus[id].store(0, std::memory_order_release); - } -} - -void __mp_bootstrap(struct LIMINE_MP(info)* smp_info) { - mp_lock.lock(); - memory::paging::enablekernel(); - arch::x86_64::interrupts::idt::load(); - arch::x86_64::cpu::gdt::init(); - drivers::tsc::init(); - - arch::x86_64::cpu::data()->smp.cpu_id = balance_how_much_cpus++; - - arch::x86_64::cpu::data()->lapic_block = arch::x86_64::cpu::lapic::init(15000); - arch::x86_64::cpu::sse::init(); - arch::x86_64::syscall::init(); - Log::Display(LEVEL_MESSAGE_OK,"Cpu %d is online \n",arch::x86_64::cpu::data()->smp.cpu_id); - arch::x86_64::cpu::lapic::tick(arch::x86_64::cpu::data()->lapic_block); - mp_lock.unlock(); - setwp(); - mp::sync(0); - mp::sync(1); - asm volatile("sti"); - while(1) { - asm volatile("hlt"); - } -} - -void mp::init() { - struct LIMINE_MP(response)* mp_info = BootloaderInfo::AccessMP(); - - how_much_cpus = mp_info->cpu_count; - - memset(temp_how_much_cpus,0,4*12); - for(std::uint16_t i = 0;i < mp_info->cpu_count;i++) { - if(mp_info->bsp_lapic_id != i) { - mp_info->cpus[i]->goto_address = __mp_bootstrap; - } - } -}
\ No newline at end of file |
