Kernel: Rename TimerHandler to SystemTimer
I changed SystemTimer to only handle the "best" supported timer it can initialize.
This commit is contained in:
		
							parent
							
								
									17f1737c9a
								
							
						
					
					
						commit
						bc0e1fa898
					
				| 
						 | 
					@ -15,11 +15,11 @@ namespace Kernel
 | 
				
			||||||
		virtual timespec time_since_boot() const = 0;
 | 
							virtual timespec time_since_boot() const = 0;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class TimerHandler : public Timer
 | 
						class SystemTimer : public Timer
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		static void initialize();
 | 
							static void initialize();
 | 
				
			||||||
		static TimerHandler& get();
 | 
							static SystemTimer& get();
 | 
				
			||||||
		static bool is_initialized();
 | 
							static bool is_initialized();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		virtual uint64_t ms_since_boot() const override;
 | 
							virtual uint64_t ms_since_boot() const override;
 | 
				
			||||||
| 
						 | 
					@ -27,10 +27,10 @@ namespace Kernel
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		void sleep(uint64_t) const;
 | 
							void sleep(uint64_t) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint64_t get_unix_timestamp();
 | 
							uint64_t get_unix_timestamp() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		TimerHandler() = default;
 | 
							SystemTimer() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void initialize_timers();
 | 
							void initialize_timers();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,7 +58,7 @@ namespace Debug
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void print_prefix(const char* file, int line)
 | 
						void print_prefix(const char* file, int line)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		auto ms_since_boot = Kernel::TimerHandler::is_initialized() ? Kernel::TimerHandler::get().ms_since_boot() : 0;
 | 
							auto ms_since_boot = Kernel::SystemTimer::is_initialized() ? Kernel::SystemTimer::get().ms_since_boot() : 0;
 | 
				
			||||||
		BAN::Formatter::print(Debug::putchar, "[{5}.{3}] {}:{}: ", ms_since_boot / 1000, ms_since_boot % 1000, file, line);
 | 
							BAN::Formatter::print(Debug::putchar, "[{5}.{3}] {}:{}: ", ms_since_boot / 1000, ms_since_boot % 1000, file, line);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,7 +46,7 @@ namespace Kernel
 | 
				
			||||||
					);
 | 
										);
 | 
				
			||||||
					s_instance->m_device_lock.unlock();
 | 
										s_instance->m_device_lock.unlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					Kernel::TimerHandler::get().sleep(1);
 | 
										Kernel::SystemTimer::get().sleep(1);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}, nullptr
 | 
								}, nullptr
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -384,7 +384,7 @@ namespace Kernel
 | 
				
			||||||
		if (error_or.error().get_error_code() != ENOENT)
 | 
							if (error_or.error().get_error_code() != ENOENT)
 | 
				
			||||||
			return error_or.error();
 | 
								return error_or.error();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint64_t current_time = TimerHandler::get().get_unix_timestamp();
 | 
							uint64_t current_time = SystemTimer::get().get_unix_timestamp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Ext2::Inode ext2_inode;
 | 
							Ext2::Inode ext2_inode;
 | 
				
			||||||
		ext2_inode.mode			= mode;
 | 
							ext2_inode.mode			= mode;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ namespace Kernel
 | 
				
			||||||
		: m_uid(credentials.euid())
 | 
							: m_uid(credentials.euid())
 | 
				
			||||||
		, m_gid(credentials.egid())
 | 
							, m_gid(credentials.egid())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint64_t current_time = TimerHandler::get().get_unix_timestamp();
 | 
							uint64_t current_time = SystemTimer::get().get_unix_timestamp();
 | 
				
			||||||
		m_atime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
							m_atime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
				
			||||||
		m_mtime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
							m_mtime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
				
			||||||
		m_ctime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
							m_ctime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ namespace Kernel
 | 
				
			||||||
		memmove(m_buffer.data(), m_buffer.data() + to_copy, m_buffer.size() - to_copy);
 | 
							memmove(m_buffer.data(), m_buffer.data() + to_copy, m_buffer.size() - to_copy);
 | 
				
			||||||
		MUST(m_buffer.resize(m_buffer.size() - to_copy));
 | 
							MUST(m_buffer.resize(m_buffer.size() - to_copy));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint64_t current_time = TimerHandler::get().get_unix_timestamp();
 | 
							uint64_t current_time = SystemTimer::get().get_unix_timestamp();
 | 
				
			||||||
		m_atime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
							m_atime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m_semaphore.unblock();
 | 
							m_semaphore.unblock();
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@ namespace Kernel
 | 
				
			||||||
		TRY(m_buffer.resize(old_size + count));
 | 
							TRY(m_buffer.resize(old_size + count));
 | 
				
			||||||
		memcpy(m_buffer.data() + old_size, buffer, count);
 | 
							memcpy(m_buffer.data() + old_size, buffer, count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint64_t current_time = TimerHandler::get().get_unix_timestamp();
 | 
							uint64_t current_time = SystemTimer::get().get_unix_timestamp();
 | 
				
			||||||
		m_mtime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
							m_mtime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
				
			||||||
		m_ctime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
							m_ctime = { .tv_sec = current_time, .tv_nsec = 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ namespace Kernel
 | 
				
			||||||
	RamInode::RamInode(RamFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)
 | 
						RamInode::RamInode(RamFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)
 | 
				
			||||||
			: m_fs(fs)
 | 
								: m_fs(fs)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint64_t current_unix_time = TimerHandler::get().get_unix_timestamp();
 | 
							uint64_t current_unix_time = SystemTimer::get().get_unix_timestamp();
 | 
				
			||||||
		timespec current_timespec;
 | 
							timespec current_timespec;
 | 
				
			||||||
		current_timespec.tv_sec = current_unix_time;
 | 
							current_timespec.tv_sec = current_unix_time;
 | 
				
			||||||
		current_timespec.tv_nsec = 0;
 | 
							current_timespec.tv_nsec = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,8 +108,8 @@ namespace Kernel::Input
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (device == 1)
 | 
							if (device == 1)
 | 
				
			||||||
			IO::outb(PS2::IOPort::COMMAND, PS2::Command::WRITE_TO_SECOND_PORT);
 | 
								IO::outb(PS2::IOPort::COMMAND, PS2::Command::WRITE_TO_SECOND_PORT);
 | 
				
			||||||
		uint64_t timeout = TimerHandler::get().ms_since_boot() + s_device_timeout_ms;
 | 
							uint64_t timeout = SystemTimer::get().ms_since_boot() + s_device_timeout_ms;
 | 
				
			||||||
		while (TimerHandler::get().ms_since_boot() < timeout)
 | 
							while (SystemTimer::get().ms_since_boot() < timeout)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (!(IO::inb(PS2::IOPort::STATUS) & PS2::Status::INPUT_FULL))
 | 
								if (!(IO::inb(PS2::IOPort::STATUS) & PS2::Status::INPUT_FULL))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -122,8 +122,8 @@ namespace Kernel::Input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static BAN::ErrorOr<uint8_t> device_read_byte()
 | 
						static BAN::ErrorOr<uint8_t> device_read_byte()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint64_t timeout = TimerHandler::get().ms_since_boot() + s_device_timeout_ms;
 | 
							uint64_t timeout = SystemTimer::get().ms_since_boot() + s_device_timeout_ms;
 | 
				
			||||||
		while (TimerHandler::get().ms_since_boot() < timeout)
 | 
							while (SystemTimer::get().ms_since_boot() < timeout)
 | 
				
			||||||
			if (IO::inb(PS2::IOPort::STATUS) & PS2::Status::OUTPUT_FULL)
 | 
								if (IO::inb(PS2::IOPort::STATUS) & PS2::Status::OUTPUT_FULL)
 | 
				
			||||||
				return IO::inb(PS2::IOPort::DATA);
 | 
									return IO::inb(PS2::IOPort::DATA);
 | 
				
			||||||
		return BAN::Error::from_error_code(ErrorCode::PS2_Timeout);
 | 
							return BAN::Error::from_error_code(ErrorCode::PS2_Timeout);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -216,7 +216,7 @@ namespace Kernel::Input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (event.pressed() && event.key == Input::Key::F11)
 | 
							if (event.pressed() && event.key == Input::Key::F11)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			auto time = TimerHandler::get().time_since_boot();
 | 
								auto time = SystemTimer::get().time_since_boot();
 | 
				
			||||||
			dprintln("{}.{9} s", time.tv_sec, time.tv_nsec);
 | 
								dprintln("{}.{9} s", time.tv_sec, time.tv_nsec);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -473,7 +473,7 @@ namespace Kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BAN::ErrorOr<long> Process::sys_sleep(int seconds)
 | 
						BAN::ErrorOr<long> Process::sys_sleep(int seconds)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		TimerHandler::get().sleep(seconds * 1000);
 | 
							SystemTimer::get().sleep(seconds * 1000);
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -811,7 +811,7 @@ namespace Kernel
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			case CLOCK_MONOTONIC:
 | 
								case CLOCK_MONOTONIC:
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				uint64_t time_ms = TimerHandler::get().ms_since_boot();
 | 
									uint64_t time_ms = SystemTimer::get().ms_since_boot();
 | 
				
			||||||
				tp->tv_sec  =  time_ms / 1000;
 | 
									tp->tv_sec  =  time_ms / 1000;
 | 
				
			||||||
				tp->tv_nsec = (time_ms % 1000) * 1000000;
 | 
									tp->tv_nsec = (time_ms % 1000) * 1000000;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,7 +113,7 @@ namespace Kernel
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		VERIFY_CLI();
 | 
							VERIFY_CLI();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint64_t current_time = TimerHandler::get().ms_since_boot();
 | 
							uint64_t current_time = SystemTimer::get().ms_since_boot();
 | 
				
			||||||
		while (!m_sleeping_threads.empty() && m_sleeping_threads.front().wake_time <= current_time)
 | 
							while (!m_sleeping_threads.empty() && m_sleeping_threads.front().wake_time <= current_time)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Thread* thread = m_sleeping_threads.front().thread;
 | 
								Thread* thread = m_sleeping_threads.front().thread;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ namespace Kernel
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint8_t device_index = this->device_index(device);
 | 
							uint8_t device_index = this->device_index(device);
 | 
				
			||||||
		io_write(ATA_PORT_DRIVE_SELECT, 0xA0 | (device_index << 4));
 | 
							io_write(ATA_PORT_DRIVE_SELECT, 0xA0 | (device_index << 4));
 | 
				
			||||||
		TimerHandler::get().sleep(1);
 | 
							SystemTimer::get().sleep(1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ATABus::DeviceType ATABus::identify(const ATADevice& device, uint16_t* buffer)
 | 
						ATABus::DeviceType ATABus::identify(const ATADevice& device, uint16_t* buffer)
 | 
				
			||||||
| 
						 | 
					@ -111,7 +111,7 @@ namespace Kernel
 | 
				
			||||||
		io_write(ATA_PORT_CONTROL, ATA_CONTROL_nIEN);
 | 
							io_write(ATA_PORT_CONTROL, ATA_CONTROL_nIEN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		io_write(ATA_PORT_COMMAND, ATA_COMMAND_IDENTIFY);
 | 
							io_write(ATA_PORT_COMMAND, ATA_COMMAND_IDENTIFY);
 | 
				
			||||||
		TimerHandler::get().sleep(1);
 | 
							SystemTimer::get().sleep(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// No device on port
 | 
							// No device on port
 | 
				
			||||||
		if (io_read(ATA_PORT_STATUS) == 0)
 | 
							if (io_read(ATA_PORT_STATUS) == 0)
 | 
				
			||||||
| 
						 | 
					@ -135,7 +135,7 @@ namespace Kernel
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			io_write(ATA_PORT_COMMAND, ATA_COMMAND_IDENTIFY_PACKET);
 | 
								io_write(ATA_PORT_COMMAND, ATA_COMMAND_IDENTIFY_PACKET);
 | 
				
			||||||
			TimerHandler::get().sleep(1);
 | 
								SystemTimer::get().sleep(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (auto res = wait(true); res.is_error())
 | 
								if (auto res = wait(true); res.is_error())
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -304,7 +304,7 @@ namespace Kernel
 | 
				
			||||||
			io_write(ATA_PORT_LBA2, (uint8_t)(lba >> 16));
 | 
								io_write(ATA_PORT_LBA2, (uint8_t)(lba >> 16));
 | 
				
			||||||
			io_write(ATA_PORT_COMMAND, ATA_COMMAND_WRITE_SECTORS);
 | 
								io_write(ATA_PORT_COMMAND, ATA_COMMAND_WRITE_SECTORS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			TimerHandler::get().sleep(1);
 | 
								SystemTimer::get().sleep(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for (uint32_t sector = 0; sector < sector_count; sector++)
 | 
								for (uint32_t sector = 0; sector < sector_count; sector++)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,29 +6,29 @@
 | 
				
			||||||
namespace Kernel
 | 
					namespace Kernel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static TimerHandler* s_instance = nullptr;
 | 
						static SystemTimer* s_instance = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void TimerHandler::initialize()
 | 
						void SystemTimer::initialize()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ASSERT(s_instance == nullptr);
 | 
							ASSERT(s_instance == nullptr);
 | 
				
			||||||
		auto* temp = new TimerHandler;
 | 
							auto* temp = new SystemTimer;
 | 
				
			||||||
		ASSERT(temp);
 | 
							ASSERT(temp);
 | 
				
			||||||
		temp->initialize_timers();
 | 
							temp->initialize_timers();
 | 
				
			||||||
		s_instance = temp;
 | 
							s_instance = temp;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TimerHandler& TimerHandler::get()
 | 
						SystemTimer& SystemTimer::get()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ASSERT(s_instance);
 | 
							ASSERT(s_instance);
 | 
				
			||||||
		return *s_instance;
 | 
							return *s_instance;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool TimerHandler::is_initialized()
 | 
						bool SystemTimer::is_initialized()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return !!s_instance;
 | 
							return !!s_instance;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void TimerHandler::initialize_timers()
 | 
						void SystemTimer::initialize_timers()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		m_rtc = MUST(BAN::UniqPtr<RTC>::create());
 | 
							m_rtc = MUST(BAN::UniqPtr<RTC>::create());
 | 
				
			||||||
		m_boot_time = BAN::to_unix_time(m_rtc->get_current_time());
 | 
							m_boot_time = BAN::to_unix_time(m_rtc->get_current_time());
 | 
				
			||||||
| 
						 | 
					@ -54,17 +54,17 @@ namespace Kernel
 | 
				
			||||||
		Kernel::panic("Could not initialize any timer");
 | 
							Kernel::panic("Could not initialize any timer");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint64_t TimerHandler::ms_since_boot() const
 | 
						uint64_t SystemTimer::ms_since_boot() const
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_timer->ms_since_boot();
 | 
							return m_timer->ms_since_boot();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timespec TimerHandler::time_since_boot() const
 | 
						timespec SystemTimer::time_since_boot() const
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_timer->time_since_boot();
 | 
							return m_timer->time_since_boot();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void TimerHandler::sleep(uint64_t ms) const
 | 
						void SystemTimer::sleep(uint64_t ms) const
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (ms == 0)
 | 
							if (ms == 0)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
| 
						 | 
					@ -74,7 +74,7 @@ namespace Kernel
 | 
				
			||||||
			dwarnln("sleep woke {} ms too soon", wake_time - ms_since_boot());
 | 
								dwarnln("sleep woke {} ms too soon", wake_time - ms_since_boot());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint64_t TimerHandler::get_unix_timestamp()
 | 
						uint64_t SystemTimer::get_unix_timestamp() const
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_boot_time + ms_since_boot() / 1000;
 | 
							return m_boot_time + ms_since_boot() / 1000;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,7 +144,7 @@ extern "C" void kernel_main()
 | 
				
			||||||
	InterruptController::initialize(cmdline.force_pic);
 | 
						InterruptController::initialize(cmdline.force_pic);
 | 
				
			||||||
	dprintln("Interrupt controller initialized");
 | 
						dprintln("Interrupt controller initialized");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TimerHandler::initialize();
 | 
						SystemTimer::initialize();
 | 
				
			||||||
	dprintln("Timers initialized");
 | 
						dprintln("Timers initialized");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DevFileSystem::initialize();
 | 
						DevFileSystem::initialize();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue