On Saturday, July 07, 2012 at 1:31 PM David Brownlee wrote: > On 7 July 2012 20:36, Mark Pizzolato - Info Comm <[email protected]> > wrote: > > On Saturday, July 07, 2012 at 9:33 AM, Gregg Levine wrote: > >> On 7 July 2012 07:00, Gregg Levine <[email protected]> wrote: > >> > Hello! > >> > Was the throttle function included as part of this release of > SIMH? I > >> > finally managed to get NetBSD/VAX installed, but it managed to > corral > >> > the entire workload of the host at 100% of the CPU. > >> > > >> > I want to throttle it back to about 75%. > >> > >> Alternatively if there is a specific pattern which would be best for > >> simh to detect idle it should be easy enough to adjust NetBSD's idle > >> loop to match... > > > > Hi there, > > > > I'm maintaining the SIMH vax simulator which, for many, has become > the replacement for physical vax hardware as more aging hardware just > stops working, or folks are merely interested in virtualizing the > activities which they've been using vax systems for. > > > > I have recently revisited the simh vax simulator's support for > detecting guest OS being in an idle state, and completely reimplemented > what had been done in the past. The prior implementation may have > caught the transition into the idle state, but any simulator device's > polling could easily take it out of the idle state. The current > implementation reliably detects that a guest OS is IN an idle state not > merely the transition to it. > > > > We've got this concept working for all of the "Legacy" operating > systems (Legacy meaning old and unchanging). Meanwhile, the BSD > derived operating systems (NetBSD and OpenBSD) still provide vax > architecture support and hence are moving targets. Over time, NetBSD > and OpenBSD have internally adjusted what the concept of what/how to > idle things as support for multi-core systems and systems with low > power states have been implemented. For the vax architecture, what had > been done while the OS was idle in the early BSD days has changed. > > > > Idle support in the simulator is achieved by detecting some condition > which is unique to when a system is actually idling. For some OSes > (i.e. older versions of NetBSD) this involves things like a particular > instruction (TSTL), executing in low core system space (8000000- > 80003FFF), on the interrupt stack, with a 6 byte TSTL instruction with > a zero status (this was previously visible in subr.S). That pattern is > no longer correct for probably many versions of NetBSD. When I trace > instructions executed I can't find a unique pattern which is only done > while idling. So, I dug through the source to try and found how things > are done now and currently there is no platform specific code in the > vax idle path (in kern_idle.c\idle_loop()) . There is a platform > specific "cpu_idle()" macro defined in > usr/src/sys/arch/vax/include/cpu.h which expands to nothing in the > current code ("#define cpu_idle() do {} while (/*CONSCOND*/0)" ). To > provide a unique pattern which simh can detect, this macro could be > changed to: > > > > #define cpu_idle() do { _splset(splx(1)); } while > (/*CONSCOND*/0) > > > > This would give me a unique pattern to detect NetBSD guest OS idling > (i.e. setting IPL to 1 (which is otherwise unused in current versions > of NetBSD)). Meanwhile, this code wouldn't hurt anything when run on > real vax hardware, and it wouldn't affect any platform independent code > (i.e. kern_idle.c). > > > > I've added detection of this pattern when the simulator is configured > for NetBSD Idle detection to the codebase of the simh vax simulator. > > > > What would it take for this change, or something like it, be added to > the NetBSD source forward? > > I really should have checked the -current source tree before my > initial response... > > It appears that the latest commit to sys/arch/vax/include/cpu.h on > NetBSD-current was: > > revision 1.94 > date: 2012/02/27 15:50:48; author: matt; state: Exp; lines: +13 -2 > Change cpu_idle to be an inline which sets IPL to 1 and then back to 0 > so simh can recognize the kernel is idle. > > which set cpu_idle to > > static inline void > cpu_idle(void) > { > int ipl = mfpr(PR_IPL); > mtpr(1, PR_IPL); > mtpr(ipl, PR_IPL); > } > > I'm assuming the switching of IPL to 1 and then immediately back is OK > for simh in this situation - could you confirm?
This is exactly the goal. IPL 1 is not used anywhere in the NetBSD kernel so this the transition to IPL 1 can be used as the idle trigger for that OS. This is equivalent to the suggested macro change. > Assuming so I can submit a pullup of this change into the netbsd-6 > branch so it will make the NetBSD-6 release, and potentially submit it > into the netbsd-5 and even netbsd-4 branches so anyone building from > the head of those branches can also benefit. Please do. Thanks. - Mark Pizzolato _______________________________________________ Simh mailing list [email protected] http://mailman.trailing-edge.com/mailman/listinfo/simh
