--- trunk/src/devices/dev_sgi_ip32.c 2007/10/08 16:18:22 9 +++ trunk/src/devices/dev_sgi_ip32.c 2007/10/08 16:18:27 10 @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * - * $Id: dev_sgi_ip32.c,v 1.24 2005/03/18 23:20:52 debug Exp $ + * $Id: dev_sgi_ip32.c,v 1.27 2005/06/26 11:43:48 debug Exp $ * * SGI IP32 devices. * @@ -154,17 +154,18 @@ else memcpy(data, &d->reg[relative_addr], len); - if (relative_addr == 0x18 || relative_addr == 0x1c) { + if ((relative_addr >= 0x18 && relative_addr <= 0x1f) || + (relative_addr+len-1 >= 0x18 && relative_addr+len-1 <= 0x1f)) { /* * Force interrupt re-assertion: * * NOTE: Ugly hack. Hopefully CRMERR is never used. */ #if 0 - +/* No. If this is enabled, the mec bugs out on either NetBSD or OpenBSD. TODO. - +*/ cpu_interrupt_ack(cpu, 8); /* CRM_INT_CRMERR); */ #endif } @@ -195,15 +196,15 @@ "control 0x%016llx ]\n", (long long)idata); } break; -#if 1 +#if 0 case CRIME_INTSTAT: /* 0x010, Current interrupt status */ case 0x14: case CRIME_INTMASK: /* 0x018, Current interrupt mask */ case 0x1c: case 0x34: -#endif /* don't dump debug info for these */ break; +#endif default: if (writeflag==MEM_READ) { debug("[ crime: read from 0x%x, len=%i:", @@ -266,18 +267,34 @@ else memcpy(data, &d->reg[relative_addr], len); + if ((relative_addr >= 0x18 && relative_addr <= 0x1f) || + (relative_addr+len-1 >= 0x18 && relative_addr+len-1 <= 0x1f)) + cpu_interrupt_ack(cpu, 8); /* CRM_INT_CRMERR); */ + switch (relative_addr) { #if 0 - case 0x14: /* Current interrupt assertions */ - case 0x18: /* ??? */ - case 0x1c: /* Interrupt mask */ + case 0x10: /* Current interrupt assertions */ + case 0x14: + /* don't dump debug info for these */ + if (writeflag == MEM_WRITE) { + fatal("[ NOTE/TODO: WRITE to mace intr: " + "reladdr=0x%x data=", (int)relative_addr); + for (i=0; icur_rx_packet_len, d->cur_rx_addr_index, (int)base); #endif @@ -912,6 +929,7 @@ uint64_t baseaddr, int irq_nr, unsigned char *macaddr) { char *name2; + size_t nlen = 55; struct sgi_mec_data *d = malloc(sizeof(struct sgi_mec_data)); if (d == NULL) { @@ -924,12 +942,12 @@ mec_reset(d); - name2 = malloc(50); + name2 = malloc(nlen); if (name2 == NULL) { fprintf(stderr, "out of memory in dev_sgi_mec_init()\n"); exit(1); } - sprintf(name2, "mec [%02x:%02x:%02x:%02x:%02x:%02x]", + snprintf(name2, nlen, "mec [%02x:%02x:%02x:%02x:%02x:%02x]", d->macaddr[0], d->macaddr[1], d->macaddr[2], d->macaddr[3], d->macaddr[4], d->macaddr[5]);