8be8db770b5afa146b36d02b1b646d574f967286
[people/xl0/gpxe.git] / src / arch / i386 / prefix / comprefix.S
1 /* We need a real mode stack that won't be stomped on by Etherboot
2    which starts at 0x20000. Choose something that's sufficiently high,
3    but not in DOC territory. Note that we couldn't do this in a real
4    .com program since stack variables are in the same segment as the
5    code and data, but this isn't really a .com program, it just looks
6    like one to make DOS load it into memory. It still has the 64kB
7    limitation of .com files though. */
8 #define STACK_SEG       0x7000
9 #define STACK_SIZE      0x4000
10
11         .text
12         .code16
13         .arch i386
14         .section ".prefix", "ax", @progbits
15         .globl _prefix
16
17 /* Cheat a little with the relocations: .COM files are loaded at 0x100 */
18 _prefix:
19         /* Set up temporary stack */ 
20         movw    $STACK_SEG, %ax
21         movw    %ax, %ss
22         movw    $STACK_SIZE, %sp
23
24         pushl   $0      /* No parameters to preserve for exit path */
25         pushw   $0      /* Dummy return address - use prefix_exit */
26
27         /* Calculate segment address of image start */
28         pushw   %cs
29         popw    %ax
30         addw    $(0x100/16), %ax
31         pushw   %ax
32         pushw   $_start
33         /* Calculated lcall to _start with %cs:0000 = image start */
34         lret
35
36         .section ".text16", "ax", @progbits
37         .globl  prefix_exit
38 prefix_exit:
39         movw    $0x4c00,%ax             /* return to DOS */
40         int     $0x21                   /* reach this on Quit */
41         .globl  prefix_exit_end
42 prefix_exit_end:
43         .previous
44
45 /* The body of etherboot is attached here at build time.
46  * Force 16 byte alignment
47  */
48         .align 16,0
49 _body: