Date: Tue, 27 Sep 2005 17:52:36 -0700 From: Nate Lawson <nate@root.org> To: Pranav Peshwe <pranavpeshwe@gmail.com> Cc: freebsd-acpi@freebsd.org Subject: Re: Implementing 'Software suspend in FreeBSD' as a final year project. Message-ID: <4339E954.6040603@root.org> In-Reply-To: <004401c5bb4f$27e31090$0201a8c0@pranav> References: <004401c5bb4f$27e31090$0201a8c0@pranav>
next in thread | previous in thread | raw e-mail | index | archive | help
Pranav Peshwe wrote: > Thanks to the replies and the information > provided, we have finally decided to implement 'Software > Suspend(S4OS) on the FreeBSD Operating System' as our final > year project. > > We have worked with the linux kernel but not that much > with the FBSD one.So,currently we do not have much knowledge > about the FBSD kernel. > Can we get any pointers as to, where we should start > from ? and which kernel subsystems will be of particular importance > to us.Also, which version of FBSD should we preferably use ? > > Any links for reading would be of immense help.We currently have for > reference,the book 'The Design and Implementation of the FreeBSD(v5.2) > Operating System' - Marshall Kirk McKusick, George V. Neville-Neil I'm glad someone is taking a cut at this. It is a somewhat difficult task you are taking on so I hope you are prepared. 1. Read the suspend/resume sections (S4 in particular) of the ACPI spec: http://acpi.info 2. Review the source code and email list archives for Linux software suspend 2: http://www.suspend2.net There are two means of achieving this. S4 requires ACPI while software suspend does not. You should implement the latter first since it is useful on non-x86 platforms and without ACPI. S4 depends on a working software suspend anyway. First, your goal is to get the system suspended to an image on disk. One easy way to do this is to overload the kernel dump system to write the system image to swap. Relevant source is here: http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/sys/kern/kern_shutdown.c?rev=1.176 The dumpsys() function calls a device-specific callback to perform the actual dump (i.e. sys/dev/ata, addump()). The call is this: error = (*devsw(dumpdev)->d_dump)(dumpdev); This dump function has to run in polled mode with interrupts disabled. You need to add code to dump userspace as well as kernel space, otherwise resume is not very useful. Also, you need to call the root DEVICE_SUSPEND() routine so that all devices will save their state. After you can generate a full image, the next step is resuming. You should use a different signature in the header of the saved image than the one used for kernel core dumps. For testing purposes, you may want a separate swap partition enabled separately so you can still do core dumps to debug your suspend code. Next, update the loader(8) to look for this signature in the swap file and load it at the same place as it was saved. Then, jump into an exported disk_resume() routine that calls DEVICE_RESUME() and then continues running. I'm a little unclear of all the initialization that needs to occur but you at least have to set up protected mode and a few other things that normal init performs without doing the full boot process. The most likely bug you'll run into in all this is devices that don't behave well when resumed this way. For instance, I believe the apic device does different initialization in its startup routine versus its resume routine. To avoid problems, test on the most minimally configured system you can. This should be enough to get you started. Feel free to post progress reports and questions here. -- Nate
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4339E954.6040603>