| .text |
| |
| /* Originally gcc generated, modified by hand */ |
| |
| #include <linux/linkage.h> |
| #include <asm/segment.h> |
| #include <asm/page.h> |
| |
| ENTRY(do_magic) |
| pushl %ebx |
| cmpl $0,8(%esp) |
| jne .L1450 |
| call do_magic_suspend_1 |
| call save_processor_state |
| |
| movl %esp, saved_context_esp |
| movl %eax, saved_context_eax |
| movl %ebx, saved_context_ebx |
| movl %ecx, saved_context_ecx |
| movl %edx, saved_context_edx |
| movl %ebp, saved_context_ebp |
| movl %esi, saved_context_esi |
| movl %edi, saved_context_edi |
| pushfl ; popl saved_context_eflags |
| |
| call do_magic_suspend_2 |
| jmp .L1449 |
| .p2align 4,,7 |
| .L1450: |
| movl $swapper_pg_dir-__PAGE_OFFSET,%ecx |
| movl %ecx,%cr3 |
| |
| call do_magic_resume_1 |
| movl $0,loop |
| cmpl $0,nr_copy_pages |
| je .L1453 |
| .p2align 4,,7 |
| .L1455: |
| movl $0,loop2 |
| .p2align 4,,7 |
| .L1459: |
| movl pagedir_nosave,%ecx |
| movl loop,%eax |
| movl loop2,%edx |
| sall $4,%eax |
| movl 4(%ecx,%eax),%ebx |
| movl (%ecx,%eax),%eax |
| movb (%edx,%eax),%al |
| movb %al,(%edx,%ebx) |
| movl %cr3, %eax; |
| movl %eax, %cr3; # flush TLB |
| |
| movl loop2,%eax |
| leal 1(%eax),%edx |
| movl %edx,loop2 |
| movl %edx,%eax |
| cmpl $4095,%eax |
| jbe .L1459 |
| movl loop,%eax |
| leal 1(%eax),%edx |
| movl %edx,loop |
| movl %edx,%eax |
| cmpl nr_copy_pages,%eax |
| jb .L1455 |
| .p2align 4,,7 |
| .L1453: |
| movl $__USER_DS,%eax |
| |
| movw %ax, %ds |
| movw %ax, %es |
| movl saved_context_esp, %esp |
| movl saved_context_ebp, %ebp |
| movl saved_context_eax, %eax |
| movl saved_context_ebx, %ebx |
| movl saved_context_ecx, %ecx |
| movl saved_context_edx, %edx |
| movl saved_context_esi, %esi |
| movl saved_context_edi, %edi |
| call restore_processor_state |
| pushl saved_context_eflags ; popfl |
| call do_magic_resume_2 |
| .L1449: |
| popl %ebx |
| ret |
| |
| .section .data.nosave |
| loop: |
| .quad 0 |
| loop2: |
| .quad 0 |
| .previous |
| |