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);

Reply via email to