diff --git a/kernel/include/kernel/FS/EventFD.h b/kernel/include/kernel/FS/EventFD.h index 14416bf7..fc7e23cc 100644 --- a/kernel/include/kernel/FS/EventFD.h +++ b/kernel/include/kernel/FS/EventFD.h @@ -23,16 +23,16 @@ namespace Kernel BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan) override; - bool can_read_impl() const override { return m_value > 0; } - bool can_write_impl() const override { return m_value < UINT64_MAX - 1; } + bool can_read_impl() const override; + bool can_write_impl() const override; bool has_error_impl() const override { return false; } bool has_hungup_impl() const override { return false; } private: const bool m_is_semaphore; - BAN::Atomic m_value; + uint64_t m_value; - Mutex m_mutex; + mutable Mutex m_mutex; ThreadBlocker m_thread_blocker; }; diff --git a/kernel/include/kernel/Processor.h b/kernel/include/kernel/Processor.h index 3a6e3910..30c6266b 100644 --- a/kernel/include/kernel/Processor.h +++ b/kernel/include/kernel/Processor.h @@ -182,17 +182,23 @@ namespace Kernel } template - static T read_gs_sized(uintptr_t offset) requires(sizeof(T) <= 8 && BAN::Math::is_power_of_two(sizeof(T))) + static T read_gs_sized(uintptr_t offset) requires(sizeof(T) <= sizeof(uintptr_t) && BAN::Math::is_power_of_two(sizeof(T))) { T value; - asm volatile("mov %%gs:%a[offset], %[value]" : [value]"=r"(value) : [offset]"ir"(offset)); + if constexpr (sizeof(T) == 1 && ARCH(i686)) + asm volatile("mov %%gs:%a[offset], %[value]" : [value]"=q"(value) : [offset]"ir"(offset) : "memory"); + else + asm volatile("mov %%gs:%a[offset], %[value]" : [value]"=r"(value) : [offset]"ir"(offset) : "memory"); return value; } template - static void write_gs_sized(uintptr_t offset, T value) requires(sizeof(T) <= 8 && BAN::Math::is_power_of_two(sizeof(T))) + static void write_gs_sized(uintptr_t offset, T value) requires(sizeof(T) <= sizeof(uintptr_t) && BAN::Math::is_power_of_two(sizeof(T))) { - asm volatile("mov %[value], %%gs:%a[offset]" :: [value]"r"(value), [offset]"ir"(offset) : "memory"); + if constexpr (sizeof(T) == 1 && ARCH(i686)) + asm volatile("mov %[value], %%gs:%a[offset]" :: [value]"q"(value), [offset]"ir"(offset) : "memory"); + else + asm volatile("mov %[value], %%gs:%a[offset]" :: [value]"r"(value), [offset]"ir"(offset) : "memory"); } void lock_tlb_lock(); diff --git a/kernel/kernel/ACPI/BatterySystem.cpp b/kernel/kernel/ACPI/BatterySystem.cpp index 11a707bf..4d241633 100644 --- a/kernel/kernel/ACPI/BatterySystem.cpp +++ b/kernel/kernel/ACPI/BatterySystem.cpp @@ -36,34 +36,11 @@ namespace Kernel::ACPI if (offset < 0) return BAN::Error::from_errno(EINVAL); - if (SystemTimer::get().ms_since_boot() > m_last_read_ms + 1000) - { - auto [method_path, method_ref] = TRY(m_acpi_namespace.find_named_object(m_battery_path, m_method_name)); - if (method_ref == nullptr) - return BAN::Error::from_errno(EFAULT); - - auto result = TRY(AML::method_call(method_path, method_ref->node, BAN::Array{})); - if (result.type != AML::Node::Type::Package || result.as.package->num_elements < m_result_index) - return BAN::Error::from_errno(EFAULT); - - auto& target_elem = result.as.package->elements[m_result_index]; - if (!target_elem.resolved || !target_elem.value.node) - return BAN::Error::from_errno(EFAULT); - - auto target_conv = AML::convert_node(TRY(target_elem.value.node->copy()), AML::ConvInteger, sizeof(uint64_t)); - if (target_conv.is_error()) - return BAN::Error::from_errno(EFAULT); - - m_last_read_ms = SystemTimer::get().ms_since_boot(); - m_last_value = target_conv.value().as.integer.value; - } - - auto target_str = TRY(BAN::String::formatted("{}", m_last_value.load())); - + auto target_str = TRY(BAN::String::formatted("{}", TRY(get_value()))); if (static_cast(offset) >= target_str.size()) return 0; - const size_t ncopy = BAN::Math::min(buffer.size(), target_str.size() - offset); + const size_t ncopy = BAN::Math::min(buffer.size(), target_str.size() - offset); memcpy(buffer.data(), target_str.data() + offset, ncopy); return ncopy; } @@ -85,14 +62,44 @@ namespace Kernel::ACPI , m_result_index(index) { } + BAN::ErrorOr get_value() + { + LockGuard _(m_mutex); + + if (SystemTimer::get().ms_since_boot() < m_last_read_ms + 1000) + return m_last_value; + + auto [method_path, method_ref] = TRY(m_acpi_namespace.find_named_object(m_battery_path, m_method_name)); + if (method_ref == nullptr) + return BAN::Error::from_errno(EFAULT); + + auto result = TRY(AML::method_call(method_path, method_ref->node, BAN::Array{})); + if (result.type != AML::Node::Type::Package || result.as.package->num_elements < m_result_index) + return BAN::Error::from_errno(EFAULT); + + auto& target_elem = result.as.package->elements[m_result_index]; + if (!target_elem.resolved || !target_elem.value.node) + return BAN::Error::from_errno(EFAULT); + + auto target_conv = AML::convert_node(TRY(target_elem.value.node->copy()), AML::ConvInteger, sizeof(uint64_t)); + if (target_conv.is_error()) + return BAN::Error::from_errno(EFAULT); + + m_last_read_ms = SystemTimer::get().ms_since_boot(); + m_last_value = target_conv.value().as.integer.value; + + return m_last_value; + } + private: AML::Namespace& m_acpi_namespace; AML::Scope m_battery_path; AML::NameString m_method_name; size_t m_result_index; - BAN::Atomic m_last_read_ms = 0; - BAN::Atomic m_last_value = 0; + Mutex m_mutex; + uint64_t m_last_read_ms = 0; + uint64_t m_last_value = 0; }; BAN::ErrorOr BatterySystem::initialize(AML::Namespace& acpi_namespace) diff --git a/kernel/kernel/Banos.cpp b/kernel/kernel/Banos.cpp index b497ba26..2d840580 100644 --- a/kernel/kernel/Banos.cpp +++ b/kernel/kernel/Banos.cpp @@ -14,6 +14,8 @@ #include #include +#if ARCH(x86_64) + using namespace LibELF; using namespace Kernel; @@ -204,7 +206,7 @@ BAN::ErrorOr Banos::load_driver_from_image(const char* u_image) { // NOTE: should be more than plenty ;) extern char g_drv_builtin_begin[]; extern char g_drv_builtin_end[]; -void Banos::initialize_initial_drivers(void) { +void Banos::initialize_initial_drivers() { import_symbols(g_banos_export, g_banos_export_end - g_banos_export); char* head = g_drv_builtin_begin; while(head < g_drv_builtin_end) { @@ -213,3 +215,14 @@ void Banos::initialize_initial_drivers(void) { head += drv->driver_size; } } + +#else +void Banos::initialize_initial_drivers() +{ +} +BAN::ErrorOr Banos::load_driver_from_image(const char* u_image) +{ + (void)u_image; + return BAN::Error::from_errno(ENOTSUP); +} +#endif diff --git a/kernel/kernel/FS/EventFD.cpp b/kernel/kernel/FS/EventFD.cpp index 6db4bc0c..e4b007ac 100644 --- a/kernel/kernel/FS/EventFD.cpp +++ b/kernel/kernel/FS/EventFD.cpp @@ -44,7 +44,7 @@ namespace Kernel while (m_value == 0) TRY(Thread::current().block_or_eintr_indefinite(m_thread_blocker, &m_mutex)); - const uint64_t read_value = m_is_semaphore ? 1 : m_value.load(); + const uint64_t read_value = m_is_semaphore ? 1 : m_value; m_value -= read_value; buffer.as() = read_value; @@ -80,4 +80,16 @@ namespace Kernel return sizeof(uint64_t); } + bool EventFD::can_read_impl() const + { + LockGuard _(m_mutex); + return m_value > 0; + } + + bool EventFD::can_write_impl() const + { + LockGuard _(m_mutex); + return m_value < UINT64_MAX - 1; + } + } diff --git a/kernel/kernel/Memory/FileBackedRegion.cpp b/kernel/kernel/Memory/FileBackedRegion.cpp index 8a2ac801..38cd95ef 100644 --- a/kernel/kernel/Memory/FileBackedRegion.cpp +++ b/kernel/kernel/Memory/FileBackedRegion.cpp @@ -115,7 +115,7 @@ namespace Kernel return {}; const vaddr_t first_page = BAN::Math::max(m_vaddr, address) & PAGE_ADDR_MASK; - const vaddr_t last_page = BAN::Math::div_round_up(BAN::Math::min(m_vaddr + m_size, address + size), PAGE_SIZE) * PAGE_SIZE; + const vaddr_t last_page = BAN::Math::div_round_up(BAN::Math::min(m_vaddr + m_size, address + size), PAGE_SIZE) * PAGE_SIZE; RWLockRDGuard _(m_shared_data->rw_lock); for (vaddr_t page_addr = first_page; page_addr < last_page; page_addr += PAGE_SIZE) diff --git a/kernel/kernel/Memory/SharedMemoryObject.cpp b/kernel/kernel/Memory/SharedMemoryObject.cpp index d97a7aab..3bc2a9b0 100644 --- a/kernel/kernel/Memory/SharedMemoryObject.cpp +++ b/kernel/kernel/Memory/SharedMemoryObject.cpp @@ -117,7 +117,7 @@ namespace Kernel .shm_dtime = 0, .shm_ctime = SystemTimer::get().real_time().tv_sec, })); - TRY(object->paddrs.resize(BAN::Math::div_round_up(size, PAGE_SIZE), 0)); + TRY(object->paddrs.resize(BAN::Math::div_round_up(size, PAGE_SIZE), 0)); if (key != IPC_PRIVATE) TRY(m_ids.insert(key, shmid)); diff --git a/kernel/kernel/Storage/ATA/AHCI/Device.cpp b/kernel/kernel/Storage/ATA/AHCI/Device.cpp index f97c994e..4108949e 100644 --- a/kernel/kernel/Storage/ATA/AHCI/Device.cpp +++ b/kernel/kernel/Storage/ATA/AHCI/Device.cpp @@ -302,7 +302,7 @@ namespace Kernel const vaddr_t buffer_vaddr = reinterpret_cast(buffer.data()); const paddr_t buffer_paddr = to_paddr(buffer_vaddr); - const size_t bytes = BAN::Math::min(buffer.size(), PAGE_SIZE - buffer_vaddr % PAGE_SIZE); + const size_t bytes = BAN::Math::min(buffer.size(), PAGE_SIZE - buffer_vaddr % PAGE_SIZE); bool can_extend = true; if (prdt_count == 0)