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


.global memory_call_interruption_routine,call_device_driver,reload_cr3 
memory_call_interruption_routine: 
	pushl %ebp 
	movl %gs,%ebp 
	pushl %ebp 
	movl %fs,%ebp 
	pushl %ebp 
	movl %es,%ebp 
	pushl %ebp 
	movl %ds,%ebp 
	pushl %ebp 
 
	movl %ss,%ebp 
	movl %ebp,%ds 
	movl %ebp,%es 
	movl %ebp,%fs 
	movl %ebp,%gs 
 
	pushl %ebp 
	pushl %edi 
	pushl %esi 
	pushl %edx 
	pushl %ecx 
	pushl %ebx 
	pushl %eax 
 
	pushl %esp 
	call memory_call_process 
	pushl %eax 
 
	cmpl $(0x00),reload_cr3_flag 
	je 1f 
	movl $(0x00),reload_cr3_flag 
	movl %cr3,%eax 
	movl %eax,%cr3 
1: 
	popl %eax 
	popl %ebx 
	popl %ebx 
	popl %ebx 
	popl %ecx 
	popl %edx 
	popl %esi 
	popl %edi 
	popl %ebp 
 
	popl %ebp 
	movl %ebp,%ds 
	popl %ebp 
	movl %ebp,%es 
	popl %ebp 
	movl %ebp,%fs 
	popl %ebp 
	movl %ebp,%gs 
 
	popl %ebp 
 
	iret 
 
call_device_driver: 
	movl %esp,%ebx 
	movl 0x08(%ebx),%esp 
	addl $(0xffc),%esp 
	pushfl 
	sti 
	pushl %ebx 
	pushl 0x08(%ebx) 
	call *0x04(%ebx) 
	popl %ebx 
	popl %ebx 
	popfl 
	movl %ebx,%esp 
	ret 
 reload_cr3: 
	movl %cr3,%eax 
	movl %eax,%cr3 
	ret