|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: Problems in PV dom0 on recent x86 hardware
On 09.07.2024 08:36, Jürgen Groß wrote:
> On 09.07.24 08:24, Jan Beulich wrote:
>> On 08.07.2024 23:30, Jason Andryuk wrote:
>>> From the backtrace, it looks like the immediate case is just trying to
>>> read a 4-byte version:
>>>
>>> >>>> [ 44.575541] ucsi_acpi_dsm+0x53/0x80
>>> >>>> [ 44.575546] ucsi_acpi_read+0x2e/0x60
>>> >>>> [ 44.575550] ucsi_register+0x24/0xa0
>>> >>>> [ 44.575555] ucsi_acpi_probe+0x162/0x1e3
>>>
>>> int ucsi_register(struct ucsi *ucsi)
>>> {
>>> int ret;
>>>
>>> ret = ucsi->ops->read(ucsi, UCSI_VERSION, &ucsi->version,
>>> sizeof(ucsi->version));
>>>
>>> ->read being ucsi_acpi_read()
>>>
>>> However, the driver also appears write to adjacent addresses.
>>
>> There are also corresponding write functions in the driver, yes, but
>> ucsi_acpi_async_write() (used directly or indirectly) similarly calls
>> ucsi_acpi_dsm(), which wires through to acpi_evaluate_dsm(). That's
>> ACPI object evaluation, which isn't obvious without seeing the
>> involved AML whether it might write said memory region.
>
> I guess an ACPI dump would help here?
Perhaps, yes.
>> The writing
>> done in the write function(s) looks to be
>>
>> memcpy(ua->base + offset, val, val_len);
>>
>> with their read counterpart being
>>
>> memcpy(val, ua->base + offset, val_len);
>>
>> where ua->base may well be an entirely different address (looks like
>> it's the first of the BARs as per ucsi_acpi_probe()).
>
> According to the lspci -v output there are no BARs in the MSI space:
>
> 66:00.6 USB controller: Advanced Micro Devices, Inc. [AMD] Pink Sardine
> USB4/Thunderbolt NHI controller #2 (prog-if 40 [USB4 Host Interface])
> Subsystem: Lenovo Device 50d9
> Flags: bus master, fast devsel, latency 0, IRQ 71
> Memory at 78a00000 (64-bit, non-prefetchable) [size=512K]
> Capabilities: [48] Vendor Specific Information: Len=08 <?>
> Capabilities: [50] Power Management version 3
> Capabilities: [64] Express Endpoint, MSI 00
> Capabilities: [a0] MSI: Enable- Count=1/16 Maskable- 64bit+
> Capabilities: [c0] MSI-X: Enable+ Count=16 Masked-
> Capabilities: [100] Vendor Specific Information: ID=0001 Rev=1 Len=010
> <?>
> Capabilities: [2a0] Access Control Services
> Kernel driver in use: thunderbolt
> Kernel modules: thunderbolt
Right, this matches what I was vaguely guessing from reading the code in
the driver. My present understanding is that the object evaluation
actually triggers the read/write operation to produce/consume data inside
that single BAR's space.
>> If acpi_evaluate_dsm() would only ever read the region, an option (if
>> all else fails) might be to similarly (to what we do for IO-APICs)
>> permit read accesses / mappings (by inserting the range into
>> mmio_ro_ranges). Yet of course first we need to better understand
>> what's actually going on here.
>
> As the mapping is currently trying to allow write access, too, the kernel
> would need some modification as well.
Not really, no. It would be better if the kernel didn't ask for write
access, but get_page_from_l1e() simply tells its caller to remove the
W bit from the PTE in case a page is recorded in mmio_ro_ranges. That's
also why for the IO-APIC case we got away without needing to alter the
kernel (which would likely be pretty ugly, as acpi_os_map_iomem() sits
very far away from the place where we would have a way to know that a
mapping is sufficient to be r/o; the function itself takes only
address and size right now, no permissions or cachability or anything).
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |