BootFramebufferConsole.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) 2022, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Graphics/Console/BootFramebufferConsole.h>
  7. #include <Kernel/Locking/Spinlock.h>
  8. #include <Kernel/Memory/MemoryManager.h>
  9. namespace Kernel::Graphics {
  10. BootFramebufferConsole::BootFramebufferConsole(PhysicalAddress framebuffer_addr, size_t width, size_t height, size_t pitch)
  11. : GenericFramebufferConsoleImpl(width, height, pitch)
  12. {
  13. // NOTE: We're very early in the boot process, memory allocations shouldn't really fail
  14. auto framebuffer_end = Memory::page_round_up(framebuffer_addr.offset(height * pitch * sizeof(u32)).get()).release_value();
  15. m_framebuffer = MM.allocate_kernel_region(framebuffer_addr.page_base(), framebuffer_end - framebuffer_addr.page_base().get(), "Boot Framebuffer"sv, Memory::Region::Access::ReadWrite).release_value();
  16. [[maybe_unused]] auto result = m_framebuffer->set_write_combine(true);
  17. m_framebuffer_data = m_framebuffer->vaddr().offset(framebuffer_addr.offset_in_page()).as_ptr();
  18. memset(m_framebuffer_data, 0, height * pitch * sizeof(u32));
  19. }
  20. void BootFramebufferConsole::clear(size_t x, size_t y, size_t length)
  21. {
  22. SpinlockLocker lock(m_lock);
  23. if (m_framebuffer_data)
  24. GenericFramebufferConsoleImpl::clear(x, y, length);
  25. }
  26. void BootFramebufferConsole::clear_glyph(size_t x, size_t y)
  27. {
  28. VERIFY(m_lock.is_locked());
  29. GenericFramebufferConsoleImpl::clear_glyph(x, y);
  30. }
  31. void BootFramebufferConsole::enable()
  32. {
  33. // Once disabled, ignore requests to re-enable
  34. }
  35. void BootFramebufferConsole::disable()
  36. {
  37. SpinlockLocker lock(m_lock);
  38. GenericFramebufferConsoleImpl::disable();
  39. m_framebuffer = nullptr;
  40. m_framebuffer_data = nullptr;
  41. }
  42. void BootFramebufferConsole::write(size_t x, size_t y, char ch, Color background, Color foreground, bool critical)
  43. {
  44. SpinlockLocker lock(m_lock);
  45. if (m_framebuffer_data)
  46. GenericFramebufferConsoleImpl::write(x, y, ch, background, foreground, critical);
  47. }
  48. u8* BootFramebufferConsole::framebuffer_data()
  49. {
  50. VERIFY(m_lock.is_locked());
  51. VERIFY(m_framebuffer_data);
  52. return m_framebuffer_data;
  53. }
  54. }