SimpleRegion.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "SimpleRegion.h"
  7. #include <string.h>
  8. namespace UserspaceEmulator {
  9. SimpleRegion::SimpleRegion(u32 base, u32 size)
  10. : Region(base, size)
  11. {
  12. m_data = (u8*)calloc(1, size);
  13. m_shadow_data = (u8*)malloc(size);
  14. memset(m_shadow_data, 1, size);
  15. }
  16. SimpleRegion::~SimpleRegion()
  17. {
  18. free(m_shadow_data);
  19. free(m_data);
  20. }
  21. ValueWithShadow<u8> SimpleRegion::read8(FlatPtr offset)
  22. {
  23. VERIFY(offset < size());
  24. return { *reinterpret_cast<const u8*>(m_data + offset), *reinterpret_cast<const u8*>(m_shadow_data + offset) };
  25. }
  26. ValueWithShadow<u16> SimpleRegion::read16(u32 offset)
  27. {
  28. VERIFY(offset + 1 < size());
  29. return { *reinterpret_cast<const u16*>(m_data + offset), *reinterpret_cast<const u16*>(m_shadow_data + offset) };
  30. }
  31. ValueWithShadow<u32> SimpleRegion::read32(u32 offset)
  32. {
  33. VERIFY(offset + 3 < size());
  34. return { *reinterpret_cast<const u32*>(m_data + offset), *reinterpret_cast<const u32*>(m_shadow_data + offset) };
  35. }
  36. ValueWithShadow<u64> SimpleRegion::read64(u32 offset)
  37. {
  38. VERIFY(offset + 7 < size());
  39. return { *reinterpret_cast<const u64*>(m_data + offset), *reinterpret_cast<const u64*>(m_shadow_data + offset) };
  40. }
  41. ValueWithShadow<u128> SimpleRegion::read128(u32 offset)
  42. {
  43. VERIFY(offset + 15 < size());
  44. return { *reinterpret_cast<const u128*>(m_data + offset), *reinterpret_cast<const u128*>(m_shadow_data + offset) };
  45. }
  46. ValueWithShadow<u256> SimpleRegion::read256(u32 offset)
  47. {
  48. VERIFY(offset + 31 < size());
  49. return { *reinterpret_cast<const u256*>(m_data + offset), *reinterpret_cast<const u256*>(m_shadow_data + offset) };
  50. }
  51. void SimpleRegion::write8(u32 offset, ValueWithShadow<u8> value)
  52. {
  53. VERIFY(offset < size());
  54. *reinterpret_cast<u8*>(m_data + offset) = value.value();
  55. *reinterpret_cast<u8*>(m_shadow_data + offset) = value.shadow();
  56. }
  57. void SimpleRegion::write16(u32 offset, ValueWithShadow<u16> value)
  58. {
  59. VERIFY(offset + 1 < size());
  60. *reinterpret_cast<u16*>(m_data + offset) = value.value();
  61. *reinterpret_cast<u16*>(m_shadow_data + offset) = value.shadow();
  62. }
  63. void SimpleRegion::write32(u32 offset, ValueWithShadow<u32> value)
  64. {
  65. VERIFY(offset + 3 < size());
  66. *reinterpret_cast<u32*>(m_data + offset) = value.value();
  67. *reinterpret_cast<u32*>(m_shadow_data + offset) = value.shadow();
  68. }
  69. void SimpleRegion::write64(u32 offset, ValueWithShadow<u64> value)
  70. {
  71. VERIFY(offset + 7 < size());
  72. *reinterpret_cast<u64*>(m_data + offset) = value.value();
  73. *reinterpret_cast<u64*>(m_shadow_data + offset) = value.shadow();
  74. }
  75. void SimpleRegion::write128(u32 offset, ValueWithShadow<u128> value)
  76. {
  77. VERIFY(offset + 15 < size());
  78. *reinterpret_cast<u128*>(m_data + offset) = value.value();
  79. *reinterpret_cast<u128*>(m_shadow_data + offset) = value.shadow();
  80. }
  81. void SimpleRegion::write256(u32 offset, ValueWithShadow<u256> value)
  82. {
  83. VERIFY(offset + 31 < size());
  84. *reinterpret_cast<u256*>(m_data + offset) = value.value();
  85. *reinterpret_cast<u256*>(m_shadow_data + offset) = value.shadow();
  86. }
  87. u8* SimpleRegion::cacheable_ptr(u32 offset)
  88. {
  89. return m_data + offset;
  90. }
  91. }