| 
    
 [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  |