ispras / qdt

QEMU Development Toolkit
Other
36 stars 8 forks source link

Добавление пользовательских функций кодогенерации #15

Open Chert-Nik opened 4 years ago

Chert-Nik commented 4 years ago

На данный момент QDT позволяет сгенерировать заготовки перефирийных устройств, при этом реализация поведенческого аспекта ложится на пользователя.

У меня возникла необходимость в автоматической генерации некоторых моделей периферийных устройств. При этом часть поведеньческой функциональности, в моем случае, может быть так же сгенерированна автоматически.

В настоящий момент я использую инструмент QDT для генерации заготовок периферийных устройств. Затем мне приходится парсить сгенерированные QDT .h и .c файлы и добавлять в них функциональность.

Было бы здорово, если бы QDT представлял возможность пользователю интегрироваться в процесс кодогенерации, для добавления в заготовки необходимой функциональности.

В частности, если в текущей версии QDT позволяет мне сгенерировать следующий .h файл:

/* uart2.h */
#ifndef INCLUDE_UART2_H
#define INCLUDE_UART2_H
#include "chardev/char-fe.h"
#include "hw/sysbus.h"

//INSERT POS 1

#define TYPE_UART2 "uart2"
#define UART2(obj) OBJECT_CHECK(UART2State, (obj), TYPE_UART2)
#define UART2_CHR "chr"

//INSERT POS 2

typedef struct UART2State {
    SysBusDevice parent_obj;
    MemoryRegion mmio;
    CharBackend chr;

    //INSERT POS 3

} UART2State;

//INSERT POS 4

#endif /* INCLUDE_UART2_H */

То я бы хотел иметь возможность предоставить QDT набор функций (callback-ов), через которые бы был сгенерирован произвольный код на месте комментариев "INSERT POS".

По аналогии с .h файлом для .c файла хотелось бы иметь возможность генерировать произвольный код для добавления #include файлов, описания пользовательских функций, и предоставления осмысленной реализации функциям, генерируемым QDT.

В дальнейшем аналогичная функциональность понадобилась бы и для генерации платформ.

laerreal commented 4 years ago

Сразу нужно сказать, что текущая реализация модели не позволяет вставлять совсем уж произвольный код. Во-первых, код не может быть просто строкой (вернее, может, но только в определённых случаях). Он должен быть построен с помощью API из модуля source. Примеры использования этого API можно найти в qemu/sysbusdevice.py, qemu/pcie.py и других файлах, отвечающих за генерацию (в том же модуле). Во-вторых, мы пока не поддерживаем весь синтаксис Си. Собственно, примеры в обозначенных файлах содержат почти все поддерживаемые случаи использования. Возможности допиливаются по мере надобности.

Вклиниться в процесс генерации можно (теоретически) с помощью наследования и перегрузки методов генерации. В данном случае от qemu.sysbusdevice.SysBusDeviceType. Проанализировав код методов, отвечающих за генерацию, можно заметить, что они сохраняют созданные сущности в self под определёнными именами, откуда их можно достать и изменить.

Я попробую придумать какой-нибудь пример. Также м.б. получится сделать некоторые вещи удобнее. Это будет PR, следите за обновлениями.

laerreal commented 4 years ago

PR #17 добавляет пример вставки пользовательского кода в заготовку.