Skip to content

Qemu Target Testing Tool (Q3T) - #116

Open
laerreal wants to merge 99 commits into
masterfrom
q3t
Open

Qemu Target Testing Tool (Q3T)#116
laerreal wants to merge 99 commits into
masterfrom
q3t

Conversation

@laerreal

@laerreal laerreal commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

This commit series introduces a new testing method implementation.
The method is to write tests in any way a target toolchain supports.
Then test are to be compiled to binaries.
Q3T launches a binary in Qemu to be tested, under debug through GDB RSP stub.
It checks runtime values using the way described below.

The way those binaries are got is out of Q3T's scope.
A target toolchain must return binaries in Q3T supported formats.
ELF is only supported now.
Those binaries must contain a debug info in Q3T supported formats.
DWARF v4 is only supported.
However, v3 and v5 is known to be compatible too, in some cases.
Q3T reads source code of binaries.
So, the source code is to be available during the operation.

Global (exported) symbols with special names are to be added
to the source code.
I.e. labels in assembly or functions in C (labels in C are not exported).
Those symbols are break points.
The prefix is required to distinguish break points of interest and
regular symbols.
The symbol prefix is configurable.
A break point is to be accompanied with Python expressions
with a special prefix.
Expressions is likely to be wrapped in language specific comment syntax.
The prefix is required to distinguish expressions and regular comments.
Also, Q3T can't know all comment syntax.
So, the prefix is a hint for it.
The expression prefix is configurable.
There is an operation mode in which only expressions are required.
This is especially useful versus an optimizing C compiler dropping functions
with empty bodies.

Python expressions must return a value boolling to True.
Q3T defines an environment which allows access to

  • target registers,
  • target memory,
  • debug symbols,
  • python builtin functions,
  • etc.

There are few helpers to write low level checks.
E.g.,

  • signed/unsigned integer interpretation,
  • float-point numbers interpretation,
  • little-/big-endian multibyte integers conversions,
  • etc.

A Python script instantiating Q3T configuration is required.
E.g., q3t.py.
It must define...

  • rsp, QRSP target, a definition of target for GDB RSP protocol.
  • args, an iterable, a command to launch Qemu.
    {variables} are available for CLI argument definition.
    E.g., ["-kernel", "{bin}"] can take a part in the args sequence.
  • bins, an iterable, binary files of tests.
    E.g., (f for f in listdir(dirname(__file__)) if f.endswith(".elf"))
    generator yields all *.elf files in the same directory with the
    configuration script (q3t.py).

The patch series first extends existing QDT capabilities.
debug package is touched mostly.
New features are added.
DWARF information analysis is extended.
Some patches are not squashed for history, but they are placed tightly.

Then a big sub-series of patches adds Q3T.
Those patches are to be considered a single patch.
They are not squashed for history.
Final diff to be reviewed.

laerreal added 30 commits August 1, 2026 01:50
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
…_exprloc`

Signed-off-by: Efimov Vasily <real@ispras.ru>
Not in `DW_FORM_exprloc`.

Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
…e program

Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Some compilers do that thing.

Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
…et PC value

Signed-off-by: Efimov Vasily <real@ispras.ru>
…allback`s

Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
…ction

Signed-off-by: Efimov Vasily <real@ispras.ru>
laerreal added 26 commits August 1, 2026 02:00
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
…e.co_main`

Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
…onfig

Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
Signed-off-by: Efimov Vasily <real@ispras.ru>
@laerreal

Copy link
Copy Markdown
Contributor Author

Данила, этот реквест пока ознакомительный, но даже в таком виде, вероятно, готов.
Я добавлю патчи с примером применения для msp430 позже.
Хотя их можно добавить и в следующем реквесте.
Можешь мёржить сейчас, а можешь подождать.
В любом случае эти патчи будут скорее для посторонних пользователей.
Возьми исходники моего таргета с вертолёта, чтобы не генерить их самому.
Для генерации нужен весь devel, а для проверки Q3T хватит только этой ветки, но это не точно.
В ветке с моделью моего таргета есть тесты и конфиг для Q3T.
Если у тебя нет тулчейна, чтобы собрать тесты, пиши мне в личку.
Те тесты раскрывают все возможности Q3T, в том числе и некоторые патчи в debug.
Там тулчейн хороший и ELFы интересные генерит.
Тесты для msp430 явно не будут так хороши.
Т.ч. играйся на "боевом" таргете.

@laerreal

laerreal commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

Кста, патч {DWARFInfoAccelerator.account_line_program_CU: CU can be without a line program} есть в c2t_updates.
Но там он, вероятно, не очень нужен. Да и здесь как бы тоже.
Он нужен для тулчейна от моего таргета.
В таком случае он нужен даже в c2t_updates.
Но для моего таргета в c2t_updates нужны и другие патчи в debug из этого реквеста.
Просто, c2t_updates можно проверить и на msp430, т.ч. я их туда не добавлял.
Но если ребейзнишь c2t_updates на q3t, то сможешь натравить на мой таргет и c2t.

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