PageFault.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. #include <Kernel/VirtualAddress.h>
  9. namespace Kernel {
  10. struct PageFaultFlags {
  11. enum Flags {
  12. NotPresent = 0x00,
  13. ProtectionViolation = 0x01,
  14. Read = 0x00,
  15. Write = 0x02,
  16. UserMode = 0x04,
  17. SupervisorMode = 0x00,
  18. ReservedBitViolation = 0x08,
  19. InstructionFetch = 0x10,
  20. };
  21. };
  22. class PageFault {
  23. public:
  24. PageFault(u16 code, VirtualAddress vaddr)
  25. : m_code(code)
  26. , m_vaddr(vaddr)
  27. {
  28. }
  29. enum class Type {
  30. PageNotPresent = PageFaultFlags::NotPresent,
  31. ProtectionViolation = PageFaultFlags::ProtectionViolation,
  32. };
  33. enum class Access {
  34. Read = PageFaultFlags::Read,
  35. Write = PageFaultFlags::Write,
  36. };
  37. VirtualAddress vaddr() const { return m_vaddr; }
  38. u16 code() const { return m_code; }
  39. Type type() const { return (Type)(m_code & 1); }
  40. Access access() const { return (Access)(m_code & 2); }
  41. bool is_not_present() const { return (m_code & 1) == PageFaultFlags::NotPresent; }
  42. bool is_protection_violation() const { return (m_code & 1) == PageFaultFlags::ProtectionViolation; }
  43. bool is_read() const { return (m_code & 2) == PageFaultFlags::Read; }
  44. bool is_write() const { return (m_code & 2) == PageFaultFlags::Write; }
  45. bool is_user() const { return (m_code & 4) == PageFaultFlags::UserMode; }
  46. bool is_supervisor() const { return (m_code & 4) == PageFaultFlags::SupervisorMode; }
  47. bool is_instruction_fetch() const { return (m_code & 16) == PageFaultFlags::InstructionFetch; }
  48. private:
  49. u16 m_code;
  50. VirtualAddress m_vaddr;
  51. };
  52. }