Module Name: src Committed By: skrll Date: Sat Apr 6 10:08:54 UTC 2024
Modified Files: src/sys/arch/riscv/conf: files.riscv src/sys/arch/riscv/include: types.h src/sys/arch/riscv/riscv: genassym.cf Added Files: src/sys/arch/riscv/riscv: copy.S Log Message: Provide and use _ucas_{32,64} implementations To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/arch/riscv/conf/files.riscv cvs rdiff -u -r1.16 -r1.17 src/sys/arch/riscv/include/types.h cvs rdiff -u -r0 -r1.1 src/sys/arch/riscv/riscv/copy.S cvs rdiff -u -r1.15 -r1.16 src/sys/arch/riscv/riscv/genassym.cf Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/riscv/conf/files.riscv diff -u src/sys/arch/riscv/conf/files.riscv:1.14 src/sys/arch/riscv/conf/files.riscv:1.15 --- src/sys/arch/riscv/conf/files.riscv:1.14 Sun Sep 3 08:48:19 2023 +++ src/sys/arch/riscv/conf/files.riscv Sat Apr 6 10:08:54 2024 @@ -1,4 +1,4 @@ -# $NetBSD: files.riscv,v 1.14 2023/09/03 08:48:19 skrll Exp $ +# $NetBSD: files.riscv,v 1.15 2024/04/06 10:08:54 skrll Exp $ # maxpartitions 16 @@ -25,6 +25,7 @@ file arch/riscv/riscv/bus_space_generic. file arch/riscv/riscv/bus_space_notimpl.S file arch/riscv/riscv/bus_stubs.c file arch/riscv/riscv/clock_machdep.c +file arch/riscv/riscv/copy.S file arch/riscv/riscv/core_machdep.c coredump file arch/riscv/riscv/cpu.c cpu file arch/riscv/riscv/cpu_subr.c Index: src/sys/arch/riscv/include/types.h diff -u src/sys/arch/riscv/include/types.h:1.16 src/sys/arch/riscv/include/types.h:1.17 --- src/sys/arch/riscv/include/types.h:1.16 Sun May 7 12:41:48 2023 +++ src/sys/arch/riscv/include/types.h Sat Apr 6 10:08:54 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: types.h,v 1.16 2023/05/07 12:41:48 skrll Exp $ */ +/* $NetBSD: types.h,v 1.17 2024/04/06 10:08:54 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -98,6 +98,7 @@ typedef __int32_t __register_t; #define __HAVE_NEW_STYLE_BUS_H #define __HAVE_SYSCALL_INTERN #define __HAVE_TLS_VARIANT_I +#define __HAVE_UCAS_FULL /* XXX temporary */ #define __HAVE_UNLOCKED_PMAP #define __HAVE___LWP_GETPRIVATE_FAST Index: src/sys/arch/riscv/riscv/genassym.cf diff -u src/sys/arch/riscv/riscv/genassym.cf:1.15 src/sys/arch/riscv/riscv/genassym.cf:1.16 --- src/sys/arch/riscv/riscv/genassym.cf:1.15 Mon Jun 12 19:04:14 2023 +++ src/sys/arch/riscv/riscv/genassym.cf Sat Apr 6 10:08:54 2024 @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.15 2023/06/12 19:04:14 skrll Exp $ +# $NetBSD: genassym.cf,v 1.16 2024/04/06 10:08:54 skrll Exp $ #- # Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -148,6 +148,7 @@ define CI_MTX_COUNT offsetof(struct cpu_ define CI_MTX_OLDSPL offsetof(struct cpu_info, ci_mtx_oldspl) define CI_SOFTINTS offsetof(struct cpu_info, ci_softints) +define FB_LEN sizeof(struct faultbuf) define FB_A0 offsetof(struct faultbuf, fb_reg[FB_A0]) define FB_RA offsetof(struct faultbuf, fb_reg[FB_RA]) define FB_S0 offsetof(struct faultbuf, fb_reg[FB_S0]) @@ -165,6 +166,8 @@ define FB_S11 offsetof(struct faultbuf, define FB_SP offsetof(struct faultbuf, fb_reg[FB_SP]) define FB_SR offsetof(struct faultbuf, fb_sr) +define EFAULT EFAULT + define PAGE_SIZE PAGE_SIZE define PAGE_MASK PAGE_MASK define PAGE_SHIFT PAGE_SHIFT @@ -192,6 +195,7 @@ define RW_WRITE_LOCKED RW_WRITE_LOCKED define RW_READ_INCR RW_READ_INCR define RW_READER RW_READER +define VM_MAXUSER_ADDRESS VM_MAXUSER_ADDRESS define VM_MIN_KERNEL_ADDRESS VM_MIN_KERNEL_ADDRESS define VM_MAX_KERNEL_ADDRESS VM_MAX_KERNEL_ADDRESS define VM_KERNEL_BASE VM_KERNEL_BASE Added files: Index: src/sys/arch/riscv/riscv/copy.S diff -u /dev/null src/sys/arch/riscv/riscv/copy.S:1.1 --- /dev/null Sat Apr 6 10:08:54 2024 +++ src/sys/arch/riscv/riscv/copy.S Sat Apr 6 10:08:54 2024 @@ -0,0 +1,158 @@ +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <machine/asm.h> +#include "assym.h" + +#define UCAS_FRAME_SIZE (FB_LEN + 4 * SZREG) +#define UCAS_FRAME_A0 (UCAS_FRAME_SIZE - 4 * SZREG) +#define UCAS_FRAME_A1 (UCAS_FRAME_SIZE - 3 * SZREG) +#define UCAS_FRAME_S0 (UCAS_FRAME_SIZE - 2 * SZREG) +#define UCAS_FRAME_RA (UCAS_FRAME_SIZE - 1 * SZREG) + +.macro enter_ucas + addi sp, sp, -UCAS_FRAME_SIZE + REG_S a0, UCAS_FRAME_A0(sp) + REG_S a1, UCAS_FRAME_A1(sp) + REG_S s0, UCAS_FRAME_S0(sp) + REG_S ra, UCAS_FRAME_RA(sp) + addi s0, sp, UCAS_FRAME_SIZE +.endm + +.macro exit_ucas + REG_L s0, UCAS_FRAME_S0(sp) + REG_L ra, UCAS_FRAME_RA(sp) + addi sp, sp, UCAS_FRAME_SIZE +.endm + +.macro enter_cpu_onfault + // error = cpu_set_onfault(&fb, EFAULT); + mv a0, sp + li a1, EFAULT + call cpu_set_onfault + // if (error) goto fail; + bnez a0, 9f +.endm + +.macro exit_cpu_onfault + // curlwp->l_md.md_onfault = NULL; + REG_S zero, L_MD_ONFAULT(tp) +.endm + +.macro set_sum + // csr_sstatus_set(SR_SUM); + li t1, SR_SUM + csrs sstatus, t1 +.endm + +.macro clear_sum + // csr_sstatus_clear(SR_SUM); + li t1, SR_SUM + csrc sstatus, t1 +.endm + + +/* + * int _ucas_32(volatile uint32_t *ptr, uint32_t old, + * uint32_t new, uint32_t *ret) + * + * Implies release/acquire barriers until someone tells me + * otherwise about _ucas_32/64. + */ +ENTRY(_ucas_32) + li t0, (VM_MAXUSER_ADDRESS - 4) + bltu t0, a0, 3f + + enter_ucas + + enter_cpu_onfault + + REG_L t0, UCAS_FRAME_A0(sp) + REG_L a1, UCAS_FRAME_A1(sp) + + set_sum + +1: lr.w a0, 0(t0) /* load old value */ + bne a0, a1, 2f /* return if different */ + sc.w t1, a2, 0(t0) /* store new value */ + bnez t1, 1b /* succeed? nope, try again. */ +2: + clear_sum + + sw a0, 0(a3) + + exit_cpu_onfault + li a0, 0 // success +9: + exit_ucas + ret +3: + li a0, EFAULT + ret +END(_ucas_32) + + +/* + * int _ucas_64(volatile uint64_t *ptr, uint64_t old, + * uint64_t new, uint64_t *ret) + * + * Implies release/acquire barriers until someone tells me + * otherwise about _ucas_32/64. + */ +ENTRY(_ucas_64) + li t0, (VM_MAXUSER_ADDRESS - 8) + bltu t0, a0, 3f + + enter_ucas + + enter_cpu_onfault + + REG_L t0, (FB_LEN + 0 * SZREG)(sp) + REG_L a1, (FB_LEN + 1 * SZREG)(sp) + + set_sum + +1: lr.d a0, 0(t0) /* load old value */ + bne a1, a0, 2f /* return if different */ + sc.d t1, a2, 0(t0) /* store new value */ + bnez t1, 1b /* succeed? nope, try again. */ +2: + clear_sum + + sd a0, 0(a3) + + exit_cpu_onfault + li a0, 0 // success +9: + exit_ucas + ret +3: + li a0, EFAULT + ret +END(_ucas_64)