在qemu/hw/acpi 这个目录下是qemu对acpi的模拟,从其中的Makefile.objs 中可以看到x86支持两种类型的ACPI 硬件
common-obj-$(CONFIG_ACPI_X86) += core.o piix4.o pcihp.o
common-obj-$(CONFIG_ACPI_X86_ICH) += ich9.o tco.o
这里我们piix4.c 为例,其设备初始化代码如下:
static const TypeInfo piix4_pm_info = {.name          = TYPE_PIIX4_PM,.parent        = TYPE_PCI_DEVICE,.instance_size = sizeof(PIIX4PMState),.class_init    = piix4_pm_class_init,.interfaces = (InterfaceInfo[]) {{ TYPE_HOTPLUG_HANDLER },{ TYPE_ACPI_DEVICE_IF },{ INTERFACE_CONVENTIONAL_PCI_DEVICE },{ }}
};
初始化代码在piix4_pm_class_init中
static void piix4_pm_class_init(ObjectClass *klass, void *data)
{DeviceClass *dc = DEVICE_CLASS(klass);PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_CLASS(klass);k->realize = piix4_pm_realize;k->config_write = pm_write_config;k->vendor_id = PCI_VENDOR_ID_INTEL;k->device_id = PCI_DEVICE_ID_INTEL_82371AB_3;k->revision = 0x03;k->class_id = PCI_CLASS_BRIDGE_OTHER;
}
从piix4_pm_class_init中创建piix4的设备函数piix4_pm_realize,我们可以知道对于ACPI的操作
是映射到内存,然后直接操作内存
static void piix4_pm_realize(PCIDevice *dev, Error **errp)
{memory_region_init(&s->io, OBJECT(s), "piix4-pm", 64);
#内存操作默认没有使能处于disable状态memory_region_set_enabled(&s->io, false);memory_region_add_subregion(pci_address_space_io(dev),0, &s->io);acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io);acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io);acpi_pm1_cnt_init(&s->ar, &s->io, s->disable_s3, s->disable_s4, s->s4_val);acpi_gpe_init(&s->ar, GPE_LEN);s->powerdown_notifier.notify = piix4_pm_powerdown_req;qemu_register_powerdown_notifier(&s->powerdown_notifier);s->machine_ready.notify = piix4_pm_machine_ready;qemu_add_machine_init_done_notifier(&s->machine_ready);piix4_acpi_system_hot_add_init(pci_address_space_io(dev),pci_get_bus(dev), s);qbus_set_hotplug_handler(BUS(pci_get_bus(dev)), OBJECT(s));piix4_pm_add_propeties(s);
}
具体的使能在pm_write_config
static void pm_write_config(PCIDevice *d,uint32_t address, uint32_t val, int len)
{pci_default_write_config(d, address, val, len);if (range_covers_byte(address, len, 0x80) ||ranges_overlap(address, len, 0x40, 4)) {pm_io_space_update((PIIX4PMState *)d);}if (range_covers_byte(address, len, 0xd2) ||ranges_overlap(address, len, 0x90, 4)) {smbus_io_space_update((PIIX4PMState *)d);}
}
这里调用pm_io_space_update
static void pm_io_space_update(PIIX4PMState *s)
{PCIDevice *d = PCI_DEVICE(s);s->io_base = le32_to_cpu(*(uint32_t *)(d->config + 0x40));s->io_base &= 0xffc0;memory_region_transaction_begin();memory_region_set_enabled(&s->io, d->config[0x80] & 1);memory_region_set_address(&s->io, s->io_base);memory_region_transaction_commit();
}
可见这里是往offset为0x80里面写入1即可使能内存操作。系统起来后,可以通过cat /proc/ioports
命令来得到ACPI的控制内存的首地址.

qemu对acpi的模拟相关推荐

  1. Linux利器:QEMU!用它模拟开发板能替代真开发板?

    不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我! QEMU,搞嵌入式开发的一定不陌生,最近各大群里都讨论疯了,说它是Linux利器一点也不夸张.它是一款知名的而且开源的模拟器(官网 ...

  2. 配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境

    编者按: 参考文章&课程: leao :用qemu建立mini2440的模拟仿真环境 https://www.cnblogs.com/jinmu190/archive/2011/03/21/1 ...

  3. qemu虚拟化-pci设备模拟

    pci设备算是学习qemu必须要掌握的一类设备的模拟,单独提出来说一下.这里以qemu的pci教学程序为基础讲解,源码路径:hw/misc/edu.c 1.设备的定义 typedef struct { ...

  4. QEMU模拟vexpress-a9 搭建Linux kernel运行环境

    众所周知,QEMU是一个可以模拟ARM架构的虚拟机,拥有高速.开源.跨平台.支持多种架构等优点.接下来,我们将使用QEMU模拟vexpress-a9,并在上面跑一个Linux kernel,为接下来的 ...

  5. 用QEMU模拟ARM开发板,搭建Linux kernel运行环境

    前言 有的时候我们想调试linux kernel或者linux应用程序,但是又没有硬件环境,这个时候可以选择用模拟器的方法,模拟出一个硬件环境. Android emulator Android系统的 ...

  6. 用QEMU模拟运行 WIndows 98 SE (2004.12.31更新)

    先来简单介绍一下吧,QEMU是一种遵守GPL许可证,快速的虚拟机软件.它通过动态翻译 机内地址来获得比较快速的模拟速度. QEMU有两种模拟方式: 1.完整的系统模拟:这种模式下,QEMU模拟一个完整 ...

  7. QEMU,一个快速的和便捷的动态翻译器(论文译文)

    QEMU, a Fast and Portable Dynamic Translator论文译文  https://www.usenix.org/legacy/event/usenix05/tech/ ...

  8. 欢迎使用 QEMU 的文档!| 目录

    Welcome to QEMU's documentation! - QEMU documentationhttps://qemu-project.gitlab.io/qemu/ About QEMU ...

  9. (编译适用于ARM的linux内核并进行QEMU仿真)Compile Linux kernel 3.2 for ARM and emulate with QEMU

    译者序 作为第一篇翻译文档,一方面对于翻译经验不足.措辞不当,另一方面对于linux我也是初学者,很多东西尚处于待学阶段,而翻译此文的动机就是我要学习如何跨平台进行文件系统的编译,所以翻译的结果肯定有 ...

最新文章

  1. SVG.path_不连续的线段
  2. gVim 取消自动备份(Windows/Linux)
  3. inline-block间隙原因和解决方法(web前端问题)
  4. 图像滤镜艺术---PS图层混合模式之明度模式
  5. 斜度符号标注_机械图纸尺寸标注规则,第1次见,太直观太形象了!测量工程师可以拿去教绘图的了!...
  6. NVIDIA 显卡与 CUDA 在深度学习中的应用
  7. 大剑无锋之delete、drop、truncate【面试推荐】
  8. 使用SAP Analytics Cloud统计SAP C4C系统创建Lead里包含的产品信息分布情况
  9. 光磁记录实现数据冷存储
  10. 【渝粤题库】陕西师范大学210004幼儿园美术教育作业(高起专)
  11. 【填坑中】学生信息管理系统
  12. 【服务器】在 iPad 上运行 VSCode(宝塔+code server)
  13. 【Android开发】图形图像处理技术-绘制文本
  14. SaaSpace:25款最佳免费视频编辑软件工具
  15. 台安PLC通过手机热点远程在线模拟,远程编程,远程调试
  16. 作战管理系统:现代化作战体系核心
  17. LT8618SXB-HDMI发射器,运行功率小于100mA播放24bit 1080P内容,待机功率小于2mA
  18. 期货卖出平仓价和买入平仓价(期货平仓价和结算价)
  19. 笔记本电脑总是锁定计算机呢,笔记本电脑键盘锁定了怎么办有什么方法解锁
  20. CAD中怎么给设备赋值?

热门文章

  1. [技术干货] 惠普3par命令行配置snmptrap
  2. 基于qt中QCalendarWidget的双日历时间范围选择控件(自定义)
  3. H.266 JEM相对于HEVC HM的改进
  4. 【Struts2】Struts2框架创建web项目的6个步骤
  5. Summary_HTML中让两个div并排显示
  6. 超硬核:Linux系统内存知识
  7. JAVA线程之Thread类详解
  8. 第23节--python创建网页
  9. HQChart使用教程86-技术指标OX图
  10. 搭建中台架构的几个误区