This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

egcs-19991004: ICE on SPARC Linux


The following gets an signal 11 in cc1. It was chainsawed to size from 
drivers/sbus/char/zs.c in linux-2.2.13pre15. Compile with gcc -O and watch
the fireworks:

extern __inline__ void setipl(unsigned long __orig_psr)
{
  __asm__ __volatile__(""
		       :  
		       : "r" (__orig_psr)
		       : "memory", "cc");
}

struct tq_struct {
};

typedef struct tq_struct * task_queue;

extern __inline__ void queue_task(struct tq_struct *bh_pointer)
{
    unsigned long flags;
    flags = 117;
    setipl(flags);
}

struct tty_flip_buffer {
  struct tq_struct tqueue;
};

struct tty_struct {
  struct tty_flip_buffer flip;
};

struct sun_serial {
  struct sun_serial *zs_next;        
  struct tty_struct *tty;
};

static inline  void receive_chars(struct sun_serial *info)
{
  struct tty_struct *tty = info->tty;
  queue_task(&tty->flip.tqueue);
}

void zs_interrupt(int irq, void *dev_id)
{
  struct sun_serial *info = (struct sun_serial *)0x12345;
  unsigned char zs_intreg;

  zs_intreg = irq;

  if (zs_intreg == 0x0c ) {
    receive_chars(info);
    return;
  }
  if(zs_intreg == 0x04 ) {
    receive_chars(info->zs_next);
    return;
  }
  info = info->zs_next->zs_next;
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]