From owner-svn-src-all@freebsd.org Tue Sep 22 05:18:07 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id DD0CD3DDA3F; Tue, 22 Sep 2020 05:18:07 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4BwV275bMDz4Wrs; Tue, 22 Sep 2020 05:18:07 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from [192.168.1.10] (unknown [IPv6:2601:641:300:6e9f:f855:39a8:132b:4210]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: rpokala) by smtp.freebsd.org (Postfix) with ESMTPSA id EB24C1799C; Tue, 22 Sep 2020 05:18:06 +0000 (UTC) (envelope-from rpokala@freebsd.org) User-Agent: Microsoft-MacOutlook/16.41.20091302 Date: Mon, 21 Sep 2020 22:18:03 -0700 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 From: Ravi Pokala To: Michal Meloun , , , Message-ID: <4D257266-3703-4513-9301-33E03F9FF9BE@panasas.com> Thread-Topic: 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 References: <202009191106.08JB6fE9010167@repo.freebsd.org> In-Reply-To: <202009191106.08JB6fE9010167@repo.freebsd.org> Mime-version: 1.0 Content-type: text/plain; charset="UTF-8" Content-transfer-encoding: quoted-printable X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Sep 2020 05:18:07 -0000 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)); \ ^ :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)); \ ^ :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: on behalf of Michal Meloun Date: 2020-09-19, Saturday at 04:06 To: , , 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 /* 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 - __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 #include +#include #include #include #include @@ -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_ or bus_poke_ 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 #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 #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_ */