Hi,
On 2019/12/06 5:55, Andrew Doran wrote:
Module Name: src
Committed By: ad
Date: Thu Dec 5 20:55:24 UTC 2019
Modified Files:
src/sys/arch/powerpc/powerpc: powerpc_machdep.c
Log Message:
Need to call userret() from cpu_ast().
To generate a diff of this commit:
cvs rdiff -u -r1.74 -r1.75 src/sys/arch/powerpc/powerpc/powerpc_machdep.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/powerpc/powerpc/powerpc_machdep.c
diff -u src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.74
src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.75
--- src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.74 Sat Nov 23 19:40:36 2019
+++ src/sys/arch/powerpc/powerpc/powerpc_machdep.c Thu Dec 5 20:55:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: powerpc_machdep.c,v 1.74 2019/11/23 19:40:36 ad Exp $ */
+/* $NetBSD: powerpc_machdep.c,v 1.75 2019/12/05 20:55:24 ad Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.74 2019/11/23 19:40:36 ad Exp
$");
+__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.75 2019/12/05 20:55:24 ad Exp
$");
#include "opt_altivec.h"
#include "opt_ddb.h"
@@ -373,6 +373,8 @@ void
cpu_ast(struct lwp *l, struct cpu_info *ci)
{
l->l_md.md_astpending = 0; /* we are about to do it */
+ __insn_barrier();
+ userret(l, l->l_md.md_utf);
if (l->l_pflag & LP_OWEUPC) {
l->l_pflag &= ~LP_OWEUPC;
@@ -400,7 +402,7 @@ cpu_need_resched(struct cpu_info *ci, st
cpu_send_ipi(cpu_index(ci), IPI_AST);
#endif
} else {
- l->l_md.md_astpending = 1; /* force call to ast() */
+ l->l_md.md_astpending = 1; /* force call to cpu_ast() */
}
}
This commit makes userret() called twice with AST; cpu_ast() is
invoked from
booke/trap.c,
https://nxr.netbsd.org/xref/src/sys/arch/powerpc/booke/trap.c#815
ibm4xx/trap.c, and
https://nxr.netbsd.org/xref/src/sys/arch/powerpc/ibm4xx/trap.c#276
powerpc/trap.c.
https://nxr.netbsd.org/xref/src/sys/arch/powerpc/powerpc/trap.c#348
For all cases, userret() is called afterward. (Precisely speaking,
for ibm4xx, mi_userret(9) is used instead. This should probably be
replaced by userret().)
Also, other ports test (l->l_pflag & LP_OWEUPC) before mi_userret(9).
Thanks,
rin