mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 14:32:46 +00:00 
			
		
		
		
	 e46343bf9a
			
		
	
	
		e46343bf9a
		
	
	
	
	
		
			
			This makes error propagation less cumbersome (and also exposed some places where we were not doing it.)
		
			
				
	
	
		
			75 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <AK/Singleton.h>
 | |
| #include <Kernel/Console.h>
 | |
| #include <Kernel/IO.h>
 | |
| #include <Kernel/SpinLock.h>
 | |
| #include <Kernel/kstdio.h>
 | |
| 
 | |
| // Bytes output to 0xE9 end up on the Bochs console. It's very handy.
 | |
| #define CONSOLE_OUT_TO_E9
 | |
| 
 | |
| static AK::Singleton<Console> s_the;
 | |
| static Kernel::SpinLock g_console_lock;
 | |
| 
 | |
| UNMAP_AFTER_INIT void Console::initialize()
 | |
| {
 | |
|     s_the.ensure_instance();
 | |
| }
 | |
| 
 | |
| Console& Console::the()
 | |
| {
 | |
|     return *s_the;
 | |
| }
 | |
| 
 | |
| bool Console::is_initialized()
 | |
| {
 | |
|     return s_the.is_initialized();
 | |
| }
 | |
| 
 | |
| UNMAP_AFTER_INIT Console::Console()
 | |
|     : CharacterDevice(5, 1)
 | |
| {
 | |
| }
 | |
| 
 | |
| UNMAP_AFTER_INIT Console::~Console()
 | |
| {
 | |
| }
 | |
| 
 | |
| bool Console::can_read(const Kernel::FileDescription&, size_t) const
 | |
| {
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| Kernel::KResultOr<size_t> Console::read(FileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t)
 | |
| {
 | |
|     // FIXME: Implement reading from the console.
 | |
|     //        Maybe we could use a ring buffer for this device?
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| Kernel::KResultOr<size_t> Console::write(FileDescription&, u64, const Kernel::UserOrKernelBuffer& data, size_t size)
 | |
| {
 | |
|     if (!size)
 | |
|         return 0;
 | |
| 
 | |
|     return data.read_buffered<256>(size, [&](u8 const* bytes, size_t bytes_count) {
 | |
|         for (size_t i = 0; i < bytes_count; i++)
 | |
|             put_char((char)bytes[i]);
 | |
|         return bytes_count;
 | |
|     });
 | |
| }
 | |
| 
 | |
| void Console::put_char(char ch)
 | |
| {
 | |
|     Kernel::ScopedSpinLock lock(g_console_lock);
 | |
| #ifdef CONSOLE_OUT_TO_E9
 | |
|     //if (ch != 27)
 | |
|     IO::out8(0xe9, ch);
 | |
| #endif
 | |
|     m_logbuffer.enqueue(ch);
 | |
| }
 |