summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorchuck <chuck@cvs.openbsd.org>1996-02-03 18:33:00 +0000
committerchuck <chuck@cvs.openbsd.org>1996-02-03 18:33:00 +0000
commit3c546f4f6be4ce4df523b87418ab0400f53a35b0 (patch)
treecf045a55303449bd36dac6e6b47f575951ba7fe0 /sys/arch
parent18fd0c22032a9c4f541172058eb56113e70ca735 (diff)
Ensure siop_acb alignment via malloc rather than let alignment depend
on the size of MI data structures that come before it in the softc. Chip will not function properly if alignment is wrong. Detected and fixed by: Chuck Cranor <chuck@ccrc.wustl.edu> and Michael L Hitch <osymh@gemini.oscs.montana.edu>
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/amiga/dev/siop.c18
-rw-r--r--sys/arch/amiga/dev/siopvar.h3
2 files changed, 16 insertions, 5 deletions
diff --git a/sys/arch/amiga/dev/siop.c b/sys/arch/amiga/dev/siop.c
index ebbd360fbe8..a572aef9390 100644
--- a/sys/arch/amiga/dev/siop.c
+++ b/sys/arch/amiga/dev/siop.c
@@ -49,6 +49,7 @@
#include <sys/disklabel.h>
#include <sys/dkstat.h>
#include <sys/buf.h>
+#include <sys/malloc.h>
#include <scsi/scsi_all.h>
#include <scsi/scsiconf.h>
#include <machine/cpu.h>
@@ -531,11 +532,20 @@ siopinitialize(sc)
/*
* Need to check that scripts is on a long word boundary
- * and that DS is on a long word boundary.
* Also should verify that dev doesn't span non-contiguous
* physical pages.
*/
sc->sc_scriptspa = kvtop(scripts);
+
+ /*
+ * malloc sc_acb to ensure that DS is on a long word boundary.
+ */
+
+ MALLOC(sc->sc_acb, struct siop_acb *,
+ sizeof(struct siop_acb) * SIOP_NACB, M_DEVBUF, M_NOWAIT);
+ if (sc->sc_acb == NULL)
+ panic("siopinitialize: ACB malloc failed!");
+
sc->sc_tcp[1] = 1000 / sc->sc_clock_freq;
sc->sc_tcp[2] = 1500 / sc->sc_clock_freq;
sc->sc_tcp[3] = 2000 / sc->sc_clock_freq;
@@ -640,8 +650,8 @@ siopreset(sc)
TAILQ_INIT(&sc->free_list);
sc->sc_nexus = NULL;
acb = sc->sc_acb;
- bzero(acb, sizeof(sc->sc_acb));
- for (i = 0; i < sizeof(sc->sc_acb) / sizeof(*acb); i++) {
+ bzero(acb, sizeof(struct siop_acb) * SIOP_NACB);
+ for (i = 0; i < SIOP_NACB; i++) {
TAILQ_INSERT_TAIL(&sc->free_list, acb, chain);
acb++;
}
@@ -803,7 +813,7 @@ siop_start (sc, target, lun, cbuf, clen, buf, len)
#endif
/* push data cache for all data the 53c710 needs to access */
- dma_cachectl (sc, sizeof (struct siop_softc));
+ dma_cachectl (acb, sizeof (struct siop_acb));
dma_cachectl (cbuf, clen);
if (buf != NULL && len != 0)
dma_cachectl (buf, len);
diff --git a/sys/arch/amiga/dev/siopvar.h b/sys/arch/amiga/dev/siopvar.h
index ae86c41b0c1..b4c55e4e84a 100644
--- a/sys/arch/amiga/dev/siopvar.h
+++ b/sys/arch/amiga/dev/siopvar.h
@@ -141,7 +141,8 @@ struct siop_softc {
nexus_list;
struct siop_acb *sc_nexus; /* current command */
- struct siop_acb sc_acb[8]; /* the real command blocks */
+#define SIOP_NACB 8
+ struct siop_acb *sc_acb; /* the real command blocks */
struct siop_tinfo sc_tinfo[8];
u_short sc_clock_freq;