From 33f286000db35fe50639c237caa736deea304585 Mon Sep 17 00:00:00 2001 From: johannst Date: Tue, 22 Sep 2020 23:48:09 +0200 Subject: split classes into separate files, add arch specific subdir --- lib/matcha.cc | 65 ----------------------------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 lib/matcha.cc (limited to 'lib/matcha.cc') diff --git a/lib/matcha.cc b/lib/matcha.cc deleted file mode 100644 index 4315e9e..0000000 --- a/lib/matcha.cc +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 2020 Johannes Stoelp */ - -#include "matcha.h" - -#include -#include -#include -#include // sysconf - -// asm fns -extern "C" void thread_create(); -extern "C" void yield(const void* new_stack, void* const* old_stack); - -long get_pagesize() { - return sysconf(_SC_PAGESIZE); -} - -Thread::Thread() { - const long PAGE_SIZE = get_pagesize(); - const long STACK_SIZE = 8 * PAGE_SIZE; - - // create new stack - void* stack = mmap(nullptr, STACK_SIZE, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1 /* fd */, 0 /* offset */); - assert(stack != MAP_FAILED); - - // protect last stack page (lowest addr) - int ret = mprotect(stack, PAGE_SIZE, PROT_NONE); - assert(ret == 0); - - // stack grows downwards - mStackPtr = static_cast(stack) + STACK_SIZE; - { - uint64_t* stack = static_cast(mStackPtr); - *(--stack) = (uint64_t)this; - *(--stack) = (uint64_t)Thread::entry; - - // initial values for yield epilog - *(--stack) = (uint64_t)thread_create; - *(--stack) = (uint64_t)0; - - // initial values for callee saved regs - *(--stack) = (uint64_t)0; // rbx - *(--stack) = (uint64_t)(static_cast(mStackPtr) - 4); // rbp - *(--stack) = (uint64_t)0; // r12 - *(--stack) = (uint64_t)0; // r13 - *(--stack) = (uint64_t)0; // r14 - *(--stack) = (uint64_t)0; // r15 - - mStackPtr = static_cast(stack); - } -} - -void Thread::entry(void* obj) { - Thread* t = static_cast(obj); - t->threadFn(); -} - -void Thread::yield() { - assert(mExecutor); - ::yield(mExecutor->getStackPtr(), &mStackPtr); -} - -void Executor::yield_to(const Thread* t) const { - ::yield(t->mStackPtr, &mStackPtr); -} -- cgit v1.2.3