mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-16 09:41:45 +00:00
Update kernel
This commit is contained in:
@@ -17,29 +17,35 @@
|
||||
|
||||
#include <bitmap.hpp>
|
||||
|
||||
bool Bitmap::operator[](uint64_t index) { return Get(index); }
|
||||
|
||||
bool Bitmap::Get(uint64_t index)
|
||||
{
|
||||
if (index > Size * 8)
|
||||
return false;
|
||||
uint64_t byteIndex = index / 8;
|
||||
uint8_t bitIndex = index % 8;
|
||||
uint8_t bitIndexer = 0b10000000 >> bitIndex;
|
||||
if ((Buffer[byteIndex] & bitIndexer) > 0)
|
||||
return true;
|
||||
return false;
|
||||
if (index > Size * 8)
|
||||
return false;
|
||||
|
||||
uint64_t byteIndex = index / 8;
|
||||
uint8_t bitIndex = index % 8;
|
||||
uint8_t bitIndexer = 0b10000000 >> bitIndex;
|
||||
|
||||
if ((Buffer[byteIndex] & bitIndexer) > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Bitmap::Set(uint64_t index, bool value)
|
||||
{
|
||||
if (index > Size * 8)
|
||||
return false;
|
||||
uint64_t byteIndex = index / 8;
|
||||
uint8_t bitIndex = index % 8;
|
||||
uint8_t bitIndexer = 0b10000000 >> bitIndex;
|
||||
Buffer[byteIndex] &= ~bitIndexer;
|
||||
if (value)
|
||||
Buffer[byteIndex] |= bitIndexer;
|
||||
return true;
|
||||
if (index > Size * 8)
|
||||
return false;
|
||||
|
||||
uint64_t byteIndex = index / 8;
|
||||
uint8_t bitIndex = index % 8;
|
||||
uint8_t bitIndexer = 0b10000000 >> bitIndex;
|
||||
|
||||
Buffer[byteIndex] &= ~bitIndexer;
|
||||
if (value)
|
||||
Buffer[byteIndex] |= bitIndexer;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Bitmap::operator[](uint64_t index) { return this->Get(index); }
|
||||
|
@@ -474,6 +474,7 @@ size_t wcslen(const wchar_t *s)
|
||||
|
||||
size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
|
||||
{
|
||||
UNUSED(ps);
|
||||
size_t count = 0;
|
||||
|
||||
while (len > 0)
|
||||
@@ -792,21 +793,31 @@ EXTERNC __no_stack_protector void *__memcpy_chk(void *dest, const void *src, siz
|
||||
__chk_fail();
|
||||
|
||||
void *ret = nullptr;
|
||||
uint64_t simd = CPU::CheckSIMD();
|
||||
if (simd & CPU::x86SIMDType::SIMD_SSE42)
|
||||
ret = memcpy_sse4_2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE41)
|
||||
ret = memcpy_sse4_1(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSSE3)
|
||||
ret = memcpy_ssse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE3)
|
||||
ret = memcpy_sse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE2)
|
||||
ret = memcpy_sse2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE)
|
||||
ret = memcpy_sse(dest, src, len);
|
||||
if (0) /* FIXME */
|
||||
{
|
||||
uint64_t simd = CPU::CheckSIMD();
|
||||
if (simd & CPU::x86SIMDType::SIMD_SSE42)
|
||||
ret = memcpy_sse4_2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE41)
|
||||
ret = memcpy_sse4_1(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSSE3)
|
||||
ret = memcpy_ssse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE3)
|
||||
ret = memcpy_sse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE2)
|
||||
ret = memcpy_sse2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE)
|
||||
ret = memcpy_sse(dest, src, len);
|
||||
else
|
||||
ret = memcpy_unsafe(dest, src, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
static int once = 0;
|
||||
if (!once++)
|
||||
fixme("SIMD memcpy disabled");
|
||||
ret = memcpy_unsafe(dest, src, len);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if (EnableExternalMemoryTracer)
|
||||
{
|
||||
@@ -857,21 +868,31 @@ EXTERNC __no_stack_protector void *__memset_chk(void *dest, int val, size_t len,
|
||||
__chk_fail();
|
||||
|
||||
void *ret = nullptr;
|
||||
uint64_t simd = CPU::CheckSIMD();
|
||||
if (simd & CPU::x86SIMDType::SIMD_SSE42)
|
||||
ret = memset_sse4_2(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE41)
|
||||
ret = memset_sse4_1(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSSE3)
|
||||
ret = memset_ssse3(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE3)
|
||||
ret = memset_sse3(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE2)
|
||||
ret = memset_sse2(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE)
|
||||
ret = memset_sse(dest, val, len);
|
||||
if (0) /* FIXME */
|
||||
{
|
||||
uint64_t simd = CPU::CheckSIMD();
|
||||
if (simd & CPU::x86SIMDType::SIMD_SSE42)
|
||||
ret = memset_sse4_2(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE41)
|
||||
ret = memset_sse4_1(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSSE3)
|
||||
ret = memset_ssse3(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE3)
|
||||
ret = memset_sse3(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE2)
|
||||
ret = memset_sse2(dest, val, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE)
|
||||
ret = memset_sse(dest, val, len);
|
||||
else
|
||||
ret = memset_unsafe(dest, val, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
static int once = 0;
|
||||
if (!once++)
|
||||
fixme("SIMD memset disabled");
|
||||
ret = memset_unsafe(dest, val, len);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if (EnableExternalMemoryTracer)
|
||||
{
|
||||
@@ -928,21 +949,31 @@ EXTERNC __no_stack_protector void *__memmove_chk(void *dest, const void *src, si
|
||||
__chk_fail();
|
||||
|
||||
void *ret = nullptr;
|
||||
uint64_t simd = CPU::CheckSIMD();
|
||||
if (simd & CPU::x86SIMDType::SIMD_SSE42)
|
||||
ret = memmove_sse4_2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE41)
|
||||
ret = memmove_sse4_1(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSSE3)
|
||||
ret = memmove_ssse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE3)
|
||||
ret = memmove_sse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE2)
|
||||
ret = memmove_sse2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE)
|
||||
ret = memmove_sse(dest, src, len);
|
||||
if (0) /* FIXME */
|
||||
{
|
||||
uint64_t simd = CPU::CheckSIMD();
|
||||
if (simd & CPU::x86SIMDType::SIMD_SSE42)
|
||||
ret = memmove_sse4_2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE41)
|
||||
ret = memmove_sse4_1(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSSE3)
|
||||
ret = memmove_ssse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE3)
|
||||
ret = memmove_sse3(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE2)
|
||||
ret = memmove_sse2(dest, src, len);
|
||||
else if (simd & CPU::x86SIMDType::SIMD_SSE)
|
||||
ret = memmove_sse(dest, src, len);
|
||||
else
|
||||
ret = memmove_unsafe(dest, src, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
static int once = 0;
|
||||
if (!once++)
|
||||
fixme("SIMD memmove disabled");
|
||||
ret = memmove_unsafe(dest, src, len);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if (EnableExternalMemoryTracer)
|
||||
{
|
||||
|
@@ -37,10 +37,25 @@ namespace __cxxabiv1
|
||||
return &GetCurrentCPU()->EHGlobals;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param f The destructor
|
||||
* @param objptr The object to be destructed
|
||||
* @param dso The DSO from which the object was obtained (unused in our case)
|
||||
* @return Zero on success, non-zero on failure
|
||||
*/
|
||||
extern "C" int __cxa_atexit(void (*f)(void *), void *objptr, void *dso)
|
||||
{
|
||||
debug("Registering atexit function %p( %p, %p )",
|
||||
f, objptr, dso);
|
||||
if (KernelSymbolTable)
|
||||
{
|
||||
debug("Registering atexit function for \"%s\" with destructor \"%s\"",
|
||||
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)objptr),
|
||||
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)f));
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("Registering atexit function for %p with destructor %p",
|
||||
objptr, f);
|
||||
}
|
||||
|
||||
if (__atexit_func_count >= ATEXIT_MAX_FUNCS)
|
||||
return -1;
|
||||
@@ -53,23 +68,38 @@ namespace __cxxabiv1
|
||||
|
||||
extern "C" void __cxa_finalize(void *f)
|
||||
{
|
||||
fixme("__cxa_finalize( %p ) called.", f);
|
||||
function("%p", f);
|
||||
uarch_t i = __atexit_func_count;
|
||||
if (!f)
|
||||
if (f == nullptr)
|
||||
{
|
||||
while (i--)
|
||||
{
|
||||
if (__atexit_funcs[i].destructor_func)
|
||||
{
|
||||
if (KernelSymbolTable)
|
||||
{
|
||||
debug("Calling atexit function \"%s\"",
|
||||
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__atexit_funcs[i].destructor_func));
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("Calling atexit function %p",
|
||||
__atexit_funcs[i].destructor_func);
|
||||
}
|
||||
(*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr);
|
||||
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
while (i--)
|
||||
{
|
||||
if (__atexit_funcs[i].destructor_func == f)
|
||||
{
|
||||
(*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr);
|
||||
__atexit_funcs[i].destructor_func = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" _Unwind_Reason_Code __gxx_personality_v0(int version, _Unwind_Action actions, _Unwind_Exception_Class exception_class, _Unwind_Exception *ue_header, _Unwind_Context *context)
|
||||
@@ -122,8 +152,8 @@ namespace __cxxabiv1
|
||||
{
|
||||
if (TaskManager && !TaskManager->IsPanic())
|
||||
{
|
||||
TaskManager->KillThread(TaskManager->GetCurrentThread(), Tasking::KILL_CXXABI_EXCEPTION);
|
||||
TaskManager->Schedule();
|
||||
TaskManager->KillThread(thisThread, Tasking::KILL_CXXABI_EXCEPTION);
|
||||
TaskManager->Yield();
|
||||
}
|
||||
|
||||
error("No task manager to kill thread!");
|
||||
|
@@ -26,6 +26,9 @@ namespace __cxxabiv1
|
||||
unsigned outer) const
|
||||
{
|
||||
#ifndef __GXX_RTTI
|
||||
UNUSED(ThrowType);
|
||||
UNUSED(ThrowObject);
|
||||
UNUSED(outer);
|
||||
return false;
|
||||
#else
|
||||
if (*this == *ThrowType)
|
||||
|
@@ -28,6 +28,9 @@ namespace __cxxabiv1
|
||||
unsigned Outer) const
|
||||
{
|
||||
#ifndef __GXX_RTTI
|
||||
UNUSED(ThrownType);
|
||||
UNUSED(ThrowObject);
|
||||
UNUSED(Outer);
|
||||
return false;
|
||||
#else
|
||||
if (Outer < 2 && *this->Pointee == typeid(void))
|
||||
|
@@ -19,9 +19,15 @@
|
||||
|
||||
#include <types.h>
|
||||
#include <debug.h>
|
||||
#include <atomic>
|
||||
|
||||
#include "../../kernel.h"
|
||||
|
||||
__aligned(16) static int errno_value = 0;
|
||||
|
||||
int *__errno_location(void)
|
||||
{
|
||||
fixme("errno_location() is not implemented yet!");
|
||||
return nullptr;
|
||||
if (unlikely(!TaskManager || !thisThread))
|
||||
return &errno_value;
|
||||
return &thisThread->ErrorNumber;
|
||||
}
|
||||
|
81
Library/std/mutex.cpp
Normal file
81
Library/std/mutex.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
This file is part of Fennix Kernel.
|
||||
|
||||
Fennix Kernel is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix Kernel is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <mutex>
|
||||
|
||||
#include <algorithm>
|
||||
#include <assert.h>
|
||||
#include <cpu.hpp>
|
||||
|
||||
#include "../../kernel.h"
|
||||
|
||||
using namespace Tasking;
|
||||
|
||||
namespace std
|
||||
{
|
||||
void mutex::lock()
|
||||
{
|
||||
bool Result = this->Locked.exchange(true, std::memory_order_acquire);
|
||||
__sync;
|
||||
|
||||
if (Result)
|
||||
{
|
||||
this->Waiting.push_back(thisThread);
|
||||
thisThread->Block();
|
||||
TaskManager->Yield();
|
||||
return;
|
||||
}
|
||||
|
||||
this->Holder = thisThread;
|
||||
this->Waiting.erase(std::find(this->Waiting.begin(),
|
||||
this->Waiting.end(),
|
||||
thisThread));
|
||||
}
|
||||
|
||||
bool mutex::try_lock()
|
||||
{
|
||||
bool Result = this->Locked.exchange(true, std::memory_order_acquire);
|
||||
__sync;
|
||||
|
||||
if (!Result)
|
||||
{
|
||||
this->Holder = thisThread;
|
||||
this->Waiting.erase(std::find(this->Waiting.begin(),
|
||||
this->Waiting.end(),
|
||||
thisThread));
|
||||
}
|
||||
return !Result;
|
||||
}
|
||||
|
||||
void mutex::unlock()
|
||||
{
|
||||
__sync;
|
||||
this->Locked.store(false, std::memory_order_release);
|
||||
|
||||
if (!this->Waiting.empty())
|
||||
{
|
||||
this->Holder = this->Waiting[0];
|
||||
|
||||
this->Holder = this->Waiting.front();
|
||||
this->Waiting.erase(this->Waiting.begin());
|
||||
this->Holder->Unblock();
|
||||
TaskManager->Yield();
|
||||
}
|
||||
else
|
||||
this->Holder = nullptr;
|
||||
}
|
||||
}
|
@@ -27,6 +27,9 @@ namespace std
|
||||
unsigned Outer) const
|
||||
{
|
||||
stub;
|
||||
UNUSED(ThrowType);
|
||||
UNUSED(ThrowObject);
|
||||
UNUSED(Outer);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -34,6 +37,8 @@ namespace std
|
||||
void **ObjectPointer) const
|
||||
{
|
||||
stub;
|
||||
UNUSED(Target);
|
||||
UNUSED(ObjectPointer);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user