Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Mon, Oct 05, 2015 at 03:18:05PM +0200, Paolo Bonzini wrote: > > > On 05/10/2015 14:50, Peter Maydell wrote: > > If you want to try to support "firmware might also be reading > > fw_cfg at the same time as the kernel" this is a (painful) > > problem regardless of how the kernel figures out whether a > > fw_cfg device is present. I had assumed that one of the design > > assumptions of this series was that firmware would only > > read the fw_cfg before booting the guest kernel and never touch > > it afterwards. If it might touch it later then letting the > > guest kernel also mess with fw_cfg seems like a really bad idea. > > The idea of tinkering with fw_cfg from the AML code (DSDT/SSDT) has been > proposed many times, and always dropped. One of the reasons was that > the OS could have a driver for fw_cfg. > > So I think that we can define the QEMU0002 id as owned by the OSPM, > similar to the various standard ACPI ids that are usually found in the > x86 world (e.g. PNP0B00 is a mc146818 RTC, PNP0303 is an 8042 keyboard > controller, PNP0501 is a 16550 or similar UART, and so on). This > basically sanctions _CRS as the way to pass information from the > firmware to the OSPM, also similarly to those standard PNP ids. OK, so I don't expect to go the "pure ACPI" route in the final version, mainly because I'm still hoping to fill the requirement of writing a driver which can use either ACPI or DT to detect the presence of fw_cfg (how I'm going to compile this on kernels with no ACPI or no DT support is still TBD, and probably will have to involve #ifdef, but I digress :) However, Michael's idea of having ACPI supply an "accessor method" for the guest kernel driver to call, without having to worry about the specific details in _CRS, sounded intriguing enough to at least explore in further detail. So, assuming we have the following fw_cfg AML in ssdt (i386) or dsdt (arm) (using cpp-style #ifdef to highlight the arch-specific bits): Scope (\_SB) { Device (FWCF) { Name (_HID, EisaId ("QMU0002")) // _HID: Hardware ID Name (_STA, 0x0B) // _STA: Status #ifdef ARCH_X86 Name (_CRS, ResourceTemplate () { IO (Decode16, 0x0510, // Range Minimum 0x0510, // Range Maximum 0x01, // Alignment 0x02, // Length ) }) #else /* ARCH_ARM */ NAME (_CRS, ResourceTemplate () { Memory32Fixed (ReadWrite, 0x0902, // Address Base 0x000a, // Address Length ) }) #endif } } I can easily patch QEMU to additionally insert the following into "Device (FWCF)": #ifdef ARCH_X86 OperationRegion (FWCR, SystemIO, 0x0510, 0x02) Field (FWCR, WordAcc, NoLock, Preserve) { FWCC, 16 } Field (FWCR, ByteAcc, NoLock, Preserve) { Offset (0x01), FWCD, 8 } #else /* ARCH_ARM */ OperationRegion (FWCR, SystemMemory, 0x0902, 0x0a) Field (FWCR, WordAcc, NoLock, Preserve) { Offset (0x08), FWCC, 16 // not sure about endianness on ARM here, but // I can still address this from the userspace // kernel driver if needed } Field (FWCR, ByteAcc, NoLock, Preserve) { FWCD, 8 } #endif Method (RDBL, 3, Serialized) // (Arg0 = key, Arg1 = skip, Arg2 = count) { FWCC = Arg0 Local0 = Zero While ((Local0 < Arg1)) { Local1 = FWCD Local0++ } Name (BBUF, Buffer (Arg2) {}) Local0 = Zero While ((Local0 < Arg2)) { Index (BBUF, Local0) = FWCD /* \_SB_.FWCF.FWCD */ Local0++ } Return (BBUF) /* \_SB_.FWCF.RDBL.BBUF */ } With the host generating the additional RDBL method above, I could write a "pure ACPI" driver for the guest kernel, where instead of the current fw_cfg_read_blob() logic: static DEFINE_MUTEX(fw_cfg_dev_lock); static bool fw_cfg_is_mmio; static inline u16 fw_cfg_sel_endianness(u16 key) { return fw_cfg_is_mmio ? cpu_to_be16(key) : cpu_to_le16(key); } static inline void fw_cfg_read_blob(u16 key, void *buf, loff_t pos, size_t count) { mutex_lock(_cfg_dev_lock); iowrite16(fw_cfg_sel_endianness(key), fw_cfg_reg_ctrl); while (pos-- > 0) ioread8(fw_cfg_reg_data); ioread8_rep(fw_cfg_reg_data, buf, count); mutex_unlock(_cfg_dev_lock); } I could instead write something like this: struct acpi_device *dev;/* set during module init. */ static inline
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On 10/05/15 15:05, Mark Rutland wrote: >>> I'm not sure I follow what the difficulty with supporting DT in addition >>> to ACPI is? It looks like all you need is a compatible string and a reg >>> entry. >> >> Bearing in mind that I have almost no experience with arm: >> >> I started out by probing all possible port-io and mmio locations where >> fw_cfg registers might have been found, from a "classic" module_init >> method. >> >> Arm has DT, which as far as I understand will answer the following two >> questions: 1. Do I have fw_cfg ? 2. If yes, what address range does it use ? >> So that I could continue using a classic module_init, but won't need >> to probe for the device. >> >> PC (my primary architecture, the one I actually care about) does not >> have DT. If I want to share the same code, I can't probe, so if I try >> DT and don't find fw_cfg there (or somehow DT is no-op-ed out because >> I'm on a PC guest), I could somehow look it up in ACPI the same way >> (i.e., use ACPI as sort of a stand-in for DT). > > I'd imagine that it's simple to have something in your probe path like: > > if (pdev->dev.of_node) > parse_dt(pdev); > else > parse_acpi(pdev); > >> But all ACPI-enabled drivers I could find use dedicated macros (i.e. >> no more classic module_init() and module_exit(), but rather >> module_acpi_driver() with .add and .remove methods on an acpi_driver >> object, etc.) Not sure how I'd glue DT back into something like that. > > You don't have to use those macros, and can simply use the classic > module_{init,exit} functions, calling the requisite acpi driver > registration functions at module {init,exit} time. > >> In addition, Michael's comment earlier in the thread suggests that >> even my current acpi version isn't sufficiently "orthodox" w.r.t. >> ACPI, and I should be providing the hardware access routine as >> an ACPI/AML routine, to avoid race conditions with the rest of ACPI, >> and for encapsulation. I.e. it's even rude to use the fw_cfg node's >> ACPI _CRS method (the part where I'd be treating it like a DT stand-in >> only to query fw_cfg's hardware specifics). > > As Peter stated, this sounds very much like it rules out sharing the > interface with FW generally (and is certainly scary). > >> So far, all the information I've been able to pull together points >> away from a dual DT + ACPI all-in-one solution for fw_cfg. If you know >> of an example where that's done in an acceptable way, please let >> me know so I can use it for inspiration... > > I'm not immediately aware, but I would imagine you could search for > files that had both an of_match_table and a acpi_bus_register_driver > call. One file that I think is an example for this (and I have looked at before) is: "drivers/virtio/virtio_mmio.c". Virtio-mmio is supposed to be enumerable in both ACPI and DT virtual machines. For the QEMU side, grep QEMU for "LNRO0005" vs. "virtio,mmio". Thanks Laszlo
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Mon, Oct 05, 2015 at 11:00:36AM +0100, Mark Rutland wrote: > On Sat, Oct 03, 2015 at 07:28:05PM -0400, Gabriel L. Somlo wrote: > > From: "Gabriel Somlo"> > > > Allow access to QEMU firmware blobs, passed into the guest VM via > > the fw_cfg device, through SysFS entries. Blob meta-data (e.g. name, > > size, and fw_cfg key), as well as the raw binary blob data may be > > accessed. > > > > The SysFS access location is /sys/firmware/qemu_fw_cfg/... and was > > selected based on overall similarity to the type of information > > exposed under /sys/firmware/dmi/entries/... > > What is the intended use of these? > > Some of the keys in the example look like they'd come from other sources > (e.g. the *-tables entries), while others look like kernel/bootloader > configuration options (e.g. etc/boot-fail-wait, bootorder) -- I'm > concerned about redundancy here. Paolo already answered that (more eloquently than I would have) so I'll leave it at that, for now... > > > NEW (since v2): Using ACPI to detect the presence and details of the > > fw_cfg virtual hardware device. > > > > Device Tree has been suggested by Ard as a comment on v2 of this > > patch, but after some deliberation I decided to go with ACPI, > > since it's supported on both x86 and some (uefi-enabled) versions > > of aarch64. I really don't see how I'd reasonably use *both* DT (on > > ARM) *and* ACPI (on x86), and after all I'm mostly concerned with > > x86, but originally wanted to maximize portability (which is where > > the register probing in earlier versions came from). > > There are defintitely going to be arm64 VMs that don't use ACPI, so we > may need DT support depending on what the intended use is. > > I'm not sure I follow what the difficulty with supporting DT in addition > to ACPI is? It looks like all you need is a compatible string and a reg > entry. Bearing in mind that I have almost no experience with arm: I started out by probing all possible port-io and mmio locations where fw_cfg registers might have been found, from a "classic" module_init method. Arm has DT, which as far as I understand will answer the following two questions: 1. Do I have fw_cfg ? 2. If yes, what address range does it use ? So that I could continue using a classic module_init, but won't need to probe for the device. PC (my primary architecture, the one I actually care about) does not have DT. If I want to share the same code, I can't probe, so if I try DT and don't find fw_cfg there (or somehow DT is no-op-ed out because I'm on a PC guest), I could somehow look it up in ACPI the same way (i.e., use ACPI as sort of a stand-in for DT). But all ACPI-enabled drivers I could find use dedicated macros (i.e. no more classic module_init() and module_exit(), but rather module_acpi_driver() with .add and .remove methods on an acpi_driver object, etc.) Not sure how I'd glue DT back into something like that. In addition, Michael's comment earlier in the thread suggests that even my current acpi version isn't sufficiently "orthodox" w.r.t. ACPI, and I should be providing the hardware access routine as an ACPI/AML routine, to avoid race conditions with the rest of ACPI, and for encapsulation. I.e. it's even rude to use the fw_cfg node's ACPI _CRS method (the part where I'd be treating it like a DT stand-in only to query fw_cfg's hardware specifics). So far, all the information I've been able to pull together points away from a dual DT + ACPI all-in-one solution for fw_cfg. If you know of an example where that's done in an acceptable way, please let me know so I can use it for inspiration... Thanks much, --Gabriel > > > A patch set generating an ACPI device node for qemu's fw_cfg is > > currently under review on the qemu-devel list: > > > > http://lists.nongnu.org/archive/html/qemu-devel/2015-09/msg06946.html > > (sorry, gmane appears down at the moment...) > > > > In consequence: > > > > - Patch 1/4 is mostly the same as in v2; > > - Patch 2/4 switches device initialization from register > > probing to using ACPI; this is a separate patch only to > > illustrate the transition from probing to ACPI, and I'm > > assuming it will end up squashed on top of patch 1/4 in > > the final version. > > > > - Patches 3/4 and 4/4 add a "human-readable" directory > > hierarchy built from tokenizing fw_cfg blob names into > > '/'-separated components, with symlinks to each 'by_key' > > blob folder (same as in earlier versions). At Greg's > > suggestion I tried to build this folder hierarchy and > > leaf symlinks using udev rules, but so far I haven't been > > successful in figuring that out. If udev turns out to > > be applicable after all, these two patches can be dropped > > from this series. > > > > In other words, patches 1 and 2 give us the following "by_key" listing > > of blobs contained in the qemu fw_cfg device
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Mon, Oct 05, 2015 at 01:50:47PM +0100, Peter Maydell wrote: > On 5 October 2015 at 13:40, Gabriel L. Somlowrote: > > In addition, Michael's comment earlier in the thread suggests that > > even my current acpi version isn't sufficiently "orthodox" w.r.t. > > ACPI, and I should be providing the hardware access routine as > > an ACPI/AML routine, to avoid race conditions with the rest of ACPI, > > and for encapsulation. I.e. it's even rude to use the fw_cfg node's > > ACPI _CRS method (the part where I'd be treating it like a DT stand-in > > only to query fw_cfg's hardware specifics). > > If you want to try to support "firmware might also be reading > fw_cfg at the same time as the kernel" this is a (painful) > problem regardless of how the kernel figures out whether a > fw_cfg device is present. I had assumed that one of the design > assumptions of this series was that firmware would only > read the fw_cfg before booting the guest kernel and never touch > it afterwards. If it might touch it later then letting the > guest kernel also mess with fw_cfg seems like a really bad idea. I don't know of any case where firmware and kernel might race each other to access fw_cfg. The issue AFAICT is whether it's safe (future-proof) to rely on parsing _CRS for the fw_cfg i/o access information, or whether such logic could be rendered obsolete by potential future updates to fw_cfg's _CRS. If I "outsource" the fw_cfg_dump_blob_by_key() functionality entirely to an ACPI method, my kernel driver won't have to worry about keeping up with said future updates. On the down-side, that means the kernel driver will be ACPI or nothing (but I'm OK with that, at my curent level of understanding :) Thanks, --Gabriel
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Mon, Oct 05, 2015 at 01:56:47PM +0100, Mark Rutland wrote: > On Mon, Oct 05, 2015 at 08:43:46AM -0400, Gabriel L. Somlo wrote: > > On Mon, Oct 05, 2015 at 01:23:33PM +0100, Mark Rutland wrote: > > > On Mon, Oct 05, 2015 at 01:48:52PM +0200, Paolo Bonzini wrote: > > > > > > > > > > > > On 05/10/2015 12:00, Mark Rutland wrote: > > > > > Some of the keys in the example look like they'd come from other > > > > > sources > > > > > (e.g. the *-tables entries), while others look like kernel/bootloader > > > > > configuration options (e.g. etc/boot-fail-wait, bootorder) -- I'm > > > > > concerned about redundancy here. > > > > > > > > The redundancy is because the firmware and the bootloader actually > > > > _consume_ these fw_cfg strings to produce the others (the ACPI tables, > > > > the kernel configuration options). > > > > > > > > On the other hand, hiding some strings just because they ought to have > > > > been consumed already makes little sense. > > > > > > Sure. However, I'm concerned that providing redundant interfaces for > > > those could lead to people grabbing information from here (because it's > > > convenient) rather than the existing canonical locations, which means we > > > get more software that works on fewer systems for no good reason. > > > > > > What I couldn't figure out was what _additional_ information this > > > provided; it looked like a mixed bag of details we could already get > > > from disparate sources. If that's all it does, then it seems to me like > > > it doesn't add any benefit and potentially makes things worse. > > > > > > So what do we get from this interface that we cannot get elsewhere, and > > > why is this the best way of exposing it? > > > > Starting with qemu 2.4, it is possible to insert arbitrary named > > blobs into fw_cfg from the qemu command line. *Those* entries > > might be interesting to userspace, which is why it might be handy > > to access to fw_cfg blobs in general. > > So this is a mechanism to pass arbitrary key:value pairs to a guest > userspace? What would those be used for, and why would this be the > correct location for that? Yes to arbitrary host->guest arbitrary key:value pairs. fw_cfg because it's asynchronous (host supplies the data at guest start time, and no longer has to worry about whether and when guests may or may not start some sort of agent in order to be able to accept connections, etc); also because it's guest-os agnostic (no piggy-backing on e.g. kernel command line). Drivers to make data available to guest userspace can be written for any guest OS. > How do we avoid clashes between user-selected names and those we need to > pass actual FW data? Internally supplied blobs (by QEMU) meant for the firmware are, by convention, prefixed with "/etc/...". Command-line blobs are expected to use "opt/...". QEMU issues a warning if a name is used on the command line that doesn't begin with 'opt/'. Thanks, --Gabriel
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
> > I'm not sure I follow what the difficulty with supporting DT in addition > > to ACPI is? It looks like all you need is a compatible string and a reg > > entry. > > Bearing in mind that I have almost no experience with arm: > > I started out by probing all possible port-io and mmio locations where > fw_cfg registers might have been found, from a "classic" module_init > method. > > Arm has DT, which as far as I understand will answer the following two > questions: 1. Do I have fw_cfg ? 2. If yes, what address range does it use ? > So that I could continue using a classic module_init, but won't need > to probe for the device. > > PC (my primary architecture, the one I actually care about) does not > have DT. If I want to share the same code, I can't probe, so if I try > DT and don't find fw_cfg there (or somehow DT is no-op-ed out because > I'm on a PC guest), I could somehow look it up in ACPI the same way > (i.e., use ACPI as sort of a stand-in for DT). I'd imagine that it's simple to have something in your probe path like: if (pdev->dev.of_node) parse_dt(pdev); else parse_acpi(pdev); > But all ACPI-enabled drivers I could find use dedicated macros (i.e. > no more classic module_init() and module_exit(), but rather > module_acpi_driver() with .add and .remove methods on an acpi_driver > object, etc.) Not sure how I'd glue DT back into something like that. You don't have to use those macros, and can simply use the classic module_{init,exit} functions, calling the requisite acpi driver registration functions at module {init,exit} time. > In addition, Michael's comment earlier in the thread suggests that > even my current acpi version isn't sufficiently "orthodox" w.r.t. > ACPI, and I should be providing the hardware access routine as > an ACPI/AML routine, to avoid race conditions with the rest of ACPI, > and for encapsulation. I.e. it's even rude to use the fw_cfg node's > ACPI _CRS method (the part where I'd be treating it like a DT stand-in > only to query fw_cfg's hardware specifics). As Peter stated, this sounds very much like it rules out sharing the interface with FW generally (and is certainly scary). > So far, all the information I've been able to pull together points > away from a dual DT + ACPI all-in-one solution for fw_cfg. If you know > of an example where that's done in an acceptable way, please let > me know so I can use it for inspiration... I'm not immediately aware, but I would imagine you could search for files that had both an of_match_table and a acpi_bus_register_driver call. Thanks, Mark.
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Mon, Oct 05, 2015 at 01:48:52PM +0200, Paolo Bonzini wrote: > > > On 05/10/2015 12:00, Mark Rutland wrote: > > Some of the keys in the example look like they'd come from other sources > > (e.g. the *-tables entries), while others look like kernel/bootloader > > configuration options (e.g. etc/boot-fail-wait, bootorder) -- I'm > > concerned about redundancy here. > > The redundancy is because the firmware and the bootloader actually > _consume_ these fw_cfg strings to produce the others (the ACPI tables, > the kernel configuration options). > > On the other hand, hiding some strings just because they ought to have > been consumed already makes little sense. Sure. However, I'm concerned that providing redundant interfaces for those could lead to people grabbing information from here (because it's convenient) rather than the existing canonical locations, which means we get more software that works on fewer systems for no good reason. What I couldn't figure out was what _additional_ information this provided; it looked like a mixed bag of details we could already get from disparate sources. If that's all it does, then it seems to me like it doesn't add any benefit and potentially makes things worse. So what do we get from this interface that we cannot get elsewhere, and why is this the best way of exposing it? Mark.
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Sat, Oct 03, 2015 at 07:28:05PM -0400, Gabriel L. Somlo wrote: > From: "Gabriel Somlo"> > Allow access to QEMU firmware blobs, passed into the guest VM via > the fw_cfg device, through SysFS entries. Blob meta-data (e.g. name, > size, and fw_cfg key), as well as the raw binary blob data may be > accessed. > > The SysFS access location is /sys/firmware/qemu_fw_cfg/... and was > selected based on overall similarity to the type of information > exposed under /sys/firmware/dmi/entries/... What is the intended use of these? Some of the keys in the example look like they'd come from other sources (e.g. the *-tables entries), while others look like kernel/bootloader configuration options (e.g. etc/boot-fail-wait, bootorder) -- I'm concerned about redundancy here. > NEW (since v2): Using ACPI to detect the presence and details of the > fw_cfg virtual hardware device. > > Device Tree has been suggested by Ard as a comment on v2 of this > patch, but after some deliberation I decided to go with ACPI, > since it's supported on both x86 and some (uefi-enabled) versions > of aarch64. I really don't see how I'd reasonably use *both* DT (on > ARM) *and* ACPI (on x86), and after all I'm mostly concerned with > x86, but originally wanted to maximize portability (which is where > the register probing in earlier versions came from). There are defintitely going to be arm64 VMs that don't use ACPI, so we may need DT support depending on what the intended use is. I'm not sure I follow what the difficulty with supporting DT in addition to ACPI is? It looks like all you need is a compatible string and a reg entry. Thanks, Mark. > A patch set generating an ACPI device node for qemu's fw_cfg is > currently under review on the qemu-devel list: > > http://lists.nongnu.org/archive/html/qemu-devel/2015-09/msg06946.html > (sorry, gmane appears down at the moment...) > > In consequence: > > - Patch 1/4 is mostly the same as in v2; > - Patch 2/4 switches device initialization from register > probing to using ACPI; this is a separate patch only to > illustrate the transition from probing to ACPI, and I'm > assuming it will end up squashed on top of patch 1/4 in > the final version. > > - Patches 3/4 and 4/4 add a "human-readable" directory > hierarchy built from tokenizing fw_cfg blob names into > '/'-separated components, with symlinks to each 'by_key' > blob folder (same as in earlier versions). At Greg's > suggestion I tried to build this folder hierarchy and > leaf symlinks using udev rules, but so far I haven't been > successful in figuring that out. If udev turns out to > be applicable after all, these two patches can be dropped > from this series. > > In other words, patches 1 and 2 give us the following "by_key" listing > of blobs contained in the qemu fw_cfg device (example pulled from a PC > qemu guest running Fedora 22), with the value of each "name" attribute > shown on the right: > > $ tree /sys/firmware/qemu_fw_cfg/ > /sys/firmware/qemu_fw_cfg/ > |-- by_key > | |-- 32 > | | |-- key > | | |-- name ("etc/boot-fail-wait") > | | |-- raw > | | `-- size > | |-- 33 > | | |-- key > | | |-- name ("etc/smbios/smbios-tables") > | | |-- raw > | | `-- size > | |-- 34 > | | |-- key > | | |-- name ("etc/smbios/smbios-anchor") > | | |-- raw > | | `-- size > | |-- 35 > | | |-- key > | | |-- name ("etc/e820") > | | |-- raw > | | `-- size > | |-- 36 > | | |-- key > | | |-- name ("genroms/kvmvapic.bin") > | | |-- raw > | | `-- size > | |-- 37 > | | |-- key > | | |-- name ("etc/system-states") > | | |-- raw > | | `-- size > | |-- 38 > | | |-- key > | | |-- name ("etc/acpi/tables") > | | |-- raw > | | `-- size > | |-- 39 > | | |-- key > | | |-- name ("etc/table-loader") > | | |-- raw > | | `-- size > | |-- 40 > | | |-- key > | | |-- name ("etc/tpm/log") > | | |-- raw > | | `-- size > | |-- 41 > | | |-- key > | | |-- name ("etc/acpi/rsdp") > | | |-- raw > | | `-- size > | `-- 42 > | |-- key > | |-- name ("bootorder") > | |-- raw > | `-- size > | > ... > > Additionally, patches 3 and 4 (mostly 4) give us the following > "user friendly" directory hierarchy as a complement to the above, > based on tokenizing each blob name into symlink-tipped (sub)directories: > > ... > |-- by_name > | |-- bootorder -> ../by_key/42 > | |-- etc > | | |-- acpi > | | | |-- rsdp -> ../../../by_key/41 > | | | `-- tables ->
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Mon, Oct 05, 2015 at 01:23:33PM +0100, Mark Rutland wrote: > On Mon, Oct 05, 2015 at 01:48:52PM +0200, Paolo Bonzini wrote: > > > > > > On 05/10/2015 12:00, Mark Rutland wrote: > > > Some of the keys in the example look like they'd come from other sources > > > (e.g. the *-tables entries), while others look like kernel/bootloader > > > configuration options (e.g. etc/boot-fail-wait, bootorder) -- I'm > > > concerned about redundancy here. > > > > The redundancy is because the firmware and the bootloader actually > > _consume_ these fw_cfg strings to produce the others (the ACPI tables, > > the kernel configuration options). > > > > On the other hand, hiding some strings just because they ought to have > > been consumed already makes little sense. > > Sure. However, I'm concerned that providing redundant interfaces for > those could lead to people grabbing information from here (because it's > convenient) rather than the existing canonical locations, which means we > get more software that works on fewer systems for no good reason. > > What I couldn't figure out was what _additional_ information this > provided; it looked like a mixed bag of details we could already get > from disparate sources. If that's all it does, then it seems to me like > it doesn't add any benefit and potentially makes things worse. > > So what do we get from this interface that we cannot get elsewhere, and > why is this the best way of exposing it? Starting with qemu 2.4, it is possible to insert arbitrary named blobs into fw_cfg from the qemu command line. *Those* entries might be interesting to userspace, which is why it might be handy to access to fw_cfg blobs in general. Thanks, --Gabriel
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On 05/10/2015 12:00, Mark Rutland wrote: > Some of the keys in the example look like they'd come from other sources > (e.g. the *-tables entries), while others look like kernel/bootloader > configuration options (e.g. etc/boot-fail-wait, bootorder) -- I'm > concerned about redundancy here. The redundancy is because the firmware and the bootloader actually _consume_ these fw_cfg strings to produce the others (the ACPI tables, the kernel configuration options). On the other hand, hiding some strings just because they ought to have been consumed already makes little sense. Paolo
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On 05/10/2015 14:50, Peter Maydell wrote: > If you want to try to support "firmware might also be reading > fw_cfg at the same time as the kernel" this is a (painful) > problem regardless of how the kernel figures out whether a > fw_cfg device is present. I had assumed that one of the design > assumptions of this series was that firmware would only > read the fw_cfg before booting the guest kernel and never touch > it afterwards. If it might touch it later then letting the > guest kernel also mess with fw_cfg seems like a really bad idea. The idea of tinkering with fw_cfg from the AML code (DSDT/SSDT) has been proposed many times, and always dropped. One of the reasons was that the OS could have a driver for fw_cfg. So I think that we can define the QEMU0002 id as owned by the OSPM, similar to the various standard ACPI ids that are usually found in the x86 world (e.g. PNP0B00 is a mc146818 RTC, PNP0303 is an 8042 keyboard controller, PNP0501 is a 16550 or similar UART, and so on). This basically sanctions _CRS as the way to pass information from the firmware to the OSPM, also similarly to those standard PNP ids. Paolo
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On Mon, Oct 05, 2015 at 08:43:46AM -0400, Gabriel L. Somlo wrote: > On Mon, Oct 05, 2015 at 01:23:33PM +0100, Mark Rutland wrote: > > On Mon, Oct 05, 2015 at 01:48:52PM +0200, Paolo Bonzini wrote: > > > > > > > > > On 05/10/2015 12:00, Mark Rutland wrote: > > > > Some of the keys in the example look like they'd come from other sources > > > > (e.g. the *-tables entries), while others look like kernel/bootloader > > > > configuration options (e.g. etc/boot-fail-wait, bootorder) -- I'm > > > > concerned about redundancy here. > > > > > > The redundancy is because the firmware and the bootloader actually > > > _consume_ these fw_cfg strings to produce the others (the ACPI tables, > > > the kernel configuration options). > > > > > > On the other hand, hiding some strings just because they ought to have > > > been consumed already makes little sense. > > > > Sure. However, I'm concerned that providing redundant interfaces for > > those could lead to people grabbing information from here (because it's > > convenient) rather than the existing canonical locations, which means we > > get more software that works on fewer systems for no good reason. > > > > What I couldn't figure out was what _additional_ information this > > provided; it looked like a mixed bag of details we could already get > > from disparate sources. If that's all it does, then it seems to me like > > it doesn't add any benefit and potentially makes things worse. > > > > So what do we get from this interface that we cannot get elsewhere, and > > why is this the best way of exposing it? > > Starting with qemu 2.4, it is possible to insert arbitrary named > blobs into fw_cfg from the qemu command line. *Those* entries > might be interesting to userspace, which is why it might be handy > to access to fw_cfg blobs in general. So this is a mechanism to pass arbitrary key:value pairs to a guest userspace? What would those be used for, and why would this be the correct location for that? How do we avoid clashes between user-selected names and those we need to pass actual FW data? Mark.
Re: [Qemu-devel] [PATCH v3 0/4] SysFS driver for QEMU fw_cfg device
On 5 October 2015 at 13:40, Gabriel L. Somlowrote: > In addition, Michael's comment earlier in the thread suggests that > even my current acpi version isn't sufficiently "orthodox" w.r.t. > ACPI, and I should be providing the hardware access routine as > an ACPI/AML routine, to avoid race conditions with the rest of ACPI, > and for encapsulation. I.e. it's even rude to use the fw_cfg node's > ACPI _CRS method (the part where I'd be treating it like a DT stand-in > only to query fw_cfg's hardware specifics). If you want to try to support "firmware might also be reading fw_cfg at the same time as the kernel" this is a (painful) problem regardless of how the kernel figures out whether a fw_cfg device is present. I had assumed that one of the design assumptions of this series was that firmware would only read the fw_cfg before booting the guest kernel and never touch it afterwards. If it might touch it later then letting the guest kernel also mess with fw_cfg seems like a really bad idea. thanks -- PMM