Skip to the content.

hack with qemu

ACPI 基础教程

  1. Linux kernel doc
  2. acpica : acpi introduction :star:
  3. ACPI Source Language (ASL) Tutorial
  4. ACPI: Design Principles and Concerns
  5. Getting started with ACPI

反汇编 acpi table

问题

acpi setup

FDC0 / MOU / KBD 的 ACPI 描述是如何添加进去的

#0  i8042_build_aml (isadev=0x5555566eb400, scope=0x55555699a990) at ../hw/input/pckbd.c:564
#1  0x000055555590c474 in isa_build_aml (bus=<optimized out>, scope=scope@entry=0x55555699a990) at ../hw/isa/isa-bus.c:214
#2  0x0000555555a6e08d in build_isa_devices_aml (table=table@entry=0x555556909540) at /home/maritns3/core/kvmqemu/include/hw/isa/isa.h:17
#3  0x0000555555a71281 in build_dsdt (machine=0x5555566c0400, pci_hole64=<synthetic pointer>, pci_hole=<synthetic pointer>, misc=<synthetic pointer>, pm=0x7fffffffd450, linker=0x5555568d6bc0, table_data=0x555556aae0a0) at ../hw/i386/acpi-build.c:1403
#4  acpi_build (tables=tables@entry=0x7fffffffd530, machine=0x5555566c0400) at ../hw/i386/acpi-build.c:2374
#5  0x0000555555a73e8e in acpi_setup () at /home/maritns3/core/kvmqemu/include/hw/boards.h:24
#6  0x0000555555a5fd1f in pc_machine_done (notifier=0x5555566c0598, data=<optimized out>) at ../hw/i386/pc.c:789
#7  0x0000555555d27e67 in notifier_list_notify (list=list@entry=0x5555564c0a58 <machine_init_done_notifiers>, data=data@entry=0x0) at ../util/notify.c:39
#8  0x00005555558ff94b in qdev_machine_creation_done () at ../hw/core/machine.c:1280
#9  0x0000555555bae301 in qemu_machine_creation_done () at ../softmmu/vl.c:2567
#10 qmp_x_exit_preconfig (errp=<optimized out>) at ../softmmu/vl.c:2590
#11 0x0000555555bb1e62 in qemu_init (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at ../softmmu/vl.c:3611
#12 0x000055555582b4bd in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at ../softmmu/main.c:49

原来是通过 isa 总线将描述信息添加进去的。

应该是,acpi 必须在运行时才可以构建好, 而且是通过 copy of table in RAM 来 patched

typedef struct AcpiBuildState {
    /* Copy of table in RAM (for patching). */
    MemoryRegion *table_mr;
    /* Is table patched? */
    uint8_t patched;
    void *rsdp;
    MemoryRegion *rsdp_mr;
    MemoryRegion *linker_mr;
} AcpiBuildState;

从 NVDIMM 到 Bios Linker

https://richardweiyang-2.gitbook.io/understanding_qemu/00-qmeu_bios_guest/03-seabios

https://richardweiyang-2.gitbook.io/understanding_qemu/00-devices/00-an_example/05-nvdimm

似乎,连 acpi 的函数和构建地址空间

从 romfile_loader_execute 看,etc/table-loader 中就是装载各种 table 的东西

etc/table-loader

DSDT address to be filled by Guest linker at runtime

除了 TMPLOG ,其余的三个都是和 acpi_build_update 关联起来的:

#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables"
#define ACPI_BUILD_RSDP_FILE "etc/acpi/rsdp"
#define ACPI_BUILD_TPMLOG_FILE "etc/tpm/log"
#define ACPI_BUILD_LOADER_FILE "etc/table-loader"

la 中如何处理 acpi

感觉 ramooflax 的处理是相当的简单,其实他甚至可以在 acpi 解析之前就可以来初始化 e1000

ramooflax 不需要模拟 acpi 设备空间,因为设备本身就是相同的

[    0.888502] [<900000000020864c>] show_stack+0x2c/0x100
[    0.888504] [<9000000000ec3988>] dump_stack+0x90/0xc0
[    0.888507] [<90000000009a605c>] really_probe+0x20c/0x2b8
[    0.888509] [<90000000009a62b4>] driver_probe_device+0x64/0x100
[    0.888511] [<90000000009a3e18>] bus_for_each_drv+0x68/0xa8
[    0.888513] [<90000000009a5dcc>] __device_attach+0x124/0x1a0
[    0.888515] [<90000000009a504c>] bus_probe_device+0x9c/0xc0
[    0.888517] [<90000000009a14b0>] device_add+0x350/0x608
[    0.888519] [<90000000009a7fc0>] platform_device_add+0x128/0x288
[    0.888521] [<90000000009a8dd0>] platform_device_register_full+0xb8/0x130
[    0.888523] [<90000000008a259c>] acpi_create_platform_device+0x28c/0x300
[    0.888525] [<9000000000898368>] acpi_default_enumeration+0x28/0x58
[    0.888526] [<9000000000898598>] acpi_bus_attach+0x1d0/0x210
[    0.888528] [<9000000000898420>] acpi_bus_attach+0x58/0x210
[    0.888530] [<9000000000898420>] acpi_bus_attach+0x58/0x210
[    0.888532] [<900000000089a56c>] acpi_bus_scan+0x34/0x78
[    0.888534] [<90000000012f8060>] acpi_scan_init+0x170/0x2b8
[    0.888536] [<90000000012f7c68>] acpi_init+0x2e4/0x338
[    0.888537] [<90000000002004fc>] do_one_initcall+0x6c/0x170
[    0.888540] [<90000000012d4ce0>] kernel_init_freeable+0x1f8/0x2b8
[    0.888542] [<9000000000eda794>] kernel_init+0x10/0xf4
[    0.888544] [<9000000000203cc8>] ret_from_kernel_thread+0xc/0x10

acpica 的移植

  1. 代码拷贝
    git clone ...
    cd generate/linux
    ./gen-repo.sh
    
  2. 修改头文件
  3. 修改 Makefile

我找到了好几个 mini kernel 的存在,目前来说,几乎没有人会 将整个 acpica 包含进去,我们应该好好调查一下,真的有必要吗?

原来 arm 的 virt 也是需要这么使用的

hw/arm/virt-acpi-build.c

virt_acpi_setup 中:

rsdp 是什么东西

info ramblock

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。