Index: sys/arch/sparc64/include/cpu.h =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/include/cpu.h,v retrieving revision 1.130 diff -u -r1.130 cpu.h --- sys/arch/sparc64/include/cpu.h 10 Mar 2020 03:49:56 -0000 1.130 +++ sys/arch/sparc64/include/cpu.h 2 Apr 2021 18:02:44 -0000 @@ -212,12 +212,14 @@ paddr_t ci_devmq; /* device mondo queue address */ paddr_t ci_cpuset; /* mondo recipient address */ paddr_t ci_mondo; /* mondo message address */ - + /* probe fault in PCI config space reads */ bool ci_pci_probe; bool ci_pci_fault; volatile void *ci_ddb_regs; /* DDB regs */ + + void (*ci_idlespin)(void); }; #endif /* _KERNEL || _KMEMUSER */ @@ -438,6 +440,9 @@ void next_tick(long); void next_stick(long); void next_stick_init(void); +#ifdef SUN4V +void cpu_idle_sun4v(void); +#endif /* trap.c */ void cpu_vmspace_exec(struct lwp *, vaddr_t, vaddr_t); int rwindow_save(struct lwp *); Index: sys/arch/sparc64/sparc64/cpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/cpu.c,v retrieving revision 1.138 diff -u -r1.138 cpu.c --- sys/arch/sparc64/sparc64/cpu.c 7 Aug 2020 14:20:08 -0000 1.138 +++ sys/arch/sparc64/sparc64/cpu.c 2 Apr 2021 18:02:44 -0000 @@ -695,8 +695,22 @@ ci->ci_cpuset = pa; pa += 64; } - + + /* + * cpu_idle setup (currently only necessary for sun4v) + */ + if (CPU_ISSUN4V) { + ci->ci_idlespin = cpu_idle_sun4v; + printf("ci->ci_idlespin = %p\n", (void*)ci->ci_idlespin); + } +} + +#ifdef SUN4V +void cpu_idle_sun4v(void) +{ + hv_cpu_yield(); } +#endif int cpu_myid(void) Index: sys/arch/sparc64/sparc64/genassym.cf =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/genassym.cf,v retrieving revision 1.84 diff -u -r1.84 genassym.cf --- sys/arch/sparc64/sparc64/genassym.cf 17 Feb 2020 09:09:49 -0000 1.84 +++ sys/arch/sparc64/sparc64/genassym.cf 2 Apr 2021 18:02:44 -0000 @@ -183,6 +183,7 @@ ifdef MULTIPROCESSOR define CI_IPIEVC offsetof(struct cpu_info, ci_ipi_evcnt[0].ev_count) endif +define CI_IDLESPIN offsetof(struct cpu_info, ci_idlespin) # CPU boot arguments structure define CBA_NODE offsetof(struct cpu_bootargs, cb_node) Index: sys/arch/sparc64/sparc64/locore.s =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/locore.s,v retrieving revision 1.426 diff -u -r1.426 locore.s --- sys/arch/sparc64/sparc64/locore.s 30 Mar 2021 20:03:14 -0000 1.426 +++ sys/arch/sparc64/sparc64/locore.s 2 Apr 2021 18:02:44 -0000 @@ -6619,11 +6619,19 @@ mov %fp, %o0 /* - * nothing MD to do in the idle loop + * Call optional cpu_idle handler if provided */ ENTRY(cpu_idle) - retl + set CPUINFO_VA, %o0 + LDPTR [%o0 + CI_IDLESPIN], %o1 + tst %o1 + bz 1f + nop + jmp %o1 nop +1: + retl + nop /* * cpu_switchto() switches to an lwp to run and runs it, saving the