Как сделать мое устройство доступным для QEMU - PullRequest
2 голосов
/ 21 июня 2019

Я написал, как мне кажется, минимальное пользовательское устройство для проверки моего понимания QOM и QEMU в целом. Ниже приведен соответствующий код с опущенными комментариями. К сожалению, когда я запускаю гостя и передаю имя моего устройства в качестве аргумента командной строки, оно не может найти мое устройство и завершает работу. Я выдаю:

qemu-system-x86_64 -device hello-world-device ...

Как я могу сообщить QEMU о моем устройстве? Какие шаги мне нужно предпринять, чтобы правильно собрать мое устройство?

Я вижу список объектов в папке, в которую я поместил свой источник (qemu / hw / misc), но я не могу найти, где определены другие цели для добавления в цель для моего нового устройства. Код:

#include "qom/object.h"
#include "hw/qdev-core.h"
#define TYPE_HELLO "hello-world-device"
#define HELLO(obj) OBJECT_CHECK(HelloState, (obj), TYPE_HELLO)

typedef struct{
    DeviceClass parent_obj;
    uint8_t member0, member1;
} HelloState;

static const TypeInfo hello_info = {
    .name = TYPE_HELLO,
    .parent = TYPE_DEVICE,
    .instance_size = sizeof(HelloState),
    .class_init = class_init,
};

static void class_init(ObjectClass *klass, void *data){
    DeviceClass *dc = DEVICE_CLASS(klass);
}

static void hello_register_types(void){
    type_register_static(&hello_info);
}

type_init(hello_register_types)

1 Ответ

0 голосов
/ 24 июня 2019

Документация неясна или отсутствует относительно того, как это должно быть выполнено, но я все же нашел решение, которое работало тем временем.

В каталоге, где хранится исходный файл (здесь, qemu / hw / misc /), есть файл Makefile.objs со списком целевых файлов объектных файлов, которые необходимо создать. Добавление следующей строки побудит основной Makefile (в корневом каталоге QEMU) создать цель, когда определен флаг конфигурации CONFIG_HELLO:

common-obj-$(CONFIG_HELLO) += hello-world-device.o

Чтобы определить этот пользовательский флаг, запись может быть добавлена ​​к целевой архитектуре по выбору. Здесь я добавляю его в свою конфигурацию для x86_64 в qemu / default-configs / x86_64-softmmu.mak:

CONFIG_HELLO=y

После внесения вышеуказанных изменений, запуск make создает правило для создания пользовательского устройства и запускает его в подходящее время при построении архитектуры. Это выявило ошибку включения в существующем коде, повторяемую здесь с поправками для удобства:

#include "qemu/osdeps.h"
#include "hw/hw.h"
#define TYPE_HELLO "hello-world-device"
#define HELLO(obj) OBJECT_CHECK(HelloState, (obj), TYPE_HELLO)

typedef struct{
    DeviceClass parent_obj;
    uint8_t member0, member1;
} HelloState;

static const TypeInfo hello_info = {
    .name = TYPE_HELLO,
    .parent = TYPE_DEVICE,
    .instance_size = sizeof(HelloState),
    .class_init = class_init,
};

static void class_init(ObjectClass *klass, void *data){
    DeviceClass *dc = DEVICE_CLASS(klass);
}

static void hello_register_types(void){
    type_register_static(&hello_info);
}

type_init(hello_register_types)
...