diff --git a/kernel/include/kernel/Networking/ARPTable.h b/kernel/include/kernel/Networking/ARPTable.h index ae93f6d7..3a420dc6 100644 --- a/kernel/include/kernel/Networking/ARPTable.h +++ b/kernel/include/kernel/Networking/ARPTable.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include namespace Kernel @@ -56,9 +56,9 @@ namespace Kernel BAN::HashMap m_arp_table; - Process* m_process = nullptr; + Thread* m_thread { nullptr }; BAN::CircularQueue m_pending_packets; - ThreadBlocker m_pending_thread_blocker; + ThreadBlocker m_pending_thread_blocker; friend class BAN::UniqPtr; }; diff --git a/kernel/include/kernel/Networking/IPv4Layer.h b/kernel/include/kernel/Networking/IPv4Layer.h index b8c23c6a..9f3f51e4 100644 --- a/kernel/include/kernel/Networking/IPv4Layer.h +++ b/kernel/include/kernel/Networking/IPv4Layer.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace Kernel { @@ -72,7 +72,7 @@ namespace Kernel RecursiveSpinLock m_bound_socket_lock; BAN::UniqPtr m_arp_table; - Process* m_process { nullptr }; + Thread* m_thread { nullptr }; static constexpr size_t pending_packet_buffer_size = 128 * PAGE_SIZE; BAN::UniqPtr m_pending_packet_buffer; diff --git a/kernel/include/kernel/Networking/TCPSocket.h b/kernel/include/kernel/Networking/TCPSocket.h index caf3624a..746dcf03 100644 --- a/kernel/include/kernel/Networking/TCPSocket.h +++ b/kernel/include/kernel/Networking/TCPSocket.h @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include namespace Kernel @@ -162,7 +162,7 @@ namespace Kernel State m_next_state { State::Closed }; uint8_t m_next_flags { 0 }; - Process* m_process { nullptr }; + Thread* m_thread { nullptr }; uint64_t m_time_wait_start_ms { 0 }; diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 5baffbd3..c58f03c4 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -39,8 +39,6 @@ namespace Kernel using entry_t = Thread::entry_t; public: - static Process* create_kernel(); - static Process* create_kernel(entry_t, void*); static BAN::ErrorOr create_userspace(const Credentials&, BAN::StringView path, BAN::Span arguments); ~Process(); void cleanup_function(Thread*); @@ -217,8 +215,6 @@ namespace Kernel size_t proc_cmdline(off_t offset, BAN::ByteSpan) const; size_t proc_environ(off_t offset, BAN::ByteSpan) const; - bool is_userspace() const { return m_is_userspace; } - // Returns error if page could not be allocated // Returns true if the page was allocated successfully // Return false if access was page violation (segfault) @@ -331,8 +327,6 @@ namespace Kernel BAN::Vector m_cmdline; BAN::Vector m_environ; - bool m_is_userspace { false }; - BAN::Vector m_child_exit_statuses; ThreadBlocker m_child_exit_blocker; diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index 630790be..362ff962 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -36,7 +36,7 @@ namespace Kernel static constexpr size_t userspace_stack_size { PAGE_SIZE * 128 }; public: - static BAN::ErrorOr create_kernel(entry_t, void*, Process*); + static BAN::ErrorOr create_kernel(entry_t, void*); static BAN::ErrorOr create_userspace(Process*, PageTable&); ~Thread(); diff --git a/kernel/include/kernel/USB/Hub/HubDriver.h b/kernel/include/kernel/USB/Hub/HubDriver.h index 838ec70f..66c8f54b 100644 --- a/kernel/include/kernel/USB/Hub/HubDriver.h +++ b/kernel/include/kernel/USB/Hub/HubDriver.h @@ -34,7 +34,7 @@ namespace Kernel BAN::Atomic m_changed_ports { 0 }; ThreadBlocker m_changed_port_blocker; - BAN::Atomic m_port_updater { nullptr }; + BAN::Atomic m_port_updater { nullptr }; struct PortInfo { diff --git a/kernel/include/kernel/USB/XHCI/Controller.h b/kernel/include/kernel/USB/XHCI/Controller.h index 1ee724a1..41f98f80 100644 --- a/kernel/include/kernel/USB/XHCI/Controller.h +++ b/kernel/include/kernel/USB/XHCI/Controller.h @@ -73,7 +73,7 @@ namespace Kernel Mutex m_mutex; - BAN::Atomic m_port_updater { nullptr }; + BAN::Atomic m_port_updater { nullptr }; ThreadBlocker m_port_thread_blocker; BAN::Atomic m_port_changed { false }; diff --git a/kernel/kernel/ACPI/ACPI.cpp b/kernel/kernel/ACPI/ACPI.cpp index d9e20ff5..3a0db5a0 100644 --- a/kernel/kernel/ACPI/ACPI.cpp +++ b/kernel/kernel/ACPI/ACPI.cpp @@ -885,7 +885,10 @@ acpi_release_global_lock: set_irq(irq); InterruptController::get().enable_irq(irq); - Process::create_kernel([](void*) { get().acpi_event_task(); }, nullptr); + if (auto thread_or_error = Thread::create_kernel([](void*) { get().acpi_event_task(); }, nullptr); thread_or_error.is_error()) + dwarnln("Failed to create ACPI thread, power button will not work: {}", thread_or_error.error()); + else if (auto ret = Processor::scheduler().add_thread(thread_or_error.value()); ret.is_error()) + dwarnln("Failed to create ACPI thread, power button will not work: {}", ret.error()); } dprintln("Initialized ACPI interrupts"); diff --git a/kernel/kernel/FS/DevFS/FileSystem.cpp b/kernel/kernel/FS/DevFS/FileSystem.cpp index fd6e298b..2644cfe2 100644 --- a/kernel/kernel/FS/DevFS/FileSystem.cpp +++ b/kernel/kernel/FS/DevFS/FileSystem.cpp @@ -45,7 +45,7 @@ namespace Kernel void DevFileSystem::initialize_device_updater() { - Process::create_kernel( + auto* updater_thread = MUST(Thread::create_kernel( [](void* _devfs) { auto* devfs = static_cast(_devfs); @@ -59,44 +59,39 @@ namespace Kernel SystemTimer::get().sleep_ms(10); } }, s_instance - ); + )); + MUST(Processor::scheduler().add_thread(updater_thread)); - auto* sync_process = Process::create_kernel(); - - sync_process->add_thread(MUST(Thread::create_kernel( + auto* disk_sync_thread = MUST(Thread::create_kernel( [](void* _devfs) { auto* devfs = static_cast(_devfs); + + constexpr uint64_t sync_interval_ms = 10'000; + uint64_t next_sync_ms { sync_interval_ms }; while (true) { LockGuard _(devfs->m_device_lock); while (!devfs->m_should_sync) - devfs->m_sync_thread_blocker.block_indefinite(&devfs->m_device_lock); + { + const uint64_t current_ms = SystemTimer::get().ms_since_boot(); + if (devfs->m_should_sync || current_ms >= next_sync_ms) + break; + devfs->m_sync_thread_blocker.block_with_timeout_ms(next_sync_ms - current_ms, &devfs->m_device_lock); + } for (auto& device : devfs->m_devices) if (device->is_storage_device()) if (auto ret = static_cast(device.ptr())->sync_disk_cache(); ret.is_error()) dwarnln("disk sync: {}", ret.error()); + next_sync_ms = SystemTimer::get().ms_since_boot() + sync_interval_ms; devfs->m_should_sync = false; devfs->m_sync_done.unblock(); } - }, s_instance, sync_process - ))); - - sync_process->add_thread(MUST(Kernel::Thread::create_kernel( - [](void* _devfs) - { - auto* devfs = static_cast(_devfs); - while (true) - { - SystemTimer::get().sleep_ms(10'000); - devfs->initiate_sync(false); - } - }, s_instance, sync_process - ))); - - sync_process->register_to_scheduler(); + }, s_instance + )); + MUST(Processor::scheduler().add_thread(disk_sync_thread)); } void DevFileSystem::initiate_sync(bool should_block) diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index af662e1b..e4860d37 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -247,7 +247,7 @@ namespace Kernel ); } - if (Thread::current().has_process() && Process::current().is_userspace()) + if (Thread::current().has_process()) process_name = Process::current().name(); #if ARCH(x86_64) diff --git a/kernel/kernel/Input/PS2/Controller.cpp b/kernel/kernel/Input/PS2/Controller.cpp index 01f553f8..88a56618 100644 --- a/kernel/kernel/Input/PS2/Controller.cpp +++ b/kernel/kernel/Input/PS2/Controller.cpp @@ -347,7 +347,7 @@ namespace Kernel::Input auto* init_thread = TRY(Thread::create_kernel( [](void* info) { static_cast(info)->controller->device_initialize_task(info); - }, &info, nullptr + }, &info )); TRY(Processor::scheduler().add_thread(init_thread)); diff --git a/kernel/kernel/Networking/ARPTable.cpp b/kernel/kernel/Networking/ARPTable.cpp index 237e56ef..381fb41b 100644 --- a/kernel/kernel/Networking/ARPTable.cpp +++ b/kernel/kernel/Networking/ARPTable.cpp @@ -18,14 +18,14 @@ namespace Kernel BAN::ErrorOr> ARPTable::create() { auto arp_table = TRY(BAN::UniqPtr::create()); - arp_table->m_process = Process::create_kernel( + arp_table->m_thread = TRY(Thread::create_kernel( [](void* arp_table_ptr) { auto& arp_table = *reinterpret_cast(arp_table_ptr); arp_table.packet_handle_task(); }, arp_table.ptr() - ); - ASSERT(arp_table->m_process); + )); + TRY(Processor::scheduler().add_thread(arp_table->m_thread)); return arp_table; } @@ -35,9 +35,9 @@ namespace Kernel ARPTable::~ARPTable() { - if (m_process) - m_process->exit(0, SIGKILL); - m_process = nullptr; + if (m_thread) + m_thread->add_signal(SIGKILL); + m_thread = nullptr; } BAN::ErrorOr ARPTable::get_mac_from_ipv4(NetworkInterface& interface, BAN::IPv4Address ipv4_address) diff --git a/kernel/kernel/Networking/IPv4Layer.cpp b/kernel/kernel/Networking/IPv4Layer.cpp index 94768a8f..4106970b 100644 --- a/kernel/kernel/Networking/IPv4Layer.cpp +++ b/kernel/kernel/Networking/IPv4Layer.cpp @@ -21,14 +21,14 @@ namespace Kernel BAN::ErrorOr> IPv4Layer::create() { auto ipv4_manager = TRY(BAN::UniqPtr::create()); - ipv4_manager->m_process = Process::create_kernel( + ipv4_manager->m_thread = TRY(Thread::create_kernel( [](void* ipv4_manager_ptr) { auto& ipv4_manager = *reinterpret_cast(ipv4_manager_ptr); ipv4_manager.packet_handle_task(); }, ipv4_manager.ptr() - ); - ASSERT(ipv4_manager->m_process); + )); + TRY(Processor::scheduler().add_thread(ipv4_manager->m_thread)); ipv4_manager->m_pending_packet_buffer = TRY(VirtualRange::create_to_vaddr_range( PageTable::kernel(), KERNEL_OFFSET, @@ -46,9 +46,9 @@ namespace Kernel IPv4Layer::~IPv4Layer() { - if (m_process) - m_process->exit(0, SIGKILL); - m_process = nullptr; + if (m_thread) + m_thread->add_signal(SIGKILL); + m_thread = nullptr; } void IPv4Layer::add_ipv4_header(BAN::ByteSpan packet, BAN::IPv4Address src_ipv4, BAN::IPv4Address dst_ipv4, uint8_t protocol) const diff --git a/kernel/kernel/Networking/TCPSocket.cpp b/kernel/kernel/Networking/TCPSocket.cpp index 34dce5c6..a8a41db6 100644 --- a/kernel/kernel/Networking/TCPSocket.cpp +++ b/kernel/kernel/Networking/TCPSocket.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -42,12 +43,13 @@ namespace Kernel PageTable::Flags::ReadWrite | PageTable::Flags::Present, true )); - socket->m_process = Process::create_kernel( + socket->m_thread = TRY(Thread::create_kernel( [](void* socket_ptr) { reinterpret_cast(socket_ptr)->process_task(); }, socket.ptr() - ); + )); + TRY(Processor::scheduler().add_thread(socket->m_thread)); // hack to keep socket alive until its process starts socket->ref(); return socket; @@ -63,7 +65,7 @@ namespace Kernel TCPSocket::~TCPSocket() { ASSERT(!is_bound()); - ASSERT(m_process == nullptr); + ASSERT(m_thread == nullptr); dprintln_if(DEBUG_TCP, "Socket destroyed"); } @@ -620,7 +622,7 @@ namespace Kernel dprintln_if(DEBUG_TCP, "Socket unbound"); } - m_process = nullptr; + m_thread = nullptr; } void TCPSocket::remove_listen_child(BAN::RefPtr socket) @@ -652,7 +654,7 @@ namespace Kernel LockGuard _(m_mutex); - while (m_process) + while (m_thread) { const uint64_t current_ms = SystemTimer::get().ms_since_boot(); diff --git a/kernel/kernel/Networking/UNIX/Socket.cpp b/kernel/kernel/Networking/UNIX/Socket.cpp index 8f4c2d4d..5d9936c2 100644 --- a/kernel/kernel/Networking/UNIX/Socket.cpp +++ b/kernel/kernel/Networking/UNIX/Socket.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include diff --git a/kernel/kernel/OpenFileDescriptorSet.cpp b/kernel/kernel/OpenFileDescriptorSet.cpp index 9f0f35f0..77005e85 100644 --- a/kernel/kernel/OpenFileDescriptorSet.cpp +++ b/kernel/kernel/OpenFileDescriptorSet.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 24bd0043..2cb0c67a 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -97,21 +97,6 @@ namespace Kernel MUST(Processor::scheduler().add_thread(thread)); } - Process* Process::create_kernel() - { - auto* process = create_process({ 0, 0, 0, 0 }, 0); - return process; - } - - Process* Process::create_kernel(entry_t entry, void* data) - { - auto* process = create_process({ 0, 0, 0, 0 }, 0); - auto* thread = MUST(Thread::create_kernel(entry, data, process)); - process->add_thread(thread); - process->register_to_scheduler(); - return process; - } - BAN::ErrorOr Process::create_userspace(const Credentials& credentials, BAN::StringView path, BAN::Span arguments) { auto* process = create_process(credentials, 0); @@ -609,7 +594,6 @@ namespace Kernel forked->m_page_table = BAN::move(page_table); forked->m_open_file_descriptors = BAN::move(*open_file_descriptors); forked->m_mapped_regions = BAN::move(mapped_regions); - forked->m_is_userspace = m_is_userspace; forked->m_has_called_exec = false; memcpy(forked->m_signal_handlers, m_signal_handlers, sizeof(m_signal_handlers)); diff --git a/kernel/kernel/Scheduler.cpp b/kernel/kernel/Scheduler.cpp index d58bdd82..ba261dc6 100644 --- a/kernel/kernel/Scheduler.cpp +++ b/kernel/kernel/Scheduler.cpp @@ -119,7 +119,7 @@ namespace Kernel BAN::ErrorOr Scheduler::initialize() { - m_idle_thread = TRY(Thread::create_kernel([](void*) { asm volatile("1: hlt; jmp 1b"); }, nullptr, nullptr)); + m_idle_thread = TRY(Thread::create_kernel([](void*) { asm volatile("1: hlt; jmp 1b"); }, nullptr)); ASSERT(m_idle_thread); size_t processor_index = 0; diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 345da62a..3e764ead 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -161,7 +161,7 @@ namespace Kernel static bool initialized = false; ASSERT(!initialized); - auto* thread = MUST(Thread::create_kernel(&TTY::keyboard_task, nullptr, nullptr)); + auto* thread = MUST(Thread::create_kernel(&TTY::keyboard_task, nullptr)); MUST(Processor::scheduler().add_thread(thread)); DevFileSystem::get().add_inode("tty", MUST(DevTTY::create(0666, 0, 0))); diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index de2f81e6..7332e630 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -69,10 +69,10 @@ namespace Kernel s_default_sse_storage_initialized = true; } - BAN::ErrorOr Thread::create_kernel(entry_t entry, void* data, Process* process) + BAN::ErrorOr Thread::create_kernel(entry_t entry, void* data) { // Create the thread object - Thread* thread = new Thread(s_next_tid++, process); + Thread* thread = new Thread(s_next_tid++, nullptr); if (thread == nullptr) return BAN::Error::from_errno(ENOMEM); BAN::ScopeGuard thread_deleter([thread] { delete thread; }); diff --git a/kernel/kernel/USB/Hub/HubDriver.cpp b/kernel/kernel/USB/Hub/HubDriver.cpp index 96f8b556..39060c54 100644 --- a/kernel/kernel/USB/Hub/HubDriver.cpp +++ b/kernel/kernel/USB/Hub/HubDriver.cpp @@ -215,9 +215,8 @@ namespace Kernel m_changed_ports |= 1u << port_id; } - m_port_updater = Process::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this); - if (m_port_updater == nullptr) - return BAN::Error::from_errno(ENOMEM); + m_port_updater = TRY(Thread::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this)); + TRY(Processor::scheduler().add_thread(m_port_updater)); return {}; } diff --git a/kernel/kernel/USB/XHCI/Controller.cpp b/kernel/kernel/USB/XHCI/Controller.cpp index 516f46ed..2efc9cc5 100644 --- a/kernel/kernel/USB/XHCI/Controller.cpp +++ b/kernel/kernel/USB/XHCI/Controller.cpp @@ -135,9 +135,8 @@ namespace Kernel while (operational.usbsts & XHCI::USBSTS::HCHalted) continue; - m_port_updater = Process::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this); - if (m_port_updater == nullptr) - return BAN::Error::from_errno(ENOMEM); + m_port_updater = TRY(Thread::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this)); + TRY(Processor::scheduler().add_thread(m_port_updater)); return {}; } diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 84aae734..ff8216c8 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -199,7 +199,8 @@ extern "C" void kernel_main(uint32_t boot_magic, uint32_t boot_info) Processor::wait_until_processors_ready(); MUST(Processor::scheduler().initialize()); - Process::create_kernel(init2, nullptr); + auto* init_thread = MUST(Thread::create_kernel(init2, nullptr)); + MUST(Processor::scheduler().add_thread(init_thread)); Processor::yield(); ASSERT_NOT_REACHED();