Module Name: src
Committed By: phx
Date: Wed Feb 3 13:56:53 UTC 2010
Modified Files:
src/sys/arch/amiga/amiga: amiga_bus_simple_4.c busfuncs.c
simple_busfuncs.c
src/sys/arch/amiga/include: bus.h
src/sys/arch/amigappc/include: bus.h
Log Message:
Ensure reorder protection for amigappc in all bus space functions.
The ne(4) driver (XSurf2), which is the only bus_space device I got,
works now.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/amiga/amiga/amiga_bus_simple_4.c \
src/sys/arch/amiga/amiga/simple_busfuncs.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/amiga/amiga/busfuncs.c
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/amiga/include/bus.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/amigappc/include/bus.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amiga/amiga/amiga_bus_simple_4.c
diff -u src/sys/arch/amiga/amiga/amiga_bus_simple_4.c:1.5 src/sys/arch/amiga/amiga/amiga_bus_simple_4.c:1.6
--- src/sys/arch/amiga/amiga/amiga_bus_simple_4.c:1.5 Mon Apr 28 20:23:12 2008
+++ src/sys/arch/amiga/amiga/amiga_bus_simple_4.c Wed Feb 3 13:56:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: amiga_bus_simple_4.c,v 1.5 2008/04/28 20:23:12 martin Exp $ */
+/* $NetBSD: amiga_bus_simple_4.c,v 1.6 2010/02/03 13:56:53 phx Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: amiga_bus_simple_4.c,v 1.5 2008/04/28 20:23:12 martin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: amiga_bus_simple_4.c,v 1.6 2010/02/03 13:56:53 phx Exp $");
#define AMIGA_SIMPLE_BUS_STRIDE 4 /* 1 byte per long */
#define AMIGA_SIMPLE_BUS_WORD_METHODS
@@ -57,6 +57,7 @@
while (count > 0) {
*pointer++ = bswap16(*p);
+ amiga_bus_reorder_protect();
--count;
}
}
@@ -71,6 +72,7 @@
while (count > 0) {
*p = bswap16(*pointer);
+ amiga_bus_reorder_protect();
++pointer;
--count;
}
Index: src/sys/arch/amiga/amiga/simple_busfuncs.c
diff -u src/sys/arch/amiga/amiga/simple_busfuncs.c:1.5 src/sys/arch/amiga/amiga/simple_busfuncs.c:1.6
--- src/sys/arch/amiga/amiga/simple_busfuncs.c:1.5 Mon Apr 28 20:23:12 2008
+++ src/sys/arch/amiga/amiga/simple_busfuncs.c Wed Feb 3 13:56:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: simple_busfuncs.c,v 1.5 2008/04/28 20:23:12 martin Exp $ */
+/* $NetBSD: simple_busfuncs.c,v 1.6 2010/02/03 13:56:53 phx Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: simple_busfuncs.c,v 1.5 2008/04/28 20:23:12 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: simple_busfuncs.c,v 1.6 2010/02/03 13:56:53 phx Exp $");
/*
* Do NOT use this standalone.
@@ -110,9 +110,12 @@
bus_size_t offset;
{
u_int8_t *p;
+ u_int8_t x;
p = (u_int8_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
- return (*p);
+ x = *p;
+ amiga_bus_reorder_protect();
+ return x;
}
void
@@ -125,6 +128,7 @@
p = (u_int8_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
*p = (u_int8_t)value;
+ amiga_bus_reorder_protect();
}
void
@@ -140,6 +144,7 @@
while (count > 0) {
*pointer++ = *p;
+ amiga_bus_reorder_protect();
--count;
}
}
@@ -157,6 +162,7 @@
while (count > 0) {
*p = *pointer++;
+ amiga_bus_reorder_protect();
--count;
}
}
@@ -174,6 +180,7 @@
while (count > 0) {
*pointer++ = *p;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE;
--count;
}
@@ -192,6 +199,7 @@
while (count > 0) {
*p = *pointer++;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE;
--count;
}
@@ -210,6 +218,7 @@
while (count > 0) {
*p = value;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE;
--count;
}
@@ -228,6 +237,7 @@
while (count > 0) {
*q = *p;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE;
q += AMIGA_SIMPLE_BUS_STRIDE;
--count;
@@ -249,14 +259,17 @@
bscr(oabs(bscr2_), u_int16_t);
u_int16_t
-oabs(bsr2_) (handle, offset)
+oabs(bsr2_)(handle, offset)
bus_space_handle_t handle;
bus_size_t offset;
{
u_int16_t *p;
+ u_int16_t x;
p = (u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
- return (*p);
+ x = *p;
+ amiga_bus_reorder_protect();
+ return x;
}
void
@@ -269,6 +282,7 @@
p = (u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
*p = (u_int16_t)value;
+ amiga_bus_reorder_protect();
}
void
@@ -284,6 +298,7 @@
while (count > 0) {
*pointer++ = *p;
+ amiga_bus_reorder_protect();
--count;
}
}
@@ -301,6 +316,7 @@
while (count > 0) {
*p = *pointer++;
+ amiga_bus_reorder_protect();
--count;
}
}
@@ -318,6 +334,7 @@
while (count > 0) {
*pointer++ = *(volatile u_int16_t *)p;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int16_t);
--count;
}
@@ -336,6 +353,7 @@
while (count > 0) {
*(volatile u_int16_t *)p = *pointer++;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int16_t);
--count;
}
@@ -354,6 +372,7 @@
while (count > 0) {
*(volatile u_int16_t *)p = (unsigned)value;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int16_t);
--count;
}
@@ -372,6 +391,7 @@
while (count > 0) {
*(volatile u_int16_t *)q = *(volatile u_int16_t *)p;
+ amiga_bus_reorder_protect();
p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int16_t);
q += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int16_t);
--count;
Index: src/sys/arch/amiga/amiga/busfuncs.c
diff -u src/sys/arch/amiga/amiga/busfuncs.c:1.10 src/sys/arch/amiga/amiga/busfuncs.c:1.11
--- src/sys/arch/amiga/amiga/busfuncs.c:1.10 Sat Mar 14 21:04:03 2009
+++ src/sys/arch/amiga/amiga/busfuncs.c Wed Feb 3 13:56:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: busfuncs.c,v 1.10 2009/03/14 21:04:03 dsl Exp $ */
+/* $NetBSD: busfuncs.c,v 1.11 2010/02/03 13:56:53 phx Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: busfuncs.c,v 1.10 2009/03/14 21:04:03 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: busfuncs.c,v 1.11 2010/02/03 13:56:53 phx Exp $");
/*
* Amiga bus access methods for data widths > 1
@@ -118,7 +118,11 @@
amiga_contiguous_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
{
/* ARGSUSED */
- return (* (u_int16_t *) (h + o)); /* only used if t->stride == 0 */
+ u_int16_t x;
+
+ x = * (u_int16_t *) (h + o); /* only used if t->stride == 0 */
+ amiga_bus_reorder_protect();
+ return x;
}
void
@@ -126,6 +130,7 @@
{
/* ARGSUSED */
* (u_int16_t *) (h + o) = v;
+ amiga_bus_reorder_protect();
}
void
@@ -136,6 +141,7 @@
while (s-- > 0) {
*p++ = *q;
+ amiga_bus_reorder_protect();
}
}
@@ -147,6 +153,7 @@
while (s-- > 0) {
*q = *p++;
+ amiga_bus_reorder_protect();
}
}
@@ -158,6 +165,7 @@
while (s-- > 0) {
*p++ = *q++;
+ amiga_bus_reorder_protect();
}
}
@@ -169,6 +177,7 @@
while (s-- > 0) {
*q++ = *p++;
+ amiga_bus_reorder_protect();
}
}
@@ -180,6 +189,7 @@
while (s-- > 0) {
*q++ = v;
+ amiga_bus_reorder_protect();
}
}
@@ -192,6 +202,7 @@
while (s-- > 0) {
*q++ = *p++;
+ amiga_bus_reorder_protect();
}
}
@@ -205,12 +216,14 @@
amiga_interleaved_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
{
volatile u_int8_t *q;
+ u_int16_t x;
int step;
step = 1 << t->stride;
q = (volatile u_int8_t *)(h + (o << t->stride));
-
- return ((*q) << 8) | *(q + step);
+ x = ((*q) << 8) | *(q + step);
+ amiga_bus_reorder_protect();
+ return x;
}
void
@@ -224,6 +237,7 @@
*q = v >> 8;
*(q+step) = v;
+ amiga_bus_reorder_protect();
}
void
@@ -237,6 +251,7 @@
while (s-- > 0) {
*p++ = ((*q)<<8) | *(q+step);
+ amiga_bus_reorder_protect();
}
}
@@ -254,6 +269,7 @@
v = *p++;
*q = v>>8;
*(q + step) = v;
+ amiga_bus_reorder_protect();
}
}
@@ -271,6 +287,7 @@
v = (*q) << 8;
q += step;
v |= *q;
+ amiga_bus_reorder_protect();
q += step;
*p++ = v;
}
@@ -291,6 +308,7 @@
*q = v >> 8;
q += step;
*q = v;
+ amiga_bus_reorder_protect();
q += step;
}
}
@@ -305,6 +323,7 @@
while (s-- > 0) {
*q = v;
+ amiga_bus_reorder_protect();
q += step;
}
}
@@ -320,6 +339,7 @@
while (s-- > 0) {
*q = *p;
+ amiga_bus_reorder_protect();
p += step;
q += step;
}
@@ -334,7 +354,11 @@
amiga_interleaved_wordaccess_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
{
/* ARGSUSED */
- return (* (u_int16_t *) (h + (o << t->stride)));
+ u_int16_t x;
+
+ x = * (u_int16_t *) (h + (o << t->stride));
+ amiga_bus_reorder_protect();
+ return x;
}
void
@@ -342,6 +366,7 @@
{
/* ARGSUSED */
* (u_int16_t *) (h + (o << t->stride)) = v;
+ amiga_bus_reorder_protect();
}
void
@@ -354,6 +379,7 @@
while (s-- > 0) {
*p++ = *q;
+ amiga_bus_reorder_protect();
}
}
@@ -367,6 +393,7 @@
while (s-- > 0) {
*q = *p++;
+ amiga_bus_reorder_protect();
}
}
@@ -382,6 +409,7 @@
while (s-- > 0) {
*p++ = *q;
+ amiga_bus_reorder_protect();
q += step;
}
}
@@ -398,6 +426,7 @@
while (s-- > 0) {
*q = *p++;
+ amiga_bus_reorder_protect();
q += step;
}
}
@@ -414,6 +443,7 @@
while (s-- > 0) {
*q = v;
+ amiga_bus_reorder_protect();
q += step;
}
}
@@ -432,8 +462,8 @@
while (s-- > 0) {
*q = *p;
+ amiga_bus_reorder_protect();
q += step;
p += step;
}
}
-
Index: src/sys/arch/amiga/include/bus.h
diff -u src/sys/arch/amiga/include/bus.h:1.22 src/sys/arch/amiga/include/bus.h:1.23
--- src/sys/arch/amiga/include/bus.h:1.22 Tue Oct 20 19:10:10 2009
+++ src/sys/arch/amiga/include/bus.h Wed Feb 3 13:56:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: bus.h,v 1.22 2009/10/20 19:10:10 snj Exp $ */
+/* $NetBSD: bus.h,v 1.23 2010/02/03 13:56:53 phx Exp $ */
/*
* Copyright (c) 1996 Leo Weppelman. All rights reserved.
@@ -247,6 +247,9 @@
#define __BUS_SPACE_HAS_STREAM_METHODS
+/* Instruction for enforcing reorder protection. Nothing for 68k. */
+#define amiga_bus_reorder_protect()
+
extern const struct amiga_bus_space_methods amiga_bus_stride_1;
extern const struct amiga_bus_space_methods amiga_bus_stride_2;
extern const struct amiga_bus_space_methods amiga_bus_stride_4;
Index: src/sys/arch/amigappc/include/bus.h
diff -u src/sys/arch/amigappc/include/bus.h:1.6 src/sys/arch/amigappc/include/bus.h:1.7
--- src/sys/arch/amigappc/include/bus.h:1.6 Tue Oct 20 19:10:10 2009
+++ src/sys/arch/amigappc/include/bus.h Wed Feb 3 13:56:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: bus.h,v 1.6 2009/10/20 19:10:10 snj Exp $ */
+/* $NetBSD: bus.h,v 1.7 2010/02/03 13:56:53 phx Exp $ */
/*
* Copyright (c) 1996 Leo Weppelman. All rights reserved.
@@ -247,6 +247,9 @@
#define __BUS_SPACE_HAS_STREAM_METHODS
+/* Instruction for enforcing reorder protection. */
+#define amiga_bus_reorder_protect() __asm volatile ("eieio")
+
extern const struct amiga_bus_space_methods amiga_bus_stride_1;
extern const struct amiga_bus_space_methods amiga_bus_stride_2;
extern const struct amiga_bus_space_methods amiga_bus_stride_4;