diff options
author | brucec <brucec@FreeBSD.org> | 2010-12-02 22:19:30 +0000 |
---|---|---|
committer | brucec <brucec@FreeBSD.org> | 2010-12-02 22:19:30 +0000 |
commit | dc1c4b92702120dc06348d91c97ca533d7a27bc6 (patch) | |
tree | 5956ab7635210faf252c5fa49f64ff6a8bda82de /sys/arm | |
parent | 904cc72f190967800c699fe0d05d7044b2414147 (diff) | |
download | FreeBSD-src-dc1c4b92702120dc06348d91c97ca533d7a27bc6.zip FreeBSD-src-dc1c4b92702120dc06348d91c97ca533d7a27bc6.tar.gz |
Disallow passing in a count of zero bytes to the bus_space(9) functions.
Passing a count of zero on i386 and amd64 for [I386|AMD64]_BUS_SPACE_MEM
causes a crash/hang since the 'loop' instruction decrements the counter
before checking if it's zero.
PR: kern/80980
Discussed with: jhb
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/include/bus.h | 67 |
1 files changed, 59 insertions, 8 deletions
diff --git a/sys/arm/include/bus.h b/sys/arm/include/bus.h index cabf1f7..4df6103 100644 --- a/sys/arm/include/bus.h +++ b/sys/arm/include/bus.h @@ -66,6 +66,9 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ +#include <sys/param.h> +#include <sys/systm.h> + #include <machine/_bus.h> /* @@ -318,21 +321,29 @@ struct bus_space { * Bus read multiple operations. */ #define bus_space_read_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_1: count == 0")); \ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_2: count == 0")); \ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_4: count == 0")); \ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_8: count == 0")); \ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_1: count == 0")); \ __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_2: count == 0")); \ __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_4: count == 0")); \ __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_8: count == 0")); \ __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c)) @@ -340,21 +351,29 @@ struct bus_space { * Bus read region operations. */ #define bus_space_read_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_1: count == 0")); \ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_2: count == 0")); \ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_4: count == 0")); \ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_8: count == 0")); \ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_1: count == 0"));\ __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_2: count == 0"));\ __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_4: count == 0"));\ __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_8 count == 0")); \ __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c)) @@ -376,21 +395,29 @@ struct bus_space { * Bus write multiple operations. */ #define bus_space_write_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_1: count == 0")); \ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_2: count == 0")); \ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_4: count == 0")); \ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_8: count == 0")); \ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_1: count == 0"));\ __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_2: count == 0"));\ __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_4: count == 0"));\ __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_8: count == 0"));\ __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c)) @@ -398,34 +425,50 @@ struct bus_space { * Bus write region operations. */ #define bus_space_write_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_1: count == 0")); \ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_2: count == 0")); \ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_4: count == 0")); \ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_8: count == 0")); \ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_1: count == 0")); \ __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_2: count == 0")); \ __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_4: count == 0")); \ __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_8: count == 0")); \ __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c)) /* * Set multiple operations. */ -#define bus_space_set_multi_1(t, h, o, v, c) \ +#define bus_space_set_multi_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_1: count == 0")); \ __bs_set(sm,1,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_2(t, h, o, v, c) \ +#define bus_space_set_multi_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_2: count == 0")); \ __bs_set(sm,2,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_4(t, h, o, v, c) \ +#define bus_space_set_multi_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_4: count == 0")); \ __bs_set(sm,4,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_8(t, h, o, v, c) \ +#define bus_space_set_multi_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_8: count == 0")); \ __bs_set(sm,8,(t),(h),(o),(v),(c)) @@ -433,25 +476,33 @@ struct bus_space { * Set region operations. */ #define bus_space_set_region_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_1: count == 0")); \ __bs_set(sr,1,(t),(h),(o),(v),(c)) #define bus_space_set_region_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_2: count == 0")); \ __bs_set(sr,2,(t),(h),(o),(v),(c)) #define bus_space_set_region_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_4: count == 0")); \ __bs_set(sr,4,(t),(h),(o),(v),(c)) #define bus_space_set_region_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_8: count == 0")); \ __bs_set(sr,8,(t),(h),(o),(v),(c)) /* * Copy operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_1: count == 0")); \ __bs_copy(1, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_2: count == 0")); \ __bs_copy(2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_4: count == 0")); \ __bs_copy(4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_8: count == 0")); \ __bs_copy(8, t, h1, o1, h2, o2, c) /* |