On Mon, Jan 13, 2020 at 05:43:51PM +0100, Manuel Bouyer wrote: > On Mon, Jan 13, 2020 at 04:59:50PM +0100, Manuel Bouyer wrote: > > It also sets rsp and rbp. I think rbp is not set by anything else, at last > > in the Xen case. > > The different rbp value would explain why in one case we hit a KASSERT() > > in lwp_startup later. > > But I don't know what pcb_rbp contains; I couldn't find where the pcb for > > idlelwp is initialized. > > I tried the attached patch, which should set rsp/rbp as cpu_switchto() > does. It doens't cause the lwp_startup() KASSERT as calling cpu_switchto() > does; it also doesn't change the scheduler behavior.
With the patch this time -- Manuel Bouyer <bou...@antioche.eu.org> NetBSD: 26 ans d'experience feront toujours la difference --
Index: sys/arch/xen/x86/cpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/xen/x86/cpu.c,v retrieving revision 1.131 diff -u -p -u -r1.131 cpu.c --- sys/arch/xen/x86/cpu.c 23 Nov 2019 19:40:38 -0000 1.131 +++ sys/arch/xen/x86/cpu.c 13 Jan 2020 16:40:50 -0000 @@ -739,7 +739,16 @@ cpu_hatch(void *v) aprint_debug_dev(ci->ci_dev, "running\n"); - cpu_switchto(NULL, ci->ci_data.cpu_idlelwp, true); +#ifdef __x86_64__ + asm("movq %0, %%rsp" : : "r" (pcb->pcb_rsp)); + asm("movq %0, %%rbp" : : "r" (pcb->pcb_rbp)); +#else + asm("movl %0, %%esp" : : "r" (pcb->pcb_esp)); + asm("movl %0, %%ebp" : : "r" (pcb->pcb_ebp)); +#endif + KASSERT(ci->ci_curlwp == ci->ci_data.cpu_idlelwp); + + //cpu_switchto(NULL, ci->ci_data.cpu_idlelwp, true); idle_loop(NULL); KASSERT(false);