All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/5] mips: cache: Bulletproof the code against cornercases
Date: Wed, 27 Jan 2016 15:56:36 +0100	[thread overview]
Message-ID: <56A8DAA4.20802@gmail.com> (raw)
In-Reply-To: <1453860843-5835-1-git-send-email-marex@denx.de>



Am 27.01.2016 um 03:13 schrieb Marek Vasut:
> This patch makes sure that the flush/invalidate_dcache_range() functions
> can handle corner-case calls like this -- invalidate_dcache_range(0, 0, 0);
> This call is valid and is happily produced by USB EHCI code for example.
> The expected behavior of the cache function(s) in this case is that they
> will do no operation, since the size is zero.
> 
> The current implementation though has a problem where such invocation will
> result in a hard CPU hang. This is because under such conditions, where the
> start_addr = 0 and stop = 0, the addr = 0 and aend = 0xffffffe0 . The loop
> will then try to iterate over the entire address space, which in itself is
> wrong. But iterating over the entire address space might also hit some odd
> address which will cause bus hang. The later happens on the Atheros MIPS.
> 
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> Cc: Hans de Goede <hdegoede@redhat.com>
> ---
>  arch/mips/lib/cache.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/arch/mips/lib/cache.c b/arch/mips/lib/cache.c
> index bf8ff59..7482005 100644
> --- a/arch/mips/lib/cache.c
> +++ b/arch/mips/lib/cache.c
> @@ -95,6 +95,10 @@ void flush_dcache_range(ulong start_addr, ulong stop)
>  	const void *addr = (const void *)(start_addr & ~(lsize - 1));
>  	const void *aend = (const void *)((stop - 1) & ~(lsize - 1));
>  
> +	/* aend will be miscalculated when size is zero, so we return here */
> +	if (start_addr == stop)
> +		return;
> +

you could additionally move the initialization of addr and aend behind
this check like it's done in flush_cache()? That would save some CPU cycles.

>  	while (1) {
>  		mips_cache(HIT_WRITEBACK_INV_D, addr);
>  		if (addr == aend)
> @@ -109,6 +113,10 @@ void invalidate_dcache_range(ulong start_addr, ulong stop)
>  	const void *addr = (const void *)(start_addr & ~(lsize - 1));
>  	const void *aend = (const void *)((stop - 1) & ~(lsize - 1));
>  
> +	/* aend will be miscalculated when size is zero, so we return here */
> +	if (start_addr == stop)
> +		return;
> +
>  	while (1) {
>  		mips_cache(HIT_INVALIDATE_D, addr);
>  		if (addr == aend)
> 

  parent reply	other threads:[~2016-01-27 14:56 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-27  2:13 [U-Boot] [PATCH 1/5] mips: cache: Bulletproof the code against cornercases Marek Vasut
2016-01-27  2:14 ` [U-Boot] [PATCH 2/5] usb: ehci: Use map_physmem in ehci-generic Marek Vasut
2016-01-27 14:21   ` Alexey Brodkin
2016-01-27 16:14     ` Marek Vasut
2016-01-27  2:14 ` [U-Boot] [PATCH 3/5] usb: ehci: Implement V2P mapping Marek Vasut
2016-02-26 16:48   ` Stephen Warren
2016-02-26 16:55     ` Marek Vasut
2016-02-26 18:16       ` Stephen Warren
2016-02-26 18:44         ` Marek Vasut
2016-02-26 19:12           ` Stephen Warren
2016-02-26 19:16             ` Marek Vasut
2016-01-27  2:14 ` [U-Boot] [PATCH 4/5] usb: ehci: Clear USBMODE_BE on LE MMIO Marek Vasut
2016-01-27  2:14 ` [U-Boot] [PATCH 5/5] usb: ehci: Be explicit about the BE IO accessors Marek Vasut
2016-01-27 14:56 ` Daniel Schwierzeck [this message]
2016-01-27 16:15   ` [U-Boot] [PATCH 1/5] mips: cache: Bulletproof the code against cornercases Marek Vasut
2016-02-01 21:29 ` Daniel Schwierzeck
2016-02-01 21:31   ` Marek Vasut
2016-02-01 21:40     ` Daniel Schwierzeck
2016-02-01 21:45       ` Marek Vasut

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=56A8DAA4.20802@gmail.com \
    --to=daniel.schwierzeck@gmail.com \
    --cc=u-boot@lists.denx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.