SimpleRegion.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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 <AK/ByteReader.h>
  8. #include <string.h>
  9. namespace UserspaceEmulator {
  10. SimpleRegion::SimpleRegion(u32 base, u32 size)
  11. : Region(base, size)
  12. {
  13. m_data = (u8*)calloc(1, size);
  14. m_shadow_data = (u8*)malloc(size);
  15. memset(m_shadow_data, 1, size);
  16. }
  17. SimpleRegion::~SimpleRegion()
  18. {
  19. free(m_shadow_data);
  20. free(m_data);
  21. }
  22. ValueWithShadow<u8> SimpleRegion::read8(FlatPtr offset)
  23. {
  24. VERIFY(offset < size());
  25. return { m_data[offset], m_shadow_data[offset] };
  26. }
  27. ValueWithShadow<u16> SimpleRegion::read16(u32 offset)
  28. {
  29. VERIFY(offset + 1 < size());
  30. u16 value, shadow;
  31. ByteReader::load<u16>(m_data + offset, value);
  32. ByteReader::load<u16>(m_shadow_data + offset, shadow);
  33. return { value, shadow };
  34. }
  35. ValueWithShadow<u32> SimpleRegion::read32(u32 offset)
  36. {
  37. VERIFY(offset + 3 < size());
  38. u32 value, shadow;
  39. ByteReader::load<u32>(m_data + offset, value);
  40. ByteReader::load<u32>(m_shadow_data + offset, shadow);
  41. return { value, shadow };
  42. }
  43. ValueWithShadow<u64> SimpleRegion::read64(u32 offset)
  44. {
  45. VERIFY(offset + 7 < size());
  46. u64 value, shadow;
  47. ByteReader::load<u64>(m_data + offset, value);
  48. ByteReader::load<u64>(m_shadow_data + offset, shadow);
  49. return { value, shadow };
  50. }
  51. ValueWithShadow<u128> SimpleRegion::read128(u32 offset)
  52. {
  53. VERIFY(offset + 15 < size());
  54. u128 value, shadow;
  55. ByteReader::load(m_data + offset, value);
  56. ByteReader::load(m_shadow_data + offset, shadow);
  57. return { value, shadow };
  58. }
  59. ValueWithShadow<u256> SimpleRegion::read256(u32 offset)
  60. {
  61. VERIFY(offset + 31 < size());
  62. u256 value, shadow;
  63. ByteReader::load(m_data + offset, value);
  64. ByteReader::load(m_shadow_data + offset, shadow);
  65. return { value, shadow };
  66. }
  67. void SimpleRegion::write8(u32 offset, ValueWithShadow<u8> value)
  68. {
  69. VERIFY(offset < size());
  70. m_data[offset] = value.value();
  71. m_shadow_data[offset] = value.shadow();
  72. }
  73. void SimpleRegion::write16(u32 offset, ValueWithShadow<u16> value)
  74. {
  75. VERIFY(offset + 1 < size());
  76. ByteReader::store(m_data + offset, value.value());
  77. ByteReader::store(m_shadow_data + offset, value.shadow());
  78. }
  79. void SimpleRegion::write32(u32 offset, ValueWithShadow<u32> value)
  80. {
  81. VERIFY(offset + 3 < size());
  82. ByteReader::store(m_data + offset, value.value());
  83. ByteReader::store(m_shadow_data + offset, value.shadow());
  84. }
  85. void SimpleRegion::write64(u32 offset, ValueWithShadow<u64> value)
  86. {
  87. VERIFY(offset + 7 < size());
  88. ByteReader::store(m_data + offset, value.value());
  89. ByteReader::store(m_shadow_data + offset, value.shadow());
  90. }
  91. void SimpleRegion::write128(u32 offset, ValueWithShadow<u128> value)
  92. {
  93. VERIFY(offset + 15 < size());
  94. ByteReader::store(m_data + offset, value.value());
  95. ByteReader::store(m_shadow_data + offset, value.shadow());
  96. }
  97. void SimpleRegion::write256(u32 offset, ValueWithShadow<u256> value)
  98. {
  99. VERIFY(offset + 31 < size());
  100. ByteReader::store(m_data + offset, value.value());
  101. ByteReader::store(m_shadow_data + offset, value.shadow());
  102. }
  103. u8* SimpleRegion::cacheable_ptr(u32 offset)
  104. {
  105. return m_data + offset;
  106. }
  107. }