All of lore.kernel.org
 help / color / mirror / Atom feed
From: anton.vorontsov@linaro.org (Anton Vorontsov)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 10/10] ARM: FIQ: Get rid of init_FIQ()
Date: Thu, 22 Nov 2012 22:50:02 -0800	[thread overview]
Message-ID: <20121123065002.GB27827@lizard> (raw)
In-Reply-To: <1353652071.755665772@f76.mail.ru>

On Fri, Nov 23, 2012 at 10:27:51AM +0400, Alexander Shiyan wrote:
> > On Fri, Nov 23, 2012 at 07:40:30AM +0400, Alexander Shiyan wrote:
> > [...]
> > > >  static unsigned long no_fiq_insn;
> > > > +static int got_no_fiq_insn;
> > > > @@ -78,11 +79,14 @@ void show_fiq_list(struct seq_file *p, int prec)
> > > >  
> > > >  void set_fiq_handler(void *start, unsigned int length)
> > > >  {
> > > > -#if defined(CONFIG_CPU_USE_DOMAINS)
> > > > -	memcpy((void *)0xffff001c, start, length);
> > > > -#else
> > > > -	memcpy(vectors_page + 0x1c, start, length);
> > > > +	unsigned long *addr = (void *)0xffff001c;
> > > > +
> > > > +#ifndef CONFIG_CPU_USE_DOMAINS
> > > > +	addr = vectors_page + 0x1c;
> > > >  #endif
> > > > +	if (!cmpxchg(&got_no_fiq_insn, 0, 1))
> > > > +		no_fiq_insn = *addr;
> > > > +	memcpy(addr, start, length);
> > > >  	flush_icache_range(0xffff001c, 0xffff001c + length);
> > > >  	if (!vectors_high())
> > > >  		flush_icache_range(0x1c, 0x1c + length);
> > > > @@ -126,8 +130,3 @@ EXPORT_SYMBOL(__set_fiq_regs);	/* defined in fiqasm.S */
> > > > -
> > > > -void __init init_FIQ(void)
> > > > -{
> > > > -	no_fiq_insn = *(unsigned long *)0xffff001c;
> > > 
> > > it seems that this is wrong. In this case we have an uninitialized variable and
> > > sequential call claim_fiq and release_fiq could be fatal. FIXME please.
> > 
> > Um... I don't think I understand, can you please elaborate?
> 
> OK, I'll try to explain it.
> At the end of the release_fiq function we have a call fiq_op. For the default
> handler - is a fiq_def_op function, and we call this function with the option
> "relinquish = 0", i.e. we want to restore old fiq_handler. But if we do not call
> set_fiq_handler never before, we will have an uninitialized no_fiq_insn variable.

It should not matter when or in what order anyone calls the
set_fiq_handler(), since it stores "no FIQ instruction" into no_fiq_insn
at its first invocation:

	if (!cmpxchg(&got_no_fiq_insn, 0, 1))
		no_fiq_insn = *addr;

If we never called set_fiq_handler() before, during release_fiq() we'll:

1. Copy the initial instruction from the vector page to 'no_fiq_insn';
2. Copy the initial instruction from 'no_fiq_insn' to the vector page;

So no_fiq_insn gets initialized, then we just instantly write the same
value back.

Thanks,
Anton.

WARNING: multiple messages have this Message-ID (diff)
From: Anton Vorontsov <anton.vorontsov@linaro.org>
To: Alexander Shiyan <shc_work@mail.ru>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	linaro-kernel@lists.linaro.org,
	Russell King <linux@arm.linux.org.uk>,
	patches@linaro.org, linux-kernel@vger.kernel.org,
	John Stultz <john.stultz@linaro.org>,
	Jason Wessel <jason.wessel@windriver.com>,
	kernel-team@android.com, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 10/10] ARM: FIQ: Get rid of init_FIQ()
Date: Thu, 22 Nov 2012 22:50:02 -0800	[thread overview]
Message-ID: <20121123065002.GB27827@lizard> (raw)
In-Reply-To: <1353652071.755665772@f76.mail.ru>

On Fri, Nov 23, 2012 at 10:27:51AM +0400, Alexander Shiyan wrote:
> > On Fri, Nov 23, 2012 at 07:40:30AM +0400, Alexander Shiyan wrote:
> > [...]
> > > >  static unsigned long no_fiq_insn;
> > > > +static int got_no_fiq_insn;
> > > > @@ -78,11 +79,14 @@ void show_fiq_list(struct seq_file *p, int prec)
> > > >  
> > > >  void set_fiq_handler(void *start, unsigned int length)
> > > >  {
> > > > -#if defined(CONFIG_CPU_USE_DOMAINS)
> > > > -	memcpy((void *)0xffff001c, start, length);
> > > > -#else
> > > > -	memcpy(vectors_page + 0x1c, start, length);
> > > > +	unsigned long *addr = (void *)0xffff001c;
> > > > +
> > > > +#ifndef CONFIG_CPU_USE_DOMAINS
> > > > +	addr = vectors_page + 0x1c;
> > > >  #endif
> > > > +	if (!cmpxchg(&got_no_fiq_insn, 0, 1))
> > > > +		no_fiq_insn = *addr;
> > > > +	memcpy(addr, start, length);
> > > >  	flush_icache_range(0xffff001c, 0xffff001c + length);
> > > >  	if (!vectors_high())
> > > >  		flush_icache_range(0x1c, 0x1c + length);
> > > > @@ -126,8 +130,3 @@ EXPORT_SYMBOL(__set_fiq_regs);	/* defined in fiqasm.S */
> > > > -
> > > > -void __init init_FIQ(void)
> > > > -{
> > > > -	no_fiq_insn = *(unsigned long *)0xffff001c;
> > > 
> > > it seems that this is wrong. In this case we have an uninitialized variable and
> > > sequential call claim_fiq and release_fiq could be fatal. FIXME please.
> > 
> > Um... I don't think I understand, can you please elaborate?
> 
> OK, I'll try to explain it.
> At the end of the release_fiq function we have a call fiq_op. For the default
> handler - is a fiq_def_op function, and we call this function with the option
> "relinquish = 0", i.e. we want to restore old fiq_handler. But if we do not call
> set_fiq_handler never before, we will have an uninitialized no_fiq_insn variable.

It should not matter when or in what order anyone calls the
set_fiq_handler(), since it stores "no FIQ instruction" into no_fiq_insn
at its first invocation:

	if (!cmpxchg(&got_no_fiq_insn, 0, 1))
		no_fiq_insn = *addr;

If we never called set_fiq_handler() before, during release_fiq() we'll:

1. Copy the initial instruction from the vector page to 'no_fiq_insn';
2. Copy the initial instruction from 'no_fiq_insn' to the vector page;

So no_fiq_insn gets initialized, then we just instantly write the same
value back.

Thanks,
Anton.

  reply	other threads:[~2012-11-23  6:50 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-23  0:38 [PATCH resend 0/10] Get rid of FIQ_START/enable/disable_fiq() + some FIQ cleanups Anton Vorontsov
2012-11-23  0:38 ` Anton Vorontsov
2012-11-23  0:49 ` [PATCH 01/10] ARM: mach-rpc: Don't register FIQs with genirq Anton Vorontsov
2012-11-23  0:49   ` Anton Vorontsov
2012-11-23  0:49 ` [PATCH 02/10] ARM: plat-s3c24xx: Don't use FIQ_START Anton Vorontsov
2012-11-23  0:49   ` Anton Vorontsov
2012-11-23  0:49 ` [PATCH 03/10] [media] mx1_camera: Don't use {en,dis}able_fiq() calls Anton Vorontsov
2012-11-23  0:49   ` Anton Vorontsov
2012-11-23  0:49 ` [PATCH 04/10] ASoC: imx: " Anton Vorontsov
2012-11-23  0:49   ` Anton Vorontsov
2012-11-23  0:49 ` [PATCH 05/10] ARM: FIQ: Remove enable_fiq() and disable_fiq() calls Anton Vorontsov
2012-11-23  0:49   ` Anton Vorontsov
2012-11-23  0:49 ` [PATCH 06/10] ARM: FIQ: Remove FIQ_START Anton Vorontsov
2012-11-23  0:49   ` Anton Vorontsov
2012-11-23  0:50 ` [PATCH 07/10] ARM: FIQ: Should include asm/mach/irq.h Anton Vorontsov
2012-11-23  0:50   ` Anton Vorontsov
2012-11-23  0:50 ` [PATCH 08/10] ARM: FIQ: Implement !CONFIG_FIQ stubs Anton Vorontsov
2012-11-23  0:50   ` Anton Vorontsov
2012-11-23  0:50 ` [PATCH 09/10] ARM: FIQ: Make show_fiq_list() return void Anton Vorontsov
2012-11-23  0:50   ` Anton Vorontsov
2012-11-23  0:50 ` [PATCH 10/10] ARM: FIQ: Get rid of init_FIQ() Anton Vorontsov
2012-11-23  0:50   ` Anton Vorontsov
2012-11-23  3:40   ` Alexander Shiyan
2012-11-23  3:40     ` Alexander Shiyan
2012-11-23  5:53     ` Anton Vorontsov
2012-11-23  5:53       ` Anton Vorontsov
2012-11-23  6:27       ` Re[2]: " Alexander Shiyan
2012-11-23  6:27         ` Alexander Shiyan
2012-11-23  6:50         ` Anton Vorontsov [this message]
2012-11-23  6:50           ` Anton Vorontsov
2012-11-23  7:36           ` Re[2]: " Alexander Shiyan
2012-11-23  7:36             ` Alexander Shiyan
2012-11-23  7:51             ` Anton Vorontsov
2012-11-23  7:51               ` Anton Vorontsov
2012-11-27  9:05               ` Anton Vorontsov
2012-11-27  9:05                 ` Anton Vorontsov
  -- strict thread matches above, loose matches on Subject: below --
2012-10-15 21:49 [PATCH resend 0/10] Get rid of FIQ_START/enable/disable_fiq() + some FIQ cleanups Anton Vorontsov
2012-10-15 21:51 ` [PATCH 10/10] ARM: FIQ: Get rid of init_FIQ() Anton Vorontsov
2012-10-15 21:51   ` Anton Vorontsov

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=20121123065002.GB27827@lizard \
    --to=anton.vorontsov@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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.