Fix some comments and add new comment explaining probable bug in cpu_switchto(). Not sure of a fix for it yet

This commit is contained in:
scole 2016-12-26 19:46:59 +00:00
parent ce8e005d0a
commit 90ac05fa24

View File

@ -1,4 +1,4 @@
/* $NetBSD: context.S,v 1.6 2016/08/05 16:46:56 scole Exp $ */
/* $NetBSD: context.S,v 1.7 2016/12/26 19:46:59 scole Exp $ */
/*
* Copyright (c) 2003 Marcel Moolenaar
@ -821,7 +821,7 @@ ENTRY(cpu_switchto, 3)
* Save old context, unless the LWP is exiting.
*/
cmp.eq p6,p0=r0,in0 // p6 = (in0 == 0)
add r14=PC_CURLWP,r13 // r2 = &ci->ci_curlwp
add r14=PC_CURLWP,r13 // r14 = &ci->ci_curlwp
;;
}
{ .mii
@ -840,7 +840,7 @@ ENTRY(cpu_switchto, 3)
nop 0
/*
* Switch to new context, if p6 == true.
* We assum to return to restorectx_return_here for swapped context.
* We assume to return to restorectx_return_here for swapped context.
*/
(p6) ld8 out0=[r3] // out0 = pcb of &newlwp
(p6) br.call.sptk.many rp=restorectx // if (p6) restorectx(out0)
@ -855,7 +855,25 @@ ENTRY(cpu_switchto, 3)
br.call.sptk.many rp=swapctx
;;
}
/*
* XXX seems to be a bug here...
*
* swapctx() and restorectx() (which is called by swapctx())
* both adjust the bspstore (and hence bsp) registers. When
* returning to "restorectx_return_here:" the bspstore can
* be greater than bsp, a state known as an "Incomplete Register Frame".
*
* That is not necessarily fatal in itself, but apparently the RSE
* engine sets bsp=bspstore to adjust, which re-syncs the stacked
* registers (r32-r127). This clobbers our local registers below
* (loc0 and loc1) on the br return from swapctx(), and you get all
* kind of mysterious exceptions depeding on what gets restored from
* the backing store.
*
* Not sure of a proper fix is yet or how cpu_switchto should/can
* be interacting with restorectx()/swapctx()
*
*/
restorectx_return_here:
{ .mib
mov r8=r9 // r8(ret0) = oldlwp