【qemu】在qemu/hw/arm里添加一个新的machine机器类型

作者在QEMU中尝试添加新的machine类型,遇到注册问题。通过研究`type_init`和`type_register_static`调用,发现需要为新machine定义两个TypeInfo并正确隔离。过程中涉及到了兼容性属性设置和编译问题的解决。
摘要由CSDN通过智能技术生成

我想在qemu里添加一个新的machine
基于virt这个machine类型搞了半天呐,qemu-system-aarch64 -M help的时候一直没有我新加的machine
我寻思不对啊。明明一样啊!
那会不会是因为太一样了?导致跟virt这个机器类型重叠了?先要加点区别(前缀),不管有用没用先试了再说(领导一直问进度,我心里慌的啊!)。后面我把find_machine这个函数的遍历都找了个遍呐。都没有找到我新加的那个。
后面我仔细研究哪个不一样。肯定是漏了啥。再我搜来又搜去,最后回到最初。

#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
    static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
                                                    void *data) \
    { \
        MachineClass *mc = MACHINE_CLASS(oc); \
        virt_machine_##major##_##minor##_options(mc); \
        mc->desc = "QEMU " # major "." # minor " ARM Virtual Machine"; \
        if (latest) { \
            mc->alias = "virt"; \
        } \
    } \
    static const TypeInfo machvirt_##major##_##minor##_info = { \
        .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
        .parent = TYPE_VIRT_MACHINE, \
        .class_init = virt_##major##_##minor##_class_init, \
    }; \
    static void machvirt_machine_##major##_##minor##_init(void) \
    { \
        type_register_static(&machvirt_##major##_##minor##_info); \
    } \
    type_init(machvirt_machine_##major##_##minor##_init);

#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
    DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
#define DEFINE_VIRT_MACHINE(major, minor) \
    DEFINE_VIRT_MACHINE_LATEST(major, minor, false)

我寻思这里调用了一次type_init啊。

static void machvirt_machine_init(void)
{
    type_register_static(&virt_machine_info);
}
type_init(machvirt_machine_init);

static void virt_machine_8_0_options(MachineClass *mc)
{
}
DEFINE_VIRT_MACHINE_AS_LATEST(8, 0)

static void virt_machine_7_2_options(MachineClass *mc)
{
    virt_machine_8_0_options(mc);
    compat_props_add(mc->compat_props, hw_compat_7_2, hw_compat_7_2_len);
}
DEFINE_VIRT_MACHINE(7, 2)

就说这里DEFINE_VIRT_MACHINE调用了两次type_init。而且type_init(machvirt_machine_init);。
对不对!
就是这里
**

virt_machine_info是基于TYPE_MACHINE的,我就只加了这个,所以出不来。必须再type_register_static一个基于virt_machine_info的一个TypeInfo

**
等于起码要调用两个type_init,两个type_register_static。定义两个TypeInfo 。
至此就出来了。
好家伙,浪费我两天
终于给我整出来了。
网上为什么没有人说,是因为我删的太多?而别人都知道这块不能删吗!(也许别人改的方法不一样,但是我这个应该是ok的)
唉,怪我!
嘻嘻,还好在下班前搞出来了,周末可以安心玩了。
连上7天,人已经傻了。

好气,还要挪到yocto里,yocto怎么不配合,快下班了都。
捉急

更新,今天已经是周一了。yocto这边死活编不过。编译又超级耗时
具体就是找不到文件啊找不到定义啊什么之类的。
在这里插入图片描述
只能说我yocto还运用的不是很灵活。

====
更新,今天周二了。yocto的是搞定了(—他忽然就好了哈哈哈,我是真的不知道咋回事哈哈,只是在Kconfig里去掉了一个default y.但是这个也不合理啊,没听说不能加default啊?????)。
但是跑起来还是有点问题。
具体问题是啥呢?
由上文可知,我是基于virt的machine新创建了一个machine类型,但是他呢,我自认为已经隔离开来了。每次跑的时候都还去virt里get_class。

xxx@DESKTOP-xxxxxx:/xxxx/qemu/build$ ./qemu-system-aarch64 -M xx-virt  -cpu cortex-a55
/xxx/qemu-8.0.0/include/hw/arm/virt.h:191:VIRT_MACHINE_GET_CLASS: Object 0x56032deab230 is not an instance of type virt-machine
Aborted

这就让我很被动,我搜遍了代码都没有查出来,只能用最笨的办法,加打印!

ClassType=OBJ_NAME=MACHINE, TYPENAME=machine
object_class_get_name=xxxx-virt-machine
ClassType=OBJ_NAME=VIRT_MACHINE, TYPENAME=virt-machine
object_class_get_name=xxxx-virt-machine
/xxx/qemu-8.0.0/include/hw/arm/virt.h:191:VIRT_MACHINE_GET_CLASS: Object 0x56032deab230 is not an instance of type virt-machine
Aborted

有的东西,但不多,需要继续加。
咦,我发现了问题的根源:virt_acpi_setup,他仅仅只是声明,定义在别个文件!!!别个模块!!!!!!!
在这里插入图片描述
果然还是抄的不够小心,这哪里隔离开了,这有个钩子,勾到了hw\arm\virt-acpi-build.c这个文件,不得了了,他全是VirtMachineState
在我的隔离政策下,所有的结构体都给我加了前缀,可这个别人家的函数咋办。
哎,麻烦
不过,总算是给我定位到问题了。
我粗暴的先注释掉这个调用,发现跑不起来哈哈,挂在init阶段了。
嗯,工作每一步都有新的惊喜,要不留到明天再搞吧。
编译实在太费时间了。

在这里插入图片描述
我觉得就是我这个野路子,改的不行,才会出现这么多bug

在这里插入图片描述
bug前移

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值