diff options
author | Samuel Huang <huangs@chromium.org> | 2019-01-11 20:00:13 +0000 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2021-07-25 20:43:21 -0700 |
commit | 65b242dcf03e2f24e7983fd1f47e84e4eb822cc5 (patch) | |
tree | 1846f894076eec58f93d37560903254320ae0690 /reference_bytes_mixer.h | |
parent | 2dedd30edf813df98bad26ea436e737c9ac356f2 (diff) | |
download | zucchini-65b242dcf03e2f24e7983fd1f47e84e4eb822cc5.tar.gz |
[Zucchini] ARM Support: Add arm_utils.* with tests.
This CL adds new files for ARM support. The code is not yet integrated
into Zucchini, but are only used by the added tests. The high-level
goal is to support rel32 reference read / write via:
(data bytes) <-> |code| <-> |disp| <-> |target_rva|,
where |code| is ARM machine code value (read-write), and |disp| is a
PC-relative displacement. Details:
* Add template class ArmAddrTraits as API to process rel32 references.
It is specialized for each rel32 address type, and aggregates
selected low-level static functions from an ARM *Translator class.
* Add class Arm32Rel32Translator for 32-bit ARM (ARM32)
* ArmAddrTraits is specialized to {A24} encoding for ARM mode, and
{T8, T11, T21, T24} encodings for THUMB2 mode.
* Complication: |code| can affect |disp| <-> |target_rva|, since the
the BLX instruction dictates whether |target_rva| should be 2-byte
or 4-byte aligned!
* The BLX special case makes |disp| <-> |target_rva| unsuitable for
ArmAddrTraits. This led to the API to be defined as:
* Fetch() for (data bytes) -> |code|.
* Store() for |code| -> (data bytes).
* Decode() for |code| -> |disp| & alignment spec (ArmAlign).
* Encode() for |disp| -> |code|: Modifies existing |code|.
* Read() for |code| -> |target_rva|: Needs |instr_rva|.
* Write() for |target_rva| -> |code|.
* Needs |instr_rva|; modifies existing |code|.
* Add class AArch64Rel32Translator for 64-bit ARM (AArch64).
* ArmAddrTraits is specialized to {Immd14, Immd19, Immd26} encodings.
Bug: 918867
Change-Id: Ie20935e391ed0ac85c408aa9c8959305dc8bba42
Reviewed-on: https://chromium-review.googlesource.com/c/1394397
Reviewed-by: Samuel Huang <huangs@chromium.org>
Reviewed-by: Etienne Pierre-Doray <etiennep@chromium.org>
Commit-Queue: Samuel Huang <huangs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#622115}
NOKEYCHECK=True
GitOrigin-RevId: 398b188eab96c3b198b6a4eb8788bba77202aef8
Diffstat (limited to 'reference_bytes_mixer.h')
-rw-r--r-- | reference_bytes_mixer.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/reference_bytes_mixer.h b/reference_bytes_mixer.h index 9bc8f2d..f8e351e 100644 --- a/reference_bytes_mixer.h +++ b/reference_bytes_mixer.h @@ -72,14 +72,14 @@ class ReferenceBytesMixer { virtual int NumBytes(uint8_t type) const; // Computes mixed reference bytes by combining (a) "payload bits" from an - // "old" reference of |type| at |old_base[old_offset]| with (b) "operation - // bits" from a "new" reference of |type| at |new_base[new_offset]|. Returns + // "old" reference of |type| at |old_view[old_offset]| with (b) "operation + // bits" from a "new" reference of |type| at |new_view[new_offset]|. Returns // the result as ConstBufferView, which is valid only until the next call to // Mix(). virtual ConstBufferView Mix(uint8_t type, - ConstBufferView::const_iterator old_base, + ConstBufferView old_view, offset_t old_offset, - ConstBufferView::const_iterator new_base, + ConstBufferView new_view, offset_t new_offset); private: |