Skip to content

Commit

Permalink
Small refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
djphoenix committed Apr 20, 2017
1 parent f50e784 commit 831048b
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 16 deletions.
5 changes: 2 additions & 3 deletions src/platform/interrupts.cpp
Expand Up @@ -321,7 +321,7 @@ void Interrupts::init() {
"mov %%ax, %%gs;"
::"r"(&gdtreg):"rax", "rcx");

const char* addr;
uintptr_t addr;
char *lapic_eoi =
reinterpret_cast<char*>(ACPI::getController()->getLapicAddr());
if (lapic_eoi) lapic_eoi += LAPIC_EOI;
Expand All @@ -334,8 +334,7 @@ void Interrupts::init() {
);
for (int i = 0; i < 256; i++) {
uintptr_t jmp_from = (uintptr_t)&(handlers[i].reljmp);
uintptr_t jmp_to = (uintptr_t)addr;
uintptr_t diff = jmp_to - jmp_from - 5;
uintptr_t diff = addr - jmp_from - 5;
handlers[i] = int_handler(i, diff);

uintptr_t hptr = (uintptr_t)(&handlers[i]);
Expand Down
7 changes: 6 additions & 1 deletion src/platform/smp.cpp
Expand Up @@ -21,17 +21,22 @@
class SMP {
private:
static Mutex startupMutex;
static void setup();
static void NORETURN startup();
static void init();
};

Mutex SMP::startupMutex;

void SMP::startup() {
void SMP::setup() {
Interrupts::loadVector();
ACPI::getController()->activateCPU();
startupMutex.lock();
startupMutex.release();
}

void SMP::startup() {
setup();
ProcessManager::process_loop();
}

Expand Down
18 changes: 6 additions & 12 deletions src/process/processmanager.cpp
Expand Up @@ -18,14 +18,11 @@

#include "acpi.hpp"

void ProcessManager::process_loop() {
void __attribute((naked)) ProcessManager::process_loop() {
asm volatile(
"_loop:"
"hlt;"
"jmp _loop;"
"_loop_top:"
"1: hlt; jmp 1b;"
"process_loop_top:"
);
for (;;) {}
}

Mutex ProcessManager::managerMutex;
Expand Down Expand Up @@ -60,11 +57,8 @@ bool ProcessManager::FaultHandler(
}
bool ProcessManager::SwitchProcess(intcb_regs *regs) {
processSwitchMutex.lock();
uintptr_t loopbase, looptop;
asm volatile(
"lea _loop(%%rip), %0;"
"lea _loop_top(%%rip), %1":
"=r"(loopbase),"=r"(looptop));
uintptr_t loopbase = (uintptr_t)&process_loop, looptop;
asm volatile("lea process_loop_top(%%rip), %q0":"=r"(looptop));
if (regs->dpl == 0 &&
(regs->rip < loopbase || regs->rip >= looptop)) {
processSwitchMutex.release();
Expand Down Expand Up @@ -140,7 +134,7 @@ bool ProcessManager::HandleFault(
t = EnterCritical();
processSwitchMutex.lock();
asm volatile("mov %%cr3, %0":"=r"(regs->cr3));
asm volatile("lea _loop(%%rip), %0":"=r"(regs->rip));
regs->rip = (uintptr_t)&process_loop;
regs->cs = 0x08;
regs->ss = 0x10;
regs->dpl = 0;
Expand Down

0 comments on commit 831048b

Please sign in to comment.