www.pudn.com > LFYOS.zip > save.s


.global save_parameter 
save_parameter:	/*save thread parameter	when enter os kernel*/ 
	pushl %edi		/*push edi,eax,ds into stack */ 
	pushl %eax 
	movl %ds,%eax 
	pushl %eax 
	 
	movl %ss,%eax		/*set segment register */ 
	movl %eax,%ds 
	movl current,%edi		/*compute where to save */ 
	cmpl $(0x00),%edi 
	jne 1f 
	movl %eax,%es 
	movl %eax,%fs 
	movl %eax,%gs 
	popl %eax 
	popl %eax 
	popl %eax 
	ret 
1:	 
	popl 0x34(%edi)			/* save ds from stack*/ 
	movl %es,%eax			/* save es */ 
	movl %eax,0x38(%edi)		 
	movl %fs,%eax			/* save fs */ 
	movl %eax,0x3c(%edi) 
	movl %gs,%eax			/* save gs */ 
	movl %eax,0x40(%edi) 
 
	popl 0x00(%edi)			/*save eax from stack*/ 
	movl %ebx,0x04(%edi)		/*save ebx */ 
	movl %ecx,0x08(%edi)		/*save ecx */ 
	movl %edx,0x0c(%edi)		/*save edx */ 
	movl %esi,0x10(%edi)		/*save esi */ 
	popl 0x14(%edi)			/*save edi from stack*/ 
	movl %ebp,0x18(%edi)		/*save ebp */ 
 
	popl %eax			/*pop return address to eax*/ 
 
	popl 0x20(%edi)			/*save eip */ 
	popl 0x24(%edi)			/*save  cs */ 
	popl 0x28(%edi)			/*save eflag*/ 
	popl 0x2c(%edi)			/*save esp */ 
	popl 0x30(%edi)			/*save ess */ 
 
	movl %esp,0x44(%edi)		/*save sp_0 */ 
 
	movl $(0x00),0x48(%edi)	 
	pushl %eax	/*pushl return address(in eax) */ 
	movl %ds,%eax 
	movl %eax,%es 
	movl %eax,%fs 
	movl %eax,%gs 
 
	ret		/*return to caller */