[intelxl] Add driver for Intel 100 Gigabit Ethernet NICs
[ipxe.git] / src / arch / i386 / core / setjmp.S
1 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
2
3         .text
4         .arch i386
5         .code32
6
7         /* Must match jmp_buf structure layout */
8         .struct 0
9 env_retaddr:    .long   0
10 env_stack:      .long   0
11 env_ebx:        .long   0
12 env_esi:        .long   0
13 env_edi:        .long   0
14 env_ebp:        .long   0
15         .previous
16
17 /*
18  * Save stack context for non-local goto
19  */
20         .globl  setjmp
21 setjmp:
22         /* Get jmp_buf pointer in %edx */
23         movl    4(%esp),%edx
24         /* Save return address */
25         movl    0(%esp),%eax
26         movl    %eax, env_retaddr(%edx)
27         /* Save stack pointer */
28         movl    %esp, env_stack(%edx)
29         /* Save other registers */
30         movl    %ebx, env_ebx(%edx)
31         movl    %esi, env_esi(%edx)
32         movl    %edi, env_edi(%edx)
33         movl    %ebp, env_ebp(%edx)
34         /* Return 0 when returning as setjmp() */
35         xorl    %eax, %eax
36         ret
37         .size   setjmp, . - setjmp
38
39 /*
40  * Non-local jump to a saved stack context
41  */
42         .globl  longjmp
43 longjmp:
44         /* Get jmp_buf pointer in %edx */
45         movl    4(%esp),%edx
46         /* Get result in %eax */
47         movl    8(%esp),%eax
48         /* Force result to non-zero */
49         testl   %eax, %eax
50         jnz     1f
51         incl    %eax
52 1:      /* Restore stack pointer */
53         movl    env_stack(%edx), %esp
54         /* Restore other registers */
55         movl    env_ebx(%edx), %ebx
56         movl    env_esi(%edx), %esi
57         movl    env_edi(%edx), %edi
58         movl    env_ebp(%edx), %ebp
59         /* Replace return address on the new stack */
60         popl    %ecx    /* discard */
61         pushl   env_retaddr(%edx)
62         /* Return to setjmp() caller */
63         ret
64         .size   longjmp, . - longjmp