Hi,

2007/5/23, Bill Holler <[EMAIL PROTECTED]>:
Thomas De Schampheleire wrote:
> Hi,
>
> In uts/sun4u/os/mach_startup.c, there is a function
> mach_cpu_halt_idle() which is called from startup_end() in
> uts/sun4u/os/startup.c
>
> This function has the following contents:
>
>    385 void
>    386 mach_cpu_halt_idle()
>    387 {
>    388     if (enable_halt_idle_cpus) {
>    389         if (&cpu_halt_cpu) {
>    390             idle_cpu = cpu_halt;
>    391             disp_enq_thread = cpu_wakeup;
>    392         }
>    393     }
>    394 }
>
> The cpu_halt_cpu() function is only defined for some platforms, in
> sun4u the only one I find is "olympus".
>
> In my research project we are using a full system simulator in which
> OpenSolaris runs. I would like to make OpenSolaris believe that
> halting is possible by providing my own cpu_halt_cpu() function.
>
> If I provide such a function in a kernel module, can I then re-call
> mach_cpu_halt_idle() in order to overwrite the idle_cpu() and
> disp_enq_thread() pointers? Or will this result in panic or incorrect
> behavior?
>
No.  mach_cpu_halt_idle() should only be called in system startup
before scheduling starts.  mach_cpu_halt_idle() was not intended to
change the idle_cpu and disp_enq_thread function pointers on the fly.

*You could modify cpu_halt() and cpu_wakeup() and your new
functions to handle changing on a live system.

> If this is not possible from a module, I would like to statically add
> this cpu_halt_cpu() to the correct file in uts/sun4u/cpu/ so it is
> seen at startup. I don't know which one this would be however. I am
> simulating a serengeti machine, but there are no serengeti-specific
> files in this directory. Shall I then simply put the code in the
> us3_common files?
Later Serengeti systems have cheetah processors.  Either
uts/sun4u/cpu/us3_common* or uts/sun4u/cpu/us3_cheetah* files
should work.


>
> Just to be sure: this halt_cpu mechanism will overwrite the idle loop
> so as to halt upon idling, and wakeup when some task has to run,
> right? This halting can enable energy savings.

Yes.  I assume your new implementation will use poke_cpu() to
wake up the idle cpus with an Inter Processor Interrupt?

I'm not exactly sure why you assume this and what you mean.

The implementation of cpu_halt_cpu() in olympus is:
  1923  ENTRY_NP(cpu_halt_cpu)
  1924  .word   0x81b01040
  1925  retl
  1926  nop
  1927  SET_SIZE(cpu_halt_cpu)

I'm not exactly sure what the .word instruction does (manual says:
Generates (a sequence of) initialized words in the current segment.),
but I suppose it is used here to set some value.
What I planned was to remove that, and inside cpu_halt_cpu() use a so
called 'magic instruction' that signals a certain condition to the
simulator, and then simply return.

For the wakeup: I assumed that this would work like it is now, there
doesn't seem to be a hardware dependent function for that, right?

Thomas


Regards,
Bill Holler

> Thanks, Thomas
> _______________________________________________
> tesla-dev mailing list
> [EMAIL PROTECTED]
> http://opensolaris.org/mailman/listinfo/tesla-dev


_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to