On Wed, Feb 05, 2020 at 12:46:57PM +0900, Rin Okuyama wrote: > 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).
I corrected the cpu_ast() case. Yes it's curious why ibm4xx calls mi_userret() directly; that seems wrong (I have not changed it though). I think it definitely makes more sense to deal with OWEUPC before userret(). Andrew > Thanks, > rin