Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refine selftest further #125

Merged
merged 7 commits into from
Dec 17, 2024
Merged

Refine selftest further #125

merged 7 commits into from
Dec 17, 2024

Conversation

mkannwischer
Copy link
Collaborator

@mkannwischer mkannwischer commented Dec 16, 2024

We encountered further issues with the selftest in the armv7m branch. This PR refines it further

  1. When unicorn fails to run code, currently this fails silently and the selftest continues to run failing in the assertions checking the output resulting in misleading error messages. This is changed now to fail immediately with an appropriate eror message.

  2. The configuration option selftest_address_gprs was misnamed as addresses can also be contained in non-gpr-registers. I renamed it to selftest_address_registers

  3. Previously the selftest would determine which registers are supposed to contain addresses (and allocate memory
    accordingly) by going through all memory operations and assuming that address registers used in those are the
    inputs holding the addresses initially.

This assumption does not hold as
(1) addresses may be moved around
(2) addresses may actually be a result of a previous computation.

One example where this did not work was

vmov rX, sY
ldr rZ, [rX]

Here the selftest would assume that rX needs to be an address. However, sY is the register holding the address on entry of the code.

This commit refines the code determining the address registers by recursively going through the DFG and determining the input registers that affect values being used as addresses.
Note that in the above examples rX would not be marked as an address, at it is not an input.

Hopefully this approach is more robust.

  1. Allow accessing memory at negative offsets. Sometimes code has pointers that do not point at the start of the buffer, but somewhere in the middle. If those are then used with negative offsets, unicorn fails as the memory is potentially undefined. This is fixed by allocating a double-sized buffer and placing the pointer in the middle.

  2. The stack pointer is currently initialized to the top of the stack. However, if code is using the stack pointer (and the sp is not decremented as a part of the code snipped), then we get memory access errors from unicorn. This is fixed by allocating some stack space (the default buffer size) before calling the function.

  3. Building on top of Refine selftest for Armv7-M #122, we also need to skip the selftest if symbolics are present in the preamble or postamble in the case of sw piplining. This PR adds the check in the same way as Refine selftest for Armv7-M #122 did for the main body of the code.

@mkannwischer mkannwischer changed the title Refine selftest (again) Refine selftest further Dec 16, 2024
@mkannwischer mkannwischer marked this pull request as ready for review December 16, 2024 07:40
These are not necessarily restricted to GPRs as code
may hold pointers in FPU registers temporarily.
Previously the selftest would determine which registers
are supposed to contain addresses  (and allocate memory
accordingly) by going through all memory operations and
assuming that address registers used in those are the
inputs holding the addresses initially.

This assumption does not hold as
(1) addresses may be moved around
(2) addresses may actually be a result of a previous computation.

One example where this did not work was

vmov rX, sY
ldr tZ, [rX]

here the selftest would assume that rX needs to be
an address. However, sY is the register holding the
address on entry of the code.

This commit refines the code determining the address
registers by recursively going through the DFG
and determining the _input_ registers that affect
values being used as addresses.
Note that in the above examples rX would not be
marked as an address, at it is not an input.

Hopefully this approach is more robust.
This allows to access memory at negative offsets.
slothy/helper.py Outdated Show resolved Hide resolved
slothy/helper.py Outdated Show resolved Hide resolved
mkannwischer and others added 3 commits December 17, 2024 05:13
When the selftest fails with an emulation failure in unicorn, we would
previously not print any information hinting at the underlying problem.

This commit improves debuggability by printing the UcError exception
thrown by Unicorn.

Signed-off-by: Hanno Becker <[email protected]>
@hanno-becker hanno-becker merged commit 7223d66 into main Dec 17, 2024
13 checks passed
@hanno-becker hanno-becker deleted the refine-selftest branch December 17, 2024 05:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants