[Debootloaders-silo] Bug#685245: [PATCH] silo: Don't touch %tick_cmpr on sun4v cpus.

Julien Cristau jcristau at debian.org
Sat Aug 18 18:34:54 UTC 2012


Package: silo
Severity: grave
X-Debbugs-Cc: David Miller <davem at davemloft.net>, debian-sparc at lists.debian.org
Tags: upstream patch fixed-upstream

Filing this as a bug so it doesn't get lost.  Thanks for the heads-up,
David.

On Wed, Aug 15, 2012 at 01:14:16 -0700, David Miller wrote:

> 
> This generates an illegal instruction exception.
> 
> This has a long history.  For the first sun4v port of SILO in commit
> 494770a17eea7192d3242051e76f4da6d838e3a1 ("SILO Niagara/SUN4V
> support") this code was removed entirely.
> 
> But later this was found to regress older UltraSPARC boxes, so we put
> it back in commit bd708e35bdcd8e92cb7c65368f2a356982df7cd8 ("Fix
> Ultra10 SILO timer").  But that was wrong too.
> 
> The OBP still owns the trap table when SILO runs and it uses the
> %tick_cmpr generated interrupt.  This has a bad interraction with how
> we use the %tick register in SILO.
> 
> SILO first reads the %tick register and remembers this value as the
> time base.
> 
> Later, we read %tick again, compute the difference, and use this to
> calcualte the amount of time elapsed.
> 
> OBP's %tick_cmpr interrupt handler is doing something funky, such as
> resetting %tick, which makes our timeouts never actually expire.
> 
> This issue doesn't exist on sun4v machines, and we absolutely cannot
> try to touch the %tick_cmpr register as that generates an illegal
> instruction trap on such cpus.
> 
> Signed-off-by: David S. Miller <davem at davemloft.net>
> ---
> 
> I just committed this into the SILO git repo.
> 
> Debian folks, you really want this propagated into your installer as
> soon as possible.  All the install ISOs will crash in SILO on all
> sun4v (Niagara) machines unless an explicit SILO boot target is given
> on the boot command line.  I used "boot cdrom install" to get around
> this.
> 
> It triggers any time the timer mechanism is enabled ("timeout=foo" is
> specified in silo.conf)
> 
>  include/silo.h | 1 +
>  second/main.c  | 1 +
>  second/misc.c  | 4 +++-
>  second/timer.c | 2 +-
>  4 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/include/silo.h b/include/silo.h
> index fe5adcb..94d6e31 100644
> --- a/include/silo.h
> +++ b/include/silo.h
> @@ -125,6 +125,7 @@ int strtol (const char *, char **, int);
>  int decompress (char *, char *, unsigned char (*)(void), void (*)(void));
>  /* main.c */
>  extern enum arch architecture;
> +extern int sun4v_cpu;
>  /* timer.c */
>  int init_timer ();
>  void close_timer ();
> diff --git a/second/main.c b/second/main.c
> index 182b263..a45807d 100644
> --- a/second/main.c
> +++ b/second/main.c
> @@ -64,6 +64,7 @@ enum {
>      CMD_LS
>  } load_cmd;
>  enum arch architecture;
> +int sun4v_cpu;
>  static int timer_status = 0;
>  static char *initrd_start;
>  static int initrd_size;
> diff --git a/second/misc.c b/second/misc.c
> index 163738e..d6bcdb1 100644
> --- a/second/misc.c
> +++ b/second/misc.c
> @@ -517,8 +517,10 @@ enum arch silo_get_architecture(void)
>  	return sun4d;
>      case 'e':
>  	return sun4e;
> -    case 'u':
>      case 'v':
> +	sun4v_cpu = 1;
> +	/* FALLTHRU */
> +    case 'u':
>  	return sun4u;
>      default:
>      	for(i = 0; i < NUM_SUN_MACHINES; i++)
> diff --git a/second/timer.c b/second/timer.c
> index 51e928e..7f03996 100644
> --- a/second/timer.c
> +++ b/second/timer.c
> @@ -156,7 +156,7 @@ static inline int sun4u_init_timer ()
>      }
>      if (!foundcpu || !clock_frequency)
>          clock_frequency = prom_getint(prom_root_node, "clock-frequency") / 100;
> -    if (notimer) {
> +    if (notimer && !sun4v_cpu) {
>          sun4u_notimer = 1;
>          __asm__ __volatile__ ("\t"
>          	"rd	%%tick_cmpr, %%g1\n\t"
> -- 
> 1.7.11.2
> 
> 

On Wed, Aug 15, 2012 at 16:43:31 -0700, David Miller wrote:

> From: David Miller <davem at davemloft.net>
> Date: Wed, 15 Aug 2012 01:14:16 -0700 (PDT)
> 
> > 
> > This generates an illegal instruction exception.
> 
> Unfortunately, after some more testing, this needs a follow-on fix,
> included below and also committed to SILO git.
> 
> Sorry for the confusion.
> 
> ====================
> silo: Don't assume P1275 OBP means sun4u.
> 
> It could also mean 'sun4v'.
> 
> Code this defensively, so that if (for whatever reason)
> we can't get at the 'compatible' property in the root
> OBP device node we'll still default to sun4u as previous.
> 
> Signed-off-by: David S. Miller <davem at davemloft.net>
> ---
>  second/misc.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/second/misc.c b/second/misc.c
> index d6bcdb1..d789723 100644
> --- a/second/misc.c
> +++ b/second/misc.c
> @@ -501,7 +501,7 @@ enum arch silo_get_architecture(void)
>          if ((i = prom_searchsiblings(i, "MicroSPARC-IIep")) != 0) {
>              return sun4p;
>          }
> -        return sun4u;
> +	buffer[4] = 'u';
>      }
>      i = prom_getproperty (prom_root_node, "compatability", buffer, 8);
>  
> -- 
> 1.7.11.2

Cheers,
Julien
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.alioth.debian.org/pipermail/debootloaders-silo/attachments/20120818/9fffe032/attachment.pgp>


More information about the Debootloaders-silo mailing list