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 /zucchini_gen.cc | |
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 'zucchini_gen.cc')
-rw-r--r-- | zucchini_gen.cc | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/zucchini_gen.cc b/zucchini_gen.cc index ac7e33b..3735d0f 100644 --- a/zucchini_gen.cc +++ b/zucchini_gen.cc @@ -147,8 +147,8 @@ bool GenerateRawDelta(ConstBufferView old_image, int num_bytes = reference_bytes_mixer->NumBytes(type_tag.value()); if (num_bytes) { ConstBufferView mixed_ref_bytes = reference_bytes_mixer->Mix( - type_tag.value(), old_image.begin(), equivalence.src_offset + i, - new_image.begin(), equivalence.dst_offset + i); + type_tag.value(), old_image, equivalence.src_offset + i, + new_image, equivalence.dst_offset + i); for (int j = 0; j < num_bytes; ++j) { int8_t diff = mixed_ref_bytes[j] - old_image[equivalence.src_offset + i + j]; |