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

Reply via email to