在 2009-05-23六的 21:30 +0900,Atsushi Nemoto写道:
On Sat, 23 May 2009 16:06:43 +0800, yanh <address@hidden> wrote:
+unsigned long
+ saved_ra,
+ saved_sp,
...
+ saved_v0,
+ saved_v1;
Instead of enumerating them, I would prefer something like "struct
pt_regs saved_regs" or "unsigned long saved_regs[32]".
This implementation is referencing the x86 platform.
Not all the 32 reigsters are needed to save.
Maybe the whole registers needed to save can still be reduced.
I did not mean save/restore all registers. I just mean using only one
symbol (struct or array). Though the struct or array contains some
unused members, it saves many instructions in
swsusp_arch_{suspend,resume}.
For saving N registers, (N * 2) instructions are required to save to
individual variables, but (N + 2) instructions are required to save to
array or struct.
Yes, the struct array method is more efficient, we will change to it.
It's my mistake. But I think, if there is need to save floating point
registers, the kernel have already done for it.
What's need to save should be for the resuming parts. Those registers which are used while
in suspending path are needed to save.
create_image()
in_suspend = 1;
save_processor_state();
error = swsusp_arch_suspend();
if (error)
printk(KERN_ERR "PM: Error %d creating hibernation image\n",
error);
when resuming this functions is executed for righ after the swsusp_arch_suspend().
This is not a normal function return.
So the registers need to save are those damaged by swsusp_arch_suspend and
what it calls.
because this is not a normal function call, the callee saved registers can not be restored, so we need to save
it explicitly. For caller saved temporary registers, they are already saved in
create_image. Are this right?