Linux ATA/IDE development
 help / color / mirror / Atom feed
From: Damien Le Moal <dlemoal@kernel.org>
To: sashiko-reviews@lists.linux.dev, Rosen Penev <rosenp@gmail.com>
Cc: linux-ide@vger.kernel.org, cassel@kernel.org
Subject: Re: [PATCHv2] ata: pata_ep93xx: add missing "cc" clobber to inline asm
Date: Thu, 23 Jul 2026 16:43:16 +0900	[thread overview]
Message-ID: <7b5fd9c6-28b3-43d0-9d4b-14203d7c57d9@kernel.org> (raw)
In-Reply-To: <20260721001238.8CD4B1F000E9@smtp.kernel.org>

On 7/21/26 09:12, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
> 
> Pre-existing issues:
> - [Critical] Trailing byte transfers in `ep93xx_pata_data_xfer()` silently corrupt data on big-endian systems due to incorrect endian swapping and variable truncation. For READ, the code assigns the 16-bit swapped result of `cpu_to_le16(ep93xx_pata_read_data(...))` to `*pad`, which is an 8-bit `unsigned char`. This truncates the 16-bit value. On big-endian systems, `cpu_to_le16()` swaps the bytes, so this truncation discards the lower byte (the correct data from the bus) and saves the upper byte to the buffer. For WRITE, `le16_to_cpu(*pad)` promotes the 8-bit byte to an integer before swapping it, resulting in a shifted 16-bit value, which causes the device to receive corrupted data on the wrong data lines.
> - [High] The inline assembly delay loop `ep93xx_pata_delay()` lacks a `"memory"` clobber, permitting the compiler to reorder it with respect to I/O accesses, which violates ATA PIO timing requirements. On older ARM architectures like ARMv4T (used in EP93xx) where `CONFIG_ARM_DMA_MEM_BUFFERABLE` is not selected, the standard I/O macros (`__iormb()` and `__iowmb()`) evaluate to empty, meaning `writel()` and `readl()` provide no compiler memory barriers at all. Because `__raw_readl()` and `__raw_writel()` are implemented using `asm volatile` without `"memory"` clobbers, GCC's instruction scheduler is completely free to reorder these volatile I/O accesses across the `ep93xx_pata_delay()` loop. Even if memory barriers were present after the read or before the write, the `asm volatile` instructions themselves lack dependencies and can be swapped.
> --
> 
> --- Patch [1]: [PATCHv2] ata: pata_ep93xx: add missing "cc" clobber to inline asm ---
> commit e8afdf774c87485ee82a0fe97b982fc47fc827bc
> Author: Rosen Penev <rosenp@gmail.com>
> 
> ata: pata_ep93xx: add missing "cc" clobber to inline asm
> 
> This commit adds a missing cc clobber to the inline assembly in
> ep93xx_pata_delay() to prevent the compiler from reordering flag-dependent
> instructions.
> 
>> diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c
>> index 42a24dc51d26b..0bb748a86ac6e 100644
>> --- a/drivers/ata/pata_ep93xx.c
>> +++ b/drivers/ata/pata_ep93xx.c
>> @@ -211,6 +211,7 @@ static void ep93xx_pata_delay(unsigned long count)
>>  		"bge 0b\n"
>>  		: "=r" (count)
>>  		: "0" (count)
>> +		: "cc"
> 
> [Severity: High]
> This isn't a bug introduced by this patch, but since you are updating the
> clobbers in ep93xx_pata_delay(), should this inline assembly also include a
> "memory" clobber?

Rosen,

Can you look into this please and fix it in this same patch ?
The other critical problem can be fixed in a different patch.


> 
> On older ARM architectures like ARMv4T used in EP93xx, standard I/O macros
> can evaluate to empty, providing no compiler memory barriers. 
> 
> Without a memory clobber here, the compiler optimizer might be free to
> reorder independent I/O accesses across this delay loop, which could violate
> ATA PIO timing requirements.
> 
>>  	);
>>  #else
>>  	while (count--)
> 
> [ ... ]
> 
> [Severity: Critical]
> This is a pre-existing issue in the same file, but could the trailing byte
> transfers in ep93xx_pata_data_xfer() silently corrupt data on big-endian
> systems due to truncation?
> 
> For READ transfers, the code assigns a swapped value to an 8-bit variable:
> 
> drivers/ata/pata_ep93xx.c:ep93xx_pata_data_xfer() {
>     ...
>     *pad = cpu_to_le16(ep93xx_pata_read_data(drv_data, IDECTRL_ADDR_DATA));
>     ...
> }
> 
> Since pad is an unsigned char pointer, this truncates the 16-bit swapped
> result. On big-endian systems, cpu_to_le16() swaps the bytes, so truncating
> it to 8 bits discards the lower byte containing the correct data and saves
> the upper byte instead.
> 
> Similarly for WRITE transfers:
> 
> drivers/ata/pata_ep93xx.c:ep93xx_pata_data_xfer() {
>     ...
>     ep93xx_pata_write_data(drv_data, le16_to_cpu(*pad), IDECTRL_ADDR_DATA);
>     ...
> }
> 
> Promoting the 8-bit pad value to an integer before swapping it on a
> big-endian system seems to shift the byte to the wrong data lines, sending
> corrupted data to the device.
> 


-- 
Damien Le Moal
Western Digital Research

      reply	other threads:[~2026-07-23  7:43 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-20 23:59 [PATCHv2] ata: pata_ep93xx: add missing "cc" clobber to inline asm Rosen Penev
2026-07-21  0:12 ` sashiko-bot
2026-07-23  7:43   ` Damien Le Moal [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7b5fd9c6-28b3-43d0-9d4b-14203d7c57d9@kernel.org \
    --to=dlemoal@kernel.org \
    --cc=cassel@kernel.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=rosenp@gmail.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox