dev: Add a base QEMU firmware config device.
This artificial device is provided by QEMU inside their emulated machines to feed extra configuration information to the system firmware, or even to the operating system if it chose to use it. The behavior of this device is explained in the docs/specs/fw_cfg.txt file in the QEMU source. This implementation currently supports the traditional interface, and does not support the DMA based interface, although it probably wouldn't be that hard to expand it to in the future. The interface exposes individual entries which can optionally (and usually) have paths associated with them that you can look up in a directory type entry which has a fixed index. There are some entries which are built into the device itself, which are the ID, signature and directory entries, but the rest can be set up in the config scripts. To make it easier to add new entries which are not from config scripts, aka the ones that are hard coded in C++ and built into the device, the actual entries themselves are not SimObjects, but it's easy to create a SimObject wrapper which will spit them out for the device to consume. Other items can be added to the device manually without generating them with SimObjects. Entries can have fixed or automatically generated indices. All entries have a "path" in the sense that they have a name, but as a minor deviation from what the QEMU documentation says, a "path" which begins with a "." is not exported in the directory. This is purposefully reminiscent of the unix style hidden file mechanism, where files or directories who's names begin with "." are not normally shown by ls. There are two different styles of this device, one which is IO port based, and one which is MMIO based. Which to use depends on the architecture, where x86 currently uses the IO scheme and ARM uses the MMIO scheme. The documentation doesn't say what other ISAs use, if any other ones support this interface, but I'd assume the MMIO version. These are split out because the rules for how they work are subtly different, but they share a lot of common machinery under the hood. In most cases where somebody tries to talk to the device in an unusual way, for instance accessing a register with an incomplete width or at an offset, the device will just report all zeroes. The behavior in those cases isn't specified, in many cases doesn't make sense based on the design of the device, and doesn't seem to be depended on in the limited use case I looked at. Change-Id: Ib81ace406f877b298b9b98883d417e7d673916b5 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/55627 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Gabe Black <gabe.black@gmail.com> Maintainer: Gabe Black <gabe.black@gmail.com>
This commit is contained in:
34
src/dev/qemu/SConscript
Normal file
34
src/dev/qemu/SConscript
Normal file
@@ -0,0 +1,34 @@
|
||||
# Copyright 2022 Google, Inc.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Import('*')
|
||||
|
||||
SimObject('QemuFwCfg.py', sim_objects=[
|
||||
'QemuFwCfgItem', 'QemuFwCfgItemFile', 'QemuFwCfgItemString',
|
||||
'QemuFwCfg', 'QemuFwCfgIo', 'QemuFwCfgMmio'])
|
||||
Source('fw_cfg.cc')
|
||||
|
||||
DebugFlag('QemuFwCfg')
|
||||
DebugFlag('QemuFwCfgVerbose')
|
||||
Reference in New Issue
Block a user