Kernel: Fix 32 bit target compilation
banos is written with only 64 bit in mind so it has to be disabled
This commit is contained in:
@@ -23,16 +23,16 @@ namespace Kernel
|
|||||||
BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
||||||
BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||||
|
|
||||||
bool can_read_impl() const override { return m_value > 0; }
|
bool can_read_impl() const override;
|
||||||
bool can_write_impl() const override { return m_value < UINT64_MAX - 1; }
|
bool can_write_impl() const override;
|
||||||
bool has_error_impl() const override { return false; }
|
bool has_error_impl() const override { return false; }
|
||||||
bool has_hungup_impl() const override { return false; }
|
bool has_hungup_impl() const override { return false; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const bool m_is_semaphore;
|
const bool m_is_semaphore;
|
||||||
BAN::Atomic<uint64_t> m_value;
|
uint64_t m_value;
|
||||||
|
|
||||||
Mutex m_mutex;
|
mutable Mutex m_mutex;
|
||||||
ThreadBlocker m_thread_blocker;
|
ThreadBlocker m_thread_blocker;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -182,17 +182,23 @@ namespace Kernel
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
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;
|
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;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
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();
|
void lock_tlb_lock();
|
||||||
|
|||||||
@@ -36,34 +36,11 @@ namespace Kernel::ACPI
|
|||||||
if (offset < 0)
|
if (offset < 0)
|
||||||
return BAN::Error::from_errno(EINVAL);
|
return BAN::Error::from_errno(EINVAL);
|
||||||
|
|
||||||
if (SystemTimer::get().ms_since_boot() > m_last_read_ms + 1000)
|
auto target_str = TRY(BAN::String::formatted("{}", TRY(get_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<AML::Reference*, 7>{}));
|
|
||||||
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()));
|
|
||||||
|
|
||||||
if (static_cast<size_t>(offset) >= target_str.size())
|
if (static_cast<size_t>(offset) >= target_str.size())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
const size_t ncopy = BAN::Math::min(buffer.size(), target_str.size() - offset);
|
const size_t ncopy = BAN::Math::min<size_t>(buffer.size(), target_str.size() - offset);
|
||||||
memcpy(buffer.data(), target_str.data() + offset, ncopy);
|
memcpy(buffer.data(), target_str.data() + offset, ncopy);
|
||||||
return ncopy;
|
return ncopy;
|
||||||
}
|
}
|
||||||
@@ -85,14 +62,44 @@ namespace Kernel::ACPI
|
|||||||
, m_result_index(index)
|
, m_result_index(index)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
BAN::ErrorOr<uint64_t> 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<AML::Reference*, 7>{}));
|
||||||
|
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:
|
private:
|
||||||
AML::Namespace& m_acpi_namespace;
|
AML::Namespace& m_acpi_namespace;
|
||||||
AML::Scope m_battery_path;
|
AML::Scope m_battery_path;
|
||||||
AML::NameString m_method_name;
|
AML::NameString m_method_name;
|
||||||
size_t m_result_index;
|
size_t m_result_index;
|
||||||
|
|
||||||
BAN::Atomic<uint64_t> m_last_read_ms = 0;
|
Mutex m_mutex;
|
||||||
BAN::Atomic<uint64_t> m_last_value = 0;
|
uint64_t m_last_read_ms = 0;
|
||||||
|
uint64_t m_last_value = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
BAN::ErrorOr<void> BatterySystem::initialize(AML::Namespace& acpi_namespace)
|
BAN::ErrorOr<void> BatterySystem::initialize(AML::Namespace& acpi_namespace)
|
||||||
|
|||||||
+14
-1
@@ -14,6 +14,8 @@
|
|||||||
#include <kernel/Lock/SpinLock.h>
|
#include <kernel/Lock/SpinLock.h>
|
||||||
#include <kernel/UserCopy.h>
|
#include <kernel/UserCopy.h>
|
||||||
|
|
||||||
|
#if ARCH(x86_64)
|
||||||
|
|
||||||
using namespace LibELF;
|
using namespace LibELF;
|
||||||
using namespace Kernel;
|
using namespace Kernel;
|
||||||
|
|
||||||
@@ -204,7 +206,7 @@ BAN::ErrorOr<size_t> Banos::load_driver_from_image(const char* u_image) {
|
|||||||
// NOTE: should be more than plenty ;)
|
// NOTE: should be more than plenty ;)
|
||||||
extern char g_drv_builtin_begin[];
|
extern char g_drv_builtin_begin[];
|
||||||
extern char g_drv_builtin_end[];
|
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);
|
import_symbols(g_banos_export, g_banos_export_end - g_banos_export);
|
||||||
char* head = g_drv_builtin_begin;
|
char* head = g_drv_builtin_begin;
|
||||||
while(head < g_drv_builtin_end) {
|
while(head < g_drv_builtin_end) {
|
||||||
@@ -213,3 +215,14 @@ void Banos::initialize_initial_drivers(void) {
|
|||||||
head += drv->driver_size;
|
head += drv->driver_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
void Banos::initialize_initial_drivers()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
BAN::ErrorOr<size_t> Banos::load_driver_from_image(const char* u_image)
|
||||||
|
{
|
||||||
|
(void)u_image;
|
||||||
|
return BAN::Error::from_errno(ENOTSUP);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace Kernel
|
|||||||
while (m_value == 0)
|
while (m_value == 0)
|
||||||
TRY(Thread::current().block_or_eintr_indefinite(m_thread_blocker, &m_mutex));
|
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;
|
m_value -= read_value;
|
||||||
|
|
||||||
buffer.as<uint64_t>() = read_value;
|
buffer.as<uint64_t>() = read_value;
|
||||||
@@ -80,4 +80,16 @@ namespace Kernel
|
|||||||
return sizeof(uint64_t);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ namespace Kernel
|
|||||||
return {};
|
return {};
|
||||||
|
|
||||||
const vaddr_t first_page = BAN::Math::max(m_vaddr, address) & PAGE_ADDR_MASK;
|
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<vaddr_t>(BAN::Math::min(m_vaddr + m_size, address + size), PAGE_SIZE) * PAGE_SIZE;
|
||||||
|
|
||||||
RWLockRDGuard _(m_shared_data->rw_lock);
|
RWLockRDGuard _(m_shared_data->rw_lock);
|
||||||
for (vaddr_t page_addr = first_page; page_addr < last_page; page_addr += PAGE_SIZE)
|
for (vaddr_t page_addr = first_page; page_addr < last_page; page_addr += PAGE_SIZE)
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ namespace Kernel
|
|||||||
.shm_dtime = 0,
|
.shm_dtime = 0,
|
||||||
.shm_ctime = SystemTimer::get().real_time().tv_sec,
|
.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_t>(size, PAGE_SIZE), 0));
|
||||||
|
|
||||||
if (key != IPC_PRIVATE)
|
if (key != IPC_PRIVATE)
|
||||||
TRY(m_ids.insert(key, shmid));
|
TRY(m_ids.insert(key, shmid));
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ namespace Kernel
|
|||||||
const vaddr_t buffer_vaddr = reinterpret_cast<vaddr_t>(buffer.data());
|
const vaddr_t buffer_vaddr = reinterpret_cast<vaddr_t>(buffer.data());
|
||||||
const paddr_t buffer_paddr = to_paddr(buffer_vaddr);
|
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<size_t>(buffer.size(), PAGE_SIZE - buffer_vaddr % PAGE_SIZE);
|
||||||
|
|
||||||
bool can_extend = true;
|
bool can_extend = true;
|
||||||
if (prdt_count == 0)
|
if (prdt_count == 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user