Date: Thu, 24 Sep 2020 11:03:31 +0200 From: Michal Meloun <meloun.michal@gmail.com> To: Ravi Pokala <rpokala@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: <302b7d21-8712-ad5e-a46d-1b38e4b14194@freebsd.org> In-Reply-To: <4D257266-3703-4513-9301-33E03F9FF9BE@panasas.com> References: <202009191106.08JB6fE9010167@repo.freebsd.org> <4D257266-3703-4513-9301-33E03F9FF9BE@panasas.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 22.09.2020 7:18, Ravi Pokala wrote: > This breaks amd64.GENERIC-KCSAN: I’m sorry, seems that I forgotten to run GENERIC-KCSAN build additionally to universe build also for the final version of this change. Thanks for report and sorry for troubles. Fixed in r366107. Michal > ================================================================ > ${SRCTOP}/sys/kern/subr_csan.c:895:1: error: implicit declaration of function 'bus_space_peek_8' is invalid in C99 [-Werror,-Wimplicit-function-declaration] > 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 function 'bus_space_poke_8' is invalid in C99 [-Werror,-Wimplicit-function-declaration] > 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 > ================================================================ > > Thanks, > > Ravi (rpokala@) > > -----Original Message----- > From: <owner-src-committers@freebsd.org> on behalf of Michal Meloun <mmel@FreeBSD.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() functions. > One problem with the bus_space_read_N() and 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 bus_space_peek_N() and bus_space_poke_N() family > of functions provide a mechanism to handle these exceptions gracefully > without the risk of crashing the system. > > Typical example is access to PCI(e) configuration space in bus enumeration > function on badly implemented PCI(e) root complexes (RK3399 or Neoverse > N1 N1SDP and/or access to PCI(e) register when device is in deep sleep state. > > This commit adds a real implementation for arm64 only. The remaining > architectures have bus_space_peek()/bus_space_poke() emulated by using > 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 > ============================================================================== > --- 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 size" > .Fc > +.Ft int > +.Fo bus_space_peek_1 > +.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" > +.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 offset" > +.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 offset" > +.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 offset" > +.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 offset" > +.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 offset" > +.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 offset" > +.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 offset" > +.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 offset" > @@ -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 of > +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 from > +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 specified > > Modified: head/sys/arm/include/bus.h > ============================================================================== > --- 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 = 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 > ============================================================================== > --- head/sys/arm64/arm64/bus_machdep.c Sat Sep 19 02:15:56 2020 (r365898) > +++ head/sys/arm64/arm64/bus_machdep.c Sat Sep 19 11:06:41 2020 (r365899) > @@ -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 uint64_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 = { > .bs_wr_2_s = NULL, > .bs_wr_4_s = NULL, > .bs_wr_8_s = NULL, > + > + /* peek */ > + .bs_peek_1 = generic_bs_peek_1, > + .bs_peek_2 = generic_bs_peek_2, > + .bs_peek_4 = generic_bs_peek_4, > + .bs_peek_8 = generic_bs_peek_8, > + > + /* poke */ > + .bs_poke_1 = generic_bs_poke_1, > + .bs_poke_2 = generic_bs_poke_2, > + .bs_poke_4 = generic_bs_poke_4, > + .bs_poke_8 = generic_bs_poke_8, > }; > > #ifdef FDT > > Modified: head/sys/arm64/arm64/bus_space_asm.S > ============================================================================== > --- head/sys/arm64/arm64/bus_space_asm.S Sat Sep 19 02:15:56 2020 (r365898) > +++ head/sys/arm64/arm64/bus_space_asm.S Sat Sep 19 11:06:41 2020 (r365899) > @@ -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 > ============================================================================== > --- 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[] = { > [ISS_DATA_DFSC_TF_L0] = data_abort, > @@ -101,6 +103,7 @@ static abort_handler *abort_handlers[] = { > [ISS_DATA_DFSC_PF_L2] = data_abort, > [ISS_DATA_DFSC_PF_L3] = data_abort, > [ISS_DATA_DFSC_ALIGN] = align_abort, > + [ISS_DATA_DFSC_EXT] = 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 == &generic_bs_peek_1f || > + addr == &generic_bs_peek_2f || > + addr == &generic_bs_peek_4f || > + addr == &generic_bs_peek_8f || > + addr == &generic_bs_poke_1f || > + addr == &generic_bs_poke_2f || > + addr == &generic_bs_poke_4f || > + addr == &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 *frame > 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 esr, > + 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 = (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 > ============================================================================== > --- 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 > ============================================================================== > --- 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 > ============================================================================== > --- 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 > ============================================================================== > --- 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 = 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 > ============================================================================== > --- 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 = 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 > ============================================================================== > --- 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 = 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 > ============================================================================== > --- 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_spac > #define bus_space_set_region_stream_1 kcsan_bus_space_set_region_stream_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_stream_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_spac > #define bus_space_set_region_stream_2 kcsan_bus_space_set_region_stream_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_stream_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_spac > #define bus_space_set_region_stream_4 kcsan_bus_space_set_region_stream_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_stream_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_spac > #define bus_space_set_region_stream_8 kcsan_bus_space_set_region_stream_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_stream_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 > ============================================================================== > --- 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 > ============================================================================== > --- 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 > ============================================================================== > --- 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 = 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?302b7d21-8712-ad5e-a46d-1b38e4b14194>