summaryrefslogtreecommitdiff
path: root/kernel/src/arch/x86_64/cpu/smp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/arch/x86_64/cpu/smp.cpp')
-rw-r--r--kernel/src/arch/x86_64/cpu/smp.cpp88
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