Module Name: src Committed By: skrll Date: Thu May 2 18:18:17 UTC 2024
Modified Files: src/sys/arch/riscv/include: locore.h src/sys/arch/riscv/riscv: cpu_switch.S trap.c Log Message: risc-v: fix the error code when uvm_fault fails with cpu_set_onfault Return the error from uvm_fault instead of EFAULT unconditionally when faulting with cpu_set_onfault to fix several atf tests. To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/sys/arch/riscv/include/locore.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/riscv/riscv/cpu_switch.S cvs rdiff -u -r1.25 -r1.26 src/sys/arch/riscv/riscv/trap.c 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/include/locore.h diff -u src/sys/arch/riscv/include/locore.h:1.12 src/sys/arch/riscv/include/locore.h:1.13 --- src/sys/arch/riscv/include/locore.h:1.12 Sun May 7 12:41:48 2023 +++ src/sys/arch/riscv/include/locore.h Thu May 2 18:18:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.h,v 1.12 2023/05/07 12:41:48 skrll Exp $ */ +/* $NetBSD: locore.h,v 1.13 2024/05/02 18:18:17 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -126,8 +126,8 @@ fpu_valid_p(lwp_t *l) void __syncicache(const void *, size_t); -int cpu_set_onfault(struct faultbuf *, register_t) __returns_twice; -void cpu_jump_onfault(struct trapframe *, const struct faultbuf *); +int cpu_set_onfault(struct faultbuf *) __returns_twice; +void cpu_jump_onfault(struct trapframe *, const struct faultbuf *, int); static inline void cpu_unset_onfault(void) Index: src/sys/arch/riscv/riscv/cpu_switch.S diff -u src/sys/arch/riscv/riscv/cpu_switch.S:1.5 src/sys/arch/riscv/riscv/cpu_switch.S:1.6 --- src/sys/arch/riscv/riscv/cpu_switch.S:1.5 Sun May 7 12:41:48 2023 +++ src/sys/arch/riscv/riscv/cpu_switch.S Thu May 2 18:18:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu_switch.S,v 1.5 2023/05/07 12:41:48 skrll Exp $ */ +/* $NetBSD: cpu_switch.S,v 1.6 2024/05/02 18:18:17 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -459,7 +459,7 @@ END(cpu_exception_handler) /* * int - * cpu_set_onfault(struct faultbuf *fb, register_t retval) + * cpu_set_onfault(struct faultbuf *fb) */ ENTRY_NP(cpu_set_onfault) REG_S ra, FB_RA(a0) @@ -476,7 +476,6 @@ ENTRY_NP(cpu_set_onfault) REG_S s10, FB_S10(a0) REG_S s11, FB_S11(a0) REG_S sp, FB_SP(a0) - REG_S a1, FB_A0(a0) PTR_S a0, L_MD_ONFAULT(tp) li a0, 0 ret Index: src/sys/arch/riscv/riscv/trap.c diff -u src/sys/arch/riscv/riscv/trap.c:1.25 src/sys/arch/riscv/riscv/trap.c:1.26 --- src/sys/arch/riscv/riscv/trap.c:1.25 Mon Apr 1 16:24:01 2024 +++ src/sys/arch/riscv/riscv/trap.c Thu May 2 18:18:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.25 2024/04/01 16:24:01 skrll Exp $ */ +/* $NetBSD: trap.c,v 1.26 2024/05/02 18:18:17 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ #define __PMAP_PRIVATE #define __UFETCHSTORE_PRIVATE -__RCSID("$NetBSD: trap.c,v 1.25 2024/04/01 16:24:01 skrll Exp $"); +__RCSID("$NetBSD: trap.c,v 1.26 2024/05/02 18:18:17 skrll Exp $"); #include <sys/param.h> @@ -90,10 +90,11 @@ static const char * const causenames[] = [CAUSE_STORE_PAGE_FAULT] = "store page fault", }; + void -cpu_jump_onfault(struct trapframe *tf, const struct faultbuf *fb) +cpu_jump_onfault(struct trapframe *tf, const struct faultbuf *fb, int error) { - tf->tf_a0 = fb->fb_reg[FB_A0]; + tf->tf_a0 = error; tf->tf_ra = fb->fb_reg[FB_RA]; tf->tf_s0 = fb->fb_reg[FB_S0]; tf->tf_s1 = fb->fb_reg[FB_S1]; @@ -131,7 +132,7 @@ copyin(const void *uaddr, void *kaddr, s return EFAULT; csr_sstatus_set(SR_SUM); - if ((error = cpu_set_onfault(&fb, EFAULT)) == 0) { + if ((error = cpu_set_onfault(&fb)) == 0) { memcpy(kaddr, uaddr, len); cpu_unset_onfault(); } @@ -159,7 +160,7 @@ copyout(const void *kaddr, void *uaddr, return EFAULT; csr_sstatus_set(SR_SUM); - if ((error = cpu_set_onfault(&fb, EFAULT)) == 0) { + if ((error = cpu_set_onfault(&fb)) == 0) { memcpy(uaddr, kaddr, len); cpu_unset_onfault(); } @@ -174,7 +175,7 @@ kcopy(const void *kfaddr, void *kdaddr, struct faultbuf fb; int error; - if ((error = cpu_set_onfault(&fb, EFAULT)) == 0) { + if ((error = cpu_set_onfault(&fb)) == 0) { memcpy(kdaddr, kfaddr, len); cpu_unset_onfault(); } @@ -204,7 +205,7 @@ copyinstr(const void *uaddr, void *kaddr return EFAULT; csr_sstatus_set(SR_SUM); - if ((error = cpu_set_onfault(&fb, EFAULT)) == 0) { + if ((error = cpu_set_onfault(&fb)) == 0) { retlen = strlcpy(kaddr, uaddr, len); cpu_unset_onfault(); if (retlen >= len) { @@ -240,7 +241,7 @@ copyoutstr(const void *kaddr, void *uadd return EFAULT; csr_sstatus_set(SR_SUM); - if ((error = cpu_set_onfault(&fb, EFAULT)) == 0) { + if ((error = cpu_set_onfault(&fb)) == 0) { retlen = strlcpy(uaddr, kaddr, len); cpu_unset_onfault(); if (retlen >= len) { @@ -517,7 +518,7 @@ trap_pagefault(struct trapframe *tf, reg return false; } - cpu_jump_onfault(tf, fb); + cpu_jump_onfault(tf, fb, error); return true; } @@ -672,7 +673,7 @@ fetch_user_data(const void *uaddr, void if (__predict_false(uva > VM_MAXUSER_ADDRESS - size)) return EFAULT; - if ((error = cpu_set_onfault(&fb, EFAULT)) != 0) + if ((error = cpu_set_onfault(&fb)) != 0) return error; csr_sstatus_set(SR_SUM); @@ -737,7 +738,7 @@ store_user_data(void *uaddr, const void if (__predict_false(uva > VM_MAXUSER_ADDRESS - size)) return EFAULT; - if ((error = cpu_set_onfault(&fb, EFAULT)) != 0) + if ((error = cpu_set_onfault(&fb)) != 0) return error; csr_sstatus_set(SR_SUM);