Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Sep 2020 22:18:03 -0700
From:      Ravi Pokala <rpokala@freebsd.org>
To:        Michal Meloun <mmel@FreeBSD.org>, <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@freebsd.org>
Subject:   Re: svn commit: r365899 - in head: share/man/man9 sys/arm/include sys/arm64/arm64 sys/arm64/include sys/kern sys/mips/include sys/powerpc/include sys/riscv/include sys/sys sys/tools sys/x86/include
Message-ID:  <4D257266-3703-4513-9301-33E03F9FF9BE@panasas.com>
In-Reply-To: <202009191106.08JB6fE9010167@repo.freebsd.org>
References:  <202009191106.08JB6fE9010167@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This breaks amd64.GENERIC-KCSAN:

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
${SRCTOP}/sys/kern/subr_csan.c:895:1: error: implicit declaration of functi=
on 'bus_space_peek_8' is invalid in C99 [-Werror,-Wimplicit-function-declara=
tion]
CSAN_BUS_PEEK_FUNC(8, uint64_t)
^
${SRCTOP}/sys/kern/subr_csan.c:888:11: note: expanded from macro 'CSAN_BUS_=
PEEK_FUNC'
                return (bus_space_peek_##width(tag, hnd, offset, value)); \
                        ^
<scratch space>:56:1: note: expanded from here
bus_space_peek_8
^
${SRCTOP}/sys/kern/subr_csan.c:909:1: error: implicit declaration of functi=
on 'bus_space_poke_8' is invalid in C99 [-Werror,-Wimplicit-function-declara=
tion]
CSAN_BUS_POKE_FUNC(8, uint64_t)
^
${SRCTOP}/sys/kern/subr_csan.c:902:11: note: expanded from macro 'CSAN_BUS_=
POKE_FUNC'
                return (bus_space_poke_##width(tag, hnd, offset, value)); \
                        ^
<scratch space>:64:1: note: expanded from here
bus_space_poke_8
^
2 errors generated.
--- subr_csan.o ---
*** [subr_csan.o] Error code 1
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Thanks,

Ravi (rpokala@)

=EF=BB=BF-----Original Message-----
From: <owner-src-committers@freebsd.org> on behalf of Michal Meloun <mmel@F=
reeBSD.org>
Date: 2020-09-19, Saturday at 04:06
To: <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@=
freebsd.org>
Subject: svn commit: r365899 - in head: share/man/man9 sys/arm/include sys/=
arm64/arm64 sys/arm64/include sys/kern sys/mips/include sys/powerpc/include =
sys/riscv/include sys/sys sys/tools sys/x86/include

    Author: mmel
    Date: Sat Sep 19 11:06:41 2020
    New Revision: 365899
    URL: https://svnweb.freebsd.org/changeset/base/365899

    Log:
      Add NetBSD compatible bus_space_peek_N() and bus_space_poke_N() funct=
ions.
      One problem with the bus_space_read_N() and bus_space_write_N() famil=
y of
      functions is that they provide no protection against exceptions which=
 can
      occur when no physical hardware or device responds to the read or wri=
te
      cycles. In such a situation, the system typically would panic due to =
a
      kernel-mode bus error. The bus_space_peek_N() and bus_space_poke_N() =
family
      of functions provide a mechanism to handle these exceptions gracefull=
y
      without the risk of crashing the system.

      Typical example is access to PCI(e) configuration space in bus enumer=
ation
      function on badly implemented PCI(e) root complexes (RK3399 or Neover=
se
      N1 N1SDP and/or access to PCI(e) register when device is in deep slee=
p state.

      This commit adds a real implementation for arm64 only. The remaining
      architectures have bus_space_peek()/bus_space_poke() emulated by usin=
g
      bus_space_read()/bus_space_write() (without exception handling).

      MFC after:	1 month
      Reviewed by:	kib
      Differential Revision:	https://reviews.freebsd.org/D25371

    Modified:
      head/share/man/man9/bus_space.9
      head/sys/arm/include/bus.h
      head/sys/arm64/arm64/bus_machdep.c
      head/sys/arm64/arm64/bus_space_asm.S
      head/sys/arm64/arm64/trap.c
      head/sys/arm64/include/bus.h
      head/sys/arm64/include/md_var.h
      head/sys/kern/subr_csan.c
      head/sys/mips/include/bus.h
      head/sys/powerpc/include/bus.h
      head/sys/riscv/include/bus.h
      head/sys/sys/_cscan_bus.h
      head/sys/sys/bus.h
      head/sys/tools/bus_macro.sh
      head/sys/x86/include/bus.h

    Modified: head/share/man/man9/bus_space.9
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/share/man/man9/bus_space.9	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/share/man/man9/bus_space.9	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -52,7 +52,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd January 15, 2017
    +.Dd July 7, 2020
     .Dt BUS_SPACE 9
     .Os
     .Sh NAME
    @@ -68,6 +68,14 @@
     .Nm bus_space_copy_region_stream_8 ,
     .Nm bus_space_free ,
     .Nm bus_space_map ,
    +.Nm bus_space_peek_1 ,
    +.Nm bus_space_peek_2 ,
    +.Nm bus_space_peek_4 ,
    +.Nm bus_space_peek_8 ,
    +.Nm bus_space_poke_1 ,
    +.Nm bus_space_poke_2 ,
    +.Nm bus_space_poke_4 ,
    +.Nm bus_space_poke_8 ,
     .Nm bus_space_read_1 ,
     .Nm bus_space_read_2 ,
     .Nm bus_space_read_4 ,
    @@ -161,6 +169,46 @@
     .Fo bus_space_free
     .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t si=
ze"
     .Fc
    +.Ft int
    +.Fo bus_space_peek_1
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
    +.Ft int
    +.Fo bus_space_peek_2
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
    +.Ft int
    +.Fo bus_space_peek_4
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
    +.Ft int
    +.Fo bus_space_peek_8
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
    +.Ft int
    +.Fo bus_space_poke_1
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
    +.Ft int
    +.Fo bus_space_poke_2
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
    +.Ft int
    +.Fo bus_space_poke_4
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
    +.Ft int
    +.Fo bus_space_poke_8
    +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    +.Fa "uint8_t *datap"
    +.Fc
     .Ft uint8_t
     .Fo bus_space_read_1
     .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t of=
fset"
    @@ -1124,6 +1172,105 @@ If they would fail (e.g.\& because of an
     argument error), that indicates a software bug which should cause a
     panic.
     In that case, they will never return.
    +.Sh PROBING BUS SPACE FOR HARDWARE WHICH MAY NOT RESPOND
    +One problem with the
    +.Fn bus_space_read_N
    +and
    +.Fn bus_space_write_N
    +family of functions is that they provide no protection against
    +exceptions which can occur when no physical hardware or
    +device responds to the read or write cycles.
    +In such a situation, the system typically would panic due to a kernel-=
mode
    +bus error.
    +The
    +.Fn bus_space_peek_N
    +and
    +.Fn bus_space_poke_N
    +family of functions provide a mechanism to handle these exceptions
    +gracefully without the risk of crashing the system.
    +.Pp
    +As with
    +.Fn bus_space_read_N
    +and
    +.Fn bus_space_write_N ,
    +the peek and poke functions provide the ability to read and
    +write 1, 2, 4, and 8 byte data items on busses which support those
    +access sizes.
    +All of the constraints specified in the descriptions of the
    +.Fn bus_space_read_N
    +and
    +.Fn bus_space_write_N
    +functions also apply to
    +.Fn bus_space_peek_N
    +and
    +.Fn bus_space_poke_N .
    +.Pp
    +In addition, explicit calls to the
    +.Fn bus_space_barrier
    +function are not required as the implementation will ensure all
    +pending operations complete before the peek or poke operation starts.
    +The implementation will also ensure that the peek or poke operations
    +complete before returning.
    +.Pp
    +The return value indicates the outcome of the peek or poke operation.
    +A return value of zero implies that a hardware device is
    +responding to the operation at the specified offset in the bus space.
    +A non-zero return value indicates that the kernel intercepted a
    +hardware exception (e.g., bus error) when the peek or poke operation
    +was attempted.
    +Note that some busses are incapable of generating exceptions when
    +non-existent hardware is accessed.
    +In such cases, these functions will always return zero and the value o=
f
    +the data read by
    +.Fn bus_space_peek_N
    +will be unspecified.
    +.Pp
    +Finally, it should be noted that at this time the
    +.Fn bus_space_peek_N
    +and
    +.Fn bus_space_poke_N
    +functions are not re-entrant and should not, therefore, be used
    +from within an interrupt service routine.
    +This constraint may be removed at some point in the future.
    +.Pp
    +.Bl -ohang -compact
    +.It Fn bus_space_peek_1 "space" "handle" "offset" "datap"
    +.It Fn bus_space_peek_2 "space" "handle" "offset" "datap"
    +.It Fn bus_space_peek_4 "space" "handle" "offset" "datap"
    +.It Fn bus_space_peek_8 "space" "handle" "offset" "datap"
    +.Pp
    +The
    +.Fn bus_space_peek_N
    +family of functions cautiously read a 1, 2, 4, or 8 byte data item fro=
m
    +the offset specified by
    +.Fa offset
    +in the region specified by
    +.Fa handle
    +of the bus space specified by
    +.Fa space .
    +The data item read is stored in the location pointed to by
    +.Fa datap .
    +It is permissible for
    +.Fa datap
    +to be NULL, in which case the data item will be discarded after being =
read.
    +.Pp
    +.It Fn bus_space_poke_1 "space" "handle" "offset" "value"
    +.It Fn bus_space_poke_2 "space" "handle" "offset" "value"
    +.It Fn bus_space_poke_4 "space" "handle" "offset" "value"
    +.It Fn bus_space_poke_8 "space" "handle" "offset" "value"
    +.Pp
    +The
    +.Fn bus_space_poke_N
    +family of functions cautiously write a 1, 2, 4, or 8 byte data item
    +specified by
    +.Fa value
    +to the offset specified by
    +.Fa offset
    +in the region specified by
    +.Fa handle
    +of the bus space specified by
    +.Fa space .
    +.El
     .Sh BARRIERS
     In order to allow high-performance buffering implementations to avoid =
bus
     activity on every operation, read and write ordering should be specifi=
ed

    Modified: head/sys/arm/include/bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/arm/include/bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/arm/include/bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -747,6 +747,33 @@ void generic_bs_unimplemented(void);

     #define BUS_SPACE_UNRESTRICTED	(~0)

    +#define BUS_PEEK_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_peek_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type *value)	\
    +	{								\
    +		type tmp;						\
    +		tmp =3D bus_space_read_##width(tag, hnd, offset);		\
    +		return (0);						\
    +	}
    +BUS_PEEK_FUNC(1, uint8_t)
    +BUS_PEEK_FUNC(2, uint16_t)
    +BUS_PEEK_FUNC(4, uint32_t)
    +BUS_PEEK_FUNC(8, uint64_t)
    +
    +#define BUS_POKE_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_poke_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type value)	\
    +	{								\
    +		bus_space_write_##width(tag, hnd, offset, value);	\
    +		return (0); 						\
    +	}
    +BUS_POKE_FUNC(1, uint8_t)
    +BUS_POKE_FUNC(2, uint16_t)
    +BUS_POKE_FUNC(4, uint32_t)
    +BUS_POKE_FUNC(8, uint64_t)
    +
     #include <machine/bus_dma.h>

     /*

    Modified: head/sys/arm64/arm64/bus_machdep.c
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/arm64/arm64/bus_machdep.c	Sat Sep 19 02:15:56 2020	(r36589=
8)
    +++ head/sys/arm64/arm64/bus_machdep.c	Sat Sep 19 11:06:41 2020	(r36589=
9)
    @@ -83,6 +83,16 @@ void generic_bs_wr_4(void *, bus_space_handle_t, bus=
_s
     void generic_bs_wr_8(void *, bus_space_handle_t, bus_size_t, const uin=
t64_t *,
         bus_size_t);

    +int generic_bs_peek_1(void *, bus_space_handle_t,  bus_size_t , uint8_=
t *);
    +int generic_bs_peek_2(void *, bus_space_handle_t,  bus_size_t , uint16=
_t *);
    +int generic_bs_peek_4(void *, bus_space_handle_t,  bus_size_t , uint32=
_t *);
    +int generic_bs_peek_8(void *, bus_space_handle_t,  bus_size_t , uint64=
_t *);
    +
    +int generic_bs_poke_1(void *, bus_space_handle_t,  bus_size_t, uint8_t=
);
    +int generic_bs_poke_2(void *, bus_space_handle_t,  bus_size_t, uint16_=
t);
    +int generic_bs_poke_4(void *, bus_space_handle_t,  bus_size_t, uint32_=
t);
    +int generic_bs_poke_8(void *, bus_space_handle_t,  bus_size_t, uint64_=
t);
    +
     static int
     generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
         bus_space_handle_t *bshp)
    @@ -223,6 +233,18 @@ struct bus_space memmap_bus =3D {
     	.bs_wr_2_s =3D NULL,
     	.bs_wr_4_s =3D NULL,
     	.bs_wr_8_s =3D NULL,
    +
    +	/* peek */
    +	.bs_peek_1 =3D generic_bs_peek_1,
    +	.bs_peek_2 =3D generic_bs_peek_2,
    +	.bs_peek_4 =3D generic_bs_peek_4,
    +	.bs_peek_8 =3D generic_bs_peek_8,
    +
    +	/* poke */
    +	.bs_poke_1 =3D generic_bs_poke_1,
    +	.bs_poke_2 =3D generic_bs_poke_2,
    +	.bs_poke_4 =3D generic_bs_poke_4,
    +	.bs_poke_8 =3D generic_bs_poke_8,
     };

     #ifdef FDT

    Modified: head/sys/arm64/arm64/bus_space_asm.S
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/arm64/arm64/bus_space_asm.S	Sat Sep 19 02:15:56 2020	(r365=
898)
    +++ head/sys/arm64/arm64/bus_space_asm.S	Sat Sep 19 11:06:41 2020	(r365=
899)
    @@ -26,7 +26,6 @@
      */

     #include <machine/asm.h>
    -
     __FBSDID("$FreeBSD$");

     ENTRY(generic_bs_r_1)
    @@ -397,3 +396,84 @@ ENTRY(generic_bs_wr_8)

     2:	ret
     END(generic_bs_wr_8)
    +
    +ENTRY(generic_bs_fault)
    +	mov	x0, #-1
    +	ret
    +END(bus_fault)
    +
    +ENTRY(generic_bs_peek_1)
    +	.globl	generic_bs_peek_1f
    +generic_bs_peek_1f:
    +	ldrb	w0, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	strb	w0,[x3]
    +	mov	x0, #0
    +	ret
    +END(generic_bs_peek_1)
    +
    +ENTRY(generic_bs_peek_2)
    +	.globl	generic_bs_peek_2f
    +generic_bs_peek_2f:
    +	ldrh	w0, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	strh	w0,[x3]
    +	mov	x0, #0
    +	ret
    +END(generic_bs_peek_2)
    +
    +ENTRY(generic_bs_peek_4)
    +	.globl	generic_bs_peek_4f
    +generic_bs_peek_4f:
    +	ldr	w0, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	str	w0,[x3]
    +	mov	x0, #0
    +	ret
    +END(generic_bs_peek_4)
    +
    +ENTRY(generic_bs_peek_8)
    +	.globl	generic_bs_peek_8f
    +generic_bs_peek_8f:
    +	ldr	x0, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	str	x0,[x3]
    +	mov	x0, #0
    +	ret
    +END(generic_bs_peek_8)
    +
    +ENTRY(generic_bs_poke_1)
    +	.globl	generic_bs_poke_1f
    +generic_bs_poke_1f:
    +	strb	w3, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	mov	x0, #0
    +	ret
    +END(generic_bs_poke_1)
    +
    +ENTRY(generic_bs_poke_2)
    +	.globl	generic_bs_poke_2f
    +generic_bs_poke_2f:
    +	strh	w3, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	mov	x0, #0
    +	ret
    +END(generic_bs_poke_2)
    +
    +ENTRY(generic_bs_poke_4)
    +	.globl	generic_bs_poke_4f
    +generic_bs_poke_4f:
    +	str	w3, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	mov	x0, #0
    +	ret
    +END(generic_bs_poke_4)
    +
    +ENTRY(generic_bs_poke_8)
    +	.globl	generic_bs_poke_8f
    +generic_bs_poke_8f:
    +	str	x3, [x1, x2]	/* Checked instruction */
    +	dsb	sy
    +	mov	x0, #0
    +	ret
    +END(generic_bs_poke_8)

    Modified: head/sys/arm64/arm64/trap.c
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/arm64/arm64/trap.c	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/arm64/arm64/trap.c	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
     #include <vm/vm_extern.h>

     #include <machine/frame.h>
    +#include <machine/md_var.h>
     #include <machine/pcb.h>
     #include <machine/pcpu.h>
     #include <machine/undefined.h>
    @@ -88,6 +89,7 @@ typedef void (abort_handler)(struct thread *, struct =
t

     static abort_handler align_abort;
     static abort_handler data_abort;
    +static abort_handler external_abort;

     static abort_handler *abort_handlers[] =3D {
     	[ISS_DATA_DFSC_TF_L0] =3D data_abort,
    @@ -101,6 +103,7 @@ static abort_handler *abort_handlers[] =3D {
     	[ISS_DATA_DFSC_PF_L2] =3D data_abort,
     	[ISS_DATA_DFSC_PF_L3] =3D data_abort,
     	[ISS_DATA_DFSC_ALIGN] =3D align_abort,
    +	[ISS_DATA_DFSC_EXT] =3D  external_abort,
     };

     static __inline void
    @@ -154,6 +157,28 @@ cpu_fetch_syscall_args(struct thread *td)

     #include "../../kern/subr_syscall.c"

    +/*
    + * Test for fault generated by given access instruction in
    + * bus_peek_<foo> or bus_poke_<foo> bus function.
    + */
    +extern uint32_t generic_bs_peek_1f, generic_bs_peek_2f;
    +extern uint32_t generic_bs_peek_4f, generic_bs_peek_8f;
    +extern uint32_t generic_bs_poke_1f, generic_bs_poke_2f;
    +extern uint32_t generic_bs_poke_4f, generic_bs_poke_8f;
    +
    +static bool
    +test_bs_fault(void *addr)
    +{
    +	return (addr =3D=3D &generic_bs_peek_1f ||
    +	    addr =3D=3D &generic_bs_peek_2f ||
    +	    addr =3D=3D &generic_bs_peek_4f ||
    +	    addr =3D=3D &generic_bs_peek_8f ||
    +	    addr =3D=3D &generic_bs_poke_1f ||
    +	    addr =3D=3D &generic_bs_poke_2f ||
    +	    addr =3D=3D &generic_bs_poke_4f ||
    +	    addr =3D=3D &generic_bs_poke_8f);
    +}
    +
     static void
     svc_handler(struct thread *td, struct trapframe *frame)
     {
    @@ -182,6 +207,26 @@ align_abort(struct thread *td, struct trapframe *f=
rame
     	call_trapsignal(td, SIGBUS, BUS_ADRALN, (void *)frame->tf_elr,
     	    ESR_ELx_EXCEPTION(frame->tf_esr));
     	userret(td, frame);
    +}
    +
    +
    +static void
    +external_abort(struct thread *td, struct trapframe *frame, uint64_t es=
r,
    +    uint64_t far, int lower)
    +{
    +
    +	/*
    +	 * Try to handle synchronous external aborts caused by
    +	 * bus_space_peek() and/or bus_space_poke() functions.
    +	 */
    +	if (!lower && test_bs_fault((void *)frame->tf_elr)) {
    +		frame->tf_elr =3D (uint64_t)generic_bs_fault;
    +		return;
    +	}
    +
    +	print_registers(frame);
    +	printf(" far: %16lx\n", far);
    +	panic("Unhandled EL%d external data abort", lower ? 0: 1);
     }

     static void

    Modified: head/sys/arm64/include/bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/arm64/include/bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/arm64/include/bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -259,6 +259,24 @@ struct bus_space {
     			    bus_size_t, const u_int32_t *, bus_size_t);
     	void		(*bs_wr_8_s) (void *, bus_space_handle_t,
     			    bus_size_t, const u_int64_t *, bus_size_t);
    +	/* peek */
    +	int		(*bs_peek_1)(void *, bus_space_handle_t,
    +			    bus_size_t , uint8_t *);
    +	int		(*bs_peek_2)(void *, bus_space_handle_t,
    +			    bus_size_t , uint16_t *);
    +	int		(*bs_peek_4)(void *, bus_space_handle_t,
    +			    bus_size_t , uint32_t *);
    +	int		(*bs_peek_8)(void *, bus_space_handle_t,
    +			    bus_size_t , uint64_t *);
    +	/* poke */
    +	int		(*bs_poke_1)(void *, bus_space_handle_t,
    +			   bus_size_t, uint8_t);
    +	int		(*bs_poke_2)(void *, bus_space_handle_t,
    +			   bus_size_t, uint16_t);
    +	int		(*bs_poke_4)(void *, bus_space_handle_t,
    +			   bus_size_t, uint32_t);
    +	int		(*bs_poke_8)(void *, bus_space_handle_t,
    +			   bus_size_t, uint64_t);
     };

     /*
    @@ -283,6 +301,10 @@ struct bus_space {
     	(*(t)->__bs_opname_s(r,sz))((t)->bs_cookie, h, o)
     #define	__bs_ws_s(sz, t, h, o, v)					\
     	(*(t)->__bs_opname_s(w,sz))((t)->bs_cookie, h, o, v)
    +#define	__bs_peek(sz, t, h, o, vp)					\
    +	(*(t)->__bs_opname(peek, sz))((t)->bs_cookie, h, o, vp)
    +#define	__bs_poke(sz, t, h, o, v)					\
    +	(*(t)->__bs_opname(poke, sz))((t)->bs_cookie, h, o, v)
     #define	__bs_nonsingle_s(type, sz, t, h, o, a, c)			\
     	(*(t)->__bs_opname_s(type,sz))((t)->bs_cookie, h, o, a, c)

    @@ -456,6 +478,22 @@ struct bus_space {
     	__bs_copy(4, t, h1, o1, h2, o2, c)
     #define	bus_space_copy_region_8(t, h1, o1, h2, o2, c)				\
     	__bs_copy(8, t, h1, o1, h2, o2, c)
    +
    +/*
    + * Poke (checked write) operations.
    + */
    +#define	bus_space_poke_1(t, h, o, v)	__bs_poke(1, (t), (h), (o), (v))
    +#define	bus_space_poke_2(t, h, o, v)	__bs_poke(2, (t), (h), (o), (v))
    +#define	bus_space_poke_4(t, h, o, v)	__bs_poke(4, (t), (h), (o), (v))
    +#define	bus_space_poke_8(t, h, o, v)	__bs_poke(8, (t), (h), (o), (v))
    +
    +/*
    + * Peek (checked read) operations.
    + */
    +#define	bus_space_peek_1(t, h, o, vp)	__bs_peek(1, (t), (h), (o), (vp)=
)
    +#define	bus_space_peek_2(t, h, o, vp)	__bs_peek(2, (t), (h), (o), (vp)=
)
    +#define	bus_space_peek_4(t, h, o, vp)	__bs_peek(4, (t), (h), (o), (vp)=
)
    +#define	bus_space_peek_8(t, h, o, vp)	__bs_peek(8, (t), (h), (o), (vp)=
)

     #endif


    Modified: head/sys/arm64/include/md_var.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/arm64/include/md_var.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/arm64/include/md_var.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -48,5 +48,14 @@ void busdma_swi(void);
     void dump_add_page(vm_paddr_t);
     void dump_drop_page(vm_paddr_t);
     int minidumpsys(struct dumperinfo *);
    +void generic_bs_fault(void) __asm(__STRING(generic_bs_fault));
    +void generic_bs_peek_1(void) __asm(__STRING(generic_bs_peek_1));
    +void generic_bs_peek_2(void) __asm(__STRING(generic_bs_peek_2));
    +void generic_bs_peek_4(void) __asm(__STRING(generic_bs_peek_4));
    +void generic_bs_peek_8(void) __asm(__STRING(generic_bs_peek_8));
    +void generic_bs_poke_1(void) __asm(__STRING(generic_bs_poke_1));
    +void generic_bs_poke_2(void) __asm(__STRING(generic_bs_poke_2));
    +void generic_bs_poke_4(void) __asm(__STRING(generic_bs_poke_4));
    +void generic_bs_poke_8(void) __asm(__STRING(generic_bs_poke_8));

     #endif /* !_MACHINE_MD_VAR_H_ */

    Modified: head/sys/kern/subr_csan.c
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/kern/subr_csan.c	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/kern/subr_csan.c	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -878,3 +878,33 @@ CSAN_BUS_SET_FUNC(multi_stream, 8, uint64_t)
     CSAN_BUS_SET_FUNC(region_stream, 8, uint64_t)
     #endif
     #endif
    +
    +#define CSAN_BUS_PEEK_FUNC(width, type)					\
    +	int kcsan_bus_space_peek_##width(bus_space_tag_t tag,		\
    +	    bus_space_handle_t hnd, bus_size_t offset, type *value)	\
    +	{								\
    +		kcsan_access((uintptr_t)value, sizeof(type), true, false, \
    +		    __RET_ADDR);					\
    +		return (bus_space_peek_##width(tag, hnd, offset, value)); \
    +	}
    +
    +CSAN_BUS_PEEK_FUNC(1, uint8_t)
    +CSAN_BUS_PEEK_FUNC(2, uint16_t)
    +CSAN_BUS_PEEK_FUNC(4, uint32_t)
    +#if !defined(__i386__)
    +CSAN_BUS_PEEK_FUNC(8, uint64_t)
    +#endif
    +
    +#define CSAN_BUS_POKE_FUNC(width, type)					\
    +	int kcsan_bus_space_poke_##width(bus_space_tag_t tag,		\
    +	    bus_space_handle_t hnd, bus_size_t offset, type value)	\
    +	{								\
    +		return (bus_space_poke_##width(tag, hnd, offset, value)); \
    +	}
    +
    +CSAN_BUS_POKE_FUNC(1, uint8_t)
    +CSAN_BUS_POKE_FUNC(2, uint16_t)
    +CSAN_BUS_POKE_FUNC(4, uint32_t)
    +#if !defined(__i386__)
    +CSAN_BUS_POKE_FUNC(8, uint64_t)
    +#endif

    Modified: head/sys/mips/include/bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/mips/include/bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/mips/include/bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -689,6 +689,33 @@ void	__bs_c(f,_bs_c_8) (void *t, bus_space_handle_=
t bs
     	bs_c_4_proto(f);			\
     	bs_c_8_proto(f);

    +#define BUS_PEEK_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_peek_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type *value)	\
    +	{								\
    +		type tmp;						\
    +		tmp =3D bus_space_read_##width(tag, hnd, offset);		\
    +		return (0);						\
    +	}
    +BUS_PEEK_FUNC(1, uint8_t)
    +BUS_PEEK_FUNC(2, uint16_t)
    +BUS_PEEK_FUNC(4, uint32_t)
    +BUS_PEEK_FUNC(8, uint64_t)
    +
    +#define BUS_POKE_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_poke_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type value)	\
    +	{								\
    +		bus_space_write_##width(tag, hnd, offset, value);	\
    +		return (0); 						\
    +	}
    +BUS_POKE_FUNC(1, uint8_t)
    +BUS_POKE_FUNC(2, uint16_t)
    +BUS_POKE_FUNC(4, uint32_t)
    +BUS_POKE_FUNC(8, uint64_t)
    +
     #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)

     #define BUS_SPACE_MAXADDR_24BIT	0xFFFFFF

    Modified: head/sys/powerpc/include/bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/powerpc/include/bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/powerpc/include/bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -462,6 +462,33 @@ extern struct bus_space bs_le_tag;
     	__bs_copy(s_8, t, h1, o1, h2, o2, c)
     #endif

    +#define BUS_PEEK_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_peek_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type *value)	\
    +	{								\
    +		type tmp;						\
    +		tmp =3D bus_space_read_##width(tag, hnd, offset);		\
    +		return (0);						\
    +	}
    +BUS_PEEK_FUNC(1, uint8_t)
    +BUS_PEEK_FUNC(2, uint16_t)
    +BUS_PEEK_FUNC(4, uint32_t)
    +BUS_PEEK_FUNC(8, uint64_t)
    +
    +#define BUS_POKE_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_poke_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type value)	\
    +	{								\
    +		bus_space_write_##width(tag, hnd, offset, value);	\
    +		return (0); 						\
    +	}
    +BUS_POKE_FUNC(1, uint8_t)
    +BUS_POKE_FUNC(2, uint16_t)
    +BUS_POKE_FUNC(4, uint32_t)
    +BUS_POKE_FUNC(8, uint64_t)
    +
     #include <machine/bus_dma.h>

     #endif /* _MACHINE_BUS_H_ */

    Modified: head/sys/riscv/include/bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/riscv/include/bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/riscv/include/bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -451,6 +451,33 @@ struct bus_space {
     #define	bus_space_copy_region_8(t, h1, o1, h2, o2, c)				\
     	__bs_copy(8, t, h1, o1, h2, o2, c)

    +#define BUS_PEEK_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_peek_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type *value)	\
    +	{								\
    +		type tmp;						\
    +		tmp =3D bus_space_read_##width(tag, hnd, offset);		\
    +		return (0);						\
    +	}
    +BUS_PEEK_FUNC(1, uint8_t)
    +BUS_PEEK_FUNC(2, uint16_t)
    +BUS_PEEK_FUNC(4, uint32_t)
    +BUS_PEEK_FUNC(8, uint64_t)
    +
    +#define BUS_POKE_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_poke_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type value)	\
    +	{								\
    +		bus_space_write_##width(tag, hnd, offset, value);	\
    +		return (0); 						\
    +	}
    +BUS_POKE_FUNC(1, uint8_t)
    +BUS_POKE_FUNC(2, uint16_t)
    +BUS_POKE_FUNC(4, uint32_t)
    +BUS_POKE_FUNC(8, uint64_t)
    +
     #include <machine/bus_dma.h>

     #endif /* _MACHINE_BUS_H_ */

    Modified: head/sys/sys/_cscan_bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/sys/_cscan_bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/sys/_cscan_bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -77,11 +77,21 @@
     	    bus_space_handle_t,	bus_size_t, bus_space_handle_t,		\
     	    bus_size_t, bus_size_t);

    +#define	KCSAN_BS_PEEK(width, type)					\
    +	int kcsan_bus_space_peek_##width(bus_space_tag_t, 		\
    +	    bus_space_handle_t, bus_size_t, type *);
    +
    +#define	KCSAN_BS_POKE(width, type)					\
    +	int kcsan_bus_space_poke_##width(bus_space_tag_t, 		\
    +	    bus_space_handle_t, bus_size_t, type);
    +
     #define	KCSAN_BS(width, type)						\
     	KCSAN_BS_READ(width, type);					\
     	KCSAN_BS_WRITE(width, type);					\
     	KCSAN_BS_SET(width, type);					\
    -	KCSAN_BS_COPY(width, type)
    +	KCSAN_BS_COPY(width, type)					\
    +	KCSAN_BS_PEEK(width, type);					\
    +	KCSAN_BS_POKE(width, type);

     KCSAN_BS(1, uint8_t);
     KCSAN_BS(2, uint16_t);
    @@ -127,6 +137,8 @@ void kcsan_bus_space_barrier(bus_space_tag_t, bus_s=
pac
     #define	bus_space_set_region_stream_1	kcsan_bus_space_set_region_strea=
m_1
     #define	bus_space_copy_multi_1		kcsan_bus_space_copy_multi_1
     #define	bus_space_copy_multi_stream_1	kcsan_bus_space_copy_multi_strea=
m_1
    +#define	bus_space_poke_1		kcsan_bus_space_poke_1
    +#define	bus_space_peek_1		kcsan_bus_space_peek_1

     #define	bus_space_read_2		kcsan_bus_space_read_2
     #define	bus_space_read_stream_2		kcsan_bus_space_read_stream_2
    @@ -146,6 +158,8 @@ void kcsan_bus_space_barrier(bus_space_tag_t, bus_s=
pac
     #define	bus_space_set_region_stream_2	kcsan_bus_space_set_region_strea=
m_2
     #define	bus_space_copy_multi_2		kcsan_bus_space_copy_multi_2
     #define	bus_space_copy_multi_stream_2	kcsan_bus_space_copy_multi_strea=
m_2
    +#define	bus_space_poke_2		kcsan_bus_space_poke_2
    +#define	bus_space_peek_2		kcsan_bus_space_peek_2

     #define	bus_space_read_4		kcsan_bus_space_read_4
     #define	bus_space_read_stream_4		kcsan_bus_space_read_stream_4
    @@ -165,6 +179,8 @@ void kcsan_bus_space_barrier(bus_space_tag_t, bus_s=
pac
     #define	bus_space_set_region_stream_4	kcsan_bus_space_set_region_strea=
m_4
     #define	bus_space_copy_multi_4		kcsan_bus_space_copy_multi_4
     #define	bus_space_copy_multi_stream_4	kcsan_bus_space_copy_multi_strea=
m_4
    +#define	bus_space_poke_4		kcsan_bus_space_poke_4
    +#define	bus_space_peek_4		kcsan_bus_space_peek_4

     #define	bus_space_read_8		kcsan_bus_space_read_8
     #define	bus_space_read_stream_8		kcsan_bus_space_read_stream_8
    @@ -184,6 +200,9 @@ void kcsan_bus_space_barrier(bus_space_tag_t, bus_s=
pac
     #define	bus_space_set_region_stream_8	kcsan_bus_space_set_region_strea=
m_8
     #define	bus_space_copy_multi_8		kcsan_bus_space_copy_multi_8
     #define	bus_space_copy_multi_stream_8	kcsan_bus_space_copy_multi_strea=
m_8
    +#define	bus_space_poke_8		kcsan_bus_space_poke_8
    +#define	bus_space_peek_8		kcsan_bus_space_peek_8
    +

     #endif /* !KCSAN_RUNTIME */


    Modified: head/sys/sys/bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/sys/bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/sys/bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -827,6 +827,10 @@ static __inline void varp ## _set_ ## var(device_t=
 dev

     #define bus_barrier(r, o, l, f) \
     	bus_space_barrier((r)->r_bustag, (r)->r_bushandle, (o), (l), (f))
    +#define bus_poke_1(r, o, v) \
    +	bus_space_poke_1((r)->r_bustag, (r)->r_bushandle, (o), (v))
    +#define bus_peek_1(r, o, vp) \
    +	bus_space_peek_1((r)->r_bustag, (r)->r_bushandle, (o), (vp))
     #define bus_read_1(r, o) \
     	bus_space_read_1((r)->r_bustag, (r)->r_bushandle, (o))
     #define bus_read_multi_1(r, o, d, c) \
    @@ -859,6 +863,10 @@ static __inline void varp ## _set_ ## var(device_t=
 dev
     	bus_space_write_multi_stream_1((r)->r_bustag, (r)->r_bushandle, (o), =
(d), (c))
     #define bus_write_region_stream_1(r, o, d, c) \
     	bus_space_write_region_stream_1((r)->r_bustag, (r)->r_bushandle, (o),=
 (d), (c))
    +#define bus_poke_2(r, o, v) \
    +	bus_space_poke_2((r)->r_bustag, (r)->r_bushandle, (o), (v))
    +#define bus_peek_2(r, o, vp) \
    +	bus_space_peek_2((r)->r_bustag, (r)->r_bushandle, (o), (vp))
     #define bus_read_2(r, o) \
     	bus_space_read_2((r)->r_bustag, (r)->r_bushandle, (o))
     #define bus_read_multi_2(r, o, d, c) \
    @@ -891,6 +899,10 @@ static __inline void varp ## _set_ ## var(device_t=
 dev
     	bus_space_write_multi_stream_2((r)->r_bustag, (r)->r_bushandle, (o), =
(d), (c))
     #define bus_write_region_stream_2(r, o, d, c) \
     	bus_space_write_region_stream_2((r)->r_bustag, (r)->r_bushandle, (o),=
 (d), (c))
    +#define bus_poke_4(r, o, v) \
    +	bus_space_poke_4((r)->r_bustag, (r)->r_bushandle, (o), (v))
    +#define bus_peek_4(r, o, vp) \
    +	bus_space_peek_4((r)->r_bustag, (r)->r_bushandle, (o), (vp))
     #define bus_read_4(r, o) \
     	bus_space_read_4((r)->r_bustag, (r)->r_bushandle, (o))
     #define bus_read_multi_4(r, o, d, c) \
    @@ -923,6 +935,10 @@ static __inline void varp ## _set_ ## var(device_t=
 dev
     	bus_space_write_multi_stream_4((r)->r_bustag, (r)->r_bushandle, (o), =
(d), (c))
     #define bus_write_region_stream_4(r, o, d, c) \
     	bus_space_write_region_stream_4((r)->r_bustag, (r)->r_bushandle, (o),=
 (d), (c))
    +#define bus_poke_8(r, o, v) \
    +	bus_space_poke_8((r)->r_bustag, (r)->r_bushandle, (o), (v))
    +#define bus_peek_8(r, o, vp) \
    +	bus_space_peek_8((r)->r_bustag, (r)->r_bushandle, (o), (vp))
     #define bus_read_8(r, o) \
     	bus_space_read_8((r)->r_bustag, (r)->r_bushandle, (o))
     #define bus_read_multi_8(r, o, d, c) \

    Modified: head/sys/tools/bus_macro.sh
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/tools/bus_macro.sh	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/tools/bus_macro.sh	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -55,7 +55,8 @@ for w in 1 2 4 8
     do
     	# macro copy_region_$w so dh do c
     	# macro copy_region_stream_$w ?
    -	# macro peek_$w
    +	macro poke_$w o v
    +	macro peek_$w o vp
     	for s in "" stream_
     	do
     		macro read_$s$w o

    Modified: head/sys/x86/include/bus.h
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D
    --- head/sys/x86/include/bus.h	Sat Sep 19 02:15:56 2020	(r365898)
    +++ head/sys/x86/include/bus.h	Sat Sep 19 11:06:41 2020	(r365899)
    @@ -1089,6 +1089,31 @@ bus_space_barrier(bus_space_tag_t tag __unused, =
bus_sp
     #define	bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \
     	bus_space_copy_region_4((t), (h1), (o1), (h2), (o2), (c))

    +#define BUS_PEEK_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_peek_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type *value)	\
    +	{								\
    +		type tmp;						\
    +		tmp =3D bus_space_read_##width(tag, hnd, offset);		\
    +		return (0);						\
    +	}
    +BUS_PEEK_FUNC(1, uint8_t)
    +BUS_PEEK_FUNC(2, uint16_t)
    +BUS_PEEK_FUNC(4, uint32_t)
    +
    +#define BUS_POKE_FUNC(width, type)					\
    +	static inline int						\
    +	bus_space_poke_##width(bus_space_tag_t tag,			\
    +	    bus_space_handle_t hnd, bus_size_t offset, type value)	\
    +	{								\
    +		bus_space_write_##width(tag, hnd, offset, value);	\
    +		return (0); 						\
    +	}
    +BUS_POKE_FUNC(1, uint8_t)
    +BUS_POKE_FUNC(2, uint16_t)
    +BUS_POKE_FUNC(4, uint32_t)
    +
     #endif /* KCSAN && !KCSAN_RUNTIME */

     #endif /* _X86_BUS_H_ */





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4D257266-3703-4513-9301-33E03F9FF9BE>