Re: [PATCH -mm] kexec jump -v9

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2008-05-14 at 16:52 -0400, Vivek Goyal wrote:[...]> Ok, I have done some testing on this patch. Currently I have just> tested switching back and forth between two kernels and it is working for> me.
Thanks.
[...]> > +/*> > + * Entry point for jumping back from kexeced kernel, the paging is> > + * turned off.> > + */> > +kexec_jump_back_entry:> > +	call	1f> > +1:> > +	popl	%ebx> > +	subl	$(1b - kexec_relocate_page), %ebx> > +	movl	%edi, KJUMP_ENTRY_OFF(%ebx)> > +	movl	CP_VA_CONTROL_PAGE(%ebx), %edi> > +	lea	STACK_TOP(%ebx), %esp> > +	movl	CP_PA_SWAP_PAGE(%ebx), %eax> > +	movl	CP_PA_BACKUP_PAGES_MAP(%ebx), %edx> > +	pushl	%eax> > +	pushl	%edx> > +	call	swap_pages> > +	addl	$8, %esp> > +	movl	CP_PA_PGD(%ebx), %eax> > +	movl	%eax, %cr3> > +	movl	%cr0, %eax> > +	orl	$(1<<31), %eax> > +	movl	%eax, %cr0> > +	lea	STACK_TOP(%edi), %esp> > +	movl	%edi, %eax> > +	addl	$(virtual_mapped - kexec_relocate_page), %eax> > +	pushl	%eax> > +	ret> > Upon re-entering the kernel, what happens to GDT table? So gdtr will be> pointing to GDT of other kernel (which is not there as pages have been> swapped)? Do we need to reload the gdtr upon re-entering the kernel.
After re-entering the kernel and returning from machine_kexec,restore_processor_state() is called, where the GDTR and some other CPUstate such as FPU, IDT, etc are restored.
> [..]> > @@ -197,8 +282,54 @@ identity_mapped:> >  	xorl	%eax, %eax> >  	movl	%eax, %cr3> >  > > +	movl	CP_PA_SWAP_PAGE(%edi), %eax> > +	pushl	%eax> > +	pushl	%ebx> > +	call	swap_pages> > +	addl	$8, %esp> > +> > +	/* To be certain of avoiding problems with self-modifying code> > +	 * I need to execute a serializing instruction here.> > +	 * So I flush the TLB, it's handy, and not processor dependent.> > +	 */> > +	xorl	%eax, %eax> > +	movl	%eax, %cr3> > +> > +	/* set all of the registers to known values */> > +	/* leave %esp alone */> > +> > +	movl	KJUMP_MAGIC_OFF(%edi), %eax> > +	cmpl	$KJUMP_MAGIC_NUMBER, %eax> > +	jz 1f> > +	xorl	%edi, %edi> > +	xorl	%eax, %eax> > +	xorl	%ebx, %ebx> > +	xorl    %ecx, %ecx> > +	xorl    %edx, %edx> > +	xorl    %esi, %esi> > +	xorl    %ebp, %ebp> > +	ret> > +1:> > +	popl	%edx> > +	movl	CP_PA_SWAP_PAGE(%edi), %esp> > +	addl	$PAGE_SIZE_asm, %esp> > +	pushl	%edx> > +2:> > +	call	*%edx> > > +	movl	%edi, %edx> > +	popl	%edi> > +	pushl	%edx> > +	jmp	2b> > +> > What does above piece of code do? Looks like redundant for switching> between the kernels? After call *%edx, we never return here. Instead> we come back to "kexec_jump_back_entry"?
For switching between the kernels, this is redundant. Originally anotherfeature of kexec jump is to call some code in physical mode. This isused to provide a C ABI to called code.
Now, Eric suggests to use a C ABI compatible mode to pass the jump backentry point too, that is, use the return address on stack instead of %edi. I think that is reasonable. Maybe we can revise this code to becompatible with C ABI and provide a convenient interface for both kerneland other physical mode code.
> [..]> > --- /dev/null> > +++ b/Documentation/i386/jump_back_protocol.txt> > @@ -0,0 +1,66 @@> > +		THE LINUX/I386 JUMP BACK PROTOCOL> > +		---------------------------------> > +> > +		Huang Ying <ying.huang@xxxxxxxxx>> > +		    Last update 2007-12-19> > +> > +Currently, the following versions of the jump back protocol exist.> > +> > +Protocol 1.00:	Jumping between original kernel and kexeced kernel> > +		support. Calling ordinary C function support.> > +> > +> > +*** JUMP BACK ENTRY> > +> > +At jump back entry of callee, the CPU must be in 32-bit protected mode> > +with paging disabled; the CS, DS, ES and SS must be 4G flat segments;> > +CS must have execute/read permission, and DS, ES and SS must have> > +read/write permission; interrupt must be disabled; the contents of> > +registers and corresponding memory must be as follow:> > +> > +Offset/Size	Meaning> > +> > +%edi		Real jump back entry of caller if supported,> > +		otherwise 0.> > +%esp		Stack top pointer, the size of stack is about 4k bytes.> > +(%esp)/4	Helper jump back entry of caller if %edi != 0,> > +		otherwise undefined.> > +> > I am not sure what is helper jump back entry? I understand that you > are using %edi to pass around entry point between two kernels. Can> you please shed some more light on this?
Helper jump back entry is used to provide a C ABI to some physical modecode other than kernel. It is the above redundant code.
Best Regards,Huang Ying
_______________________________________________linux-pm mailing listlinux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx://lists.linux-foundation.org/mailman/listinfo/linux-pm


[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux