12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- /* We need a real mode stack that won't be stomped on by Etherboot
- which starts at 0x20000. Choose something that's sufficiently high,
- but not in DOC territory. Note that we couldn't do this in a real
- .com program since stack variables are in the same segment as the
- code and data, but this isn't really a .com program, it just looks
- like one to make DOS load it into memory. It still has the 64kB
- limitation of .com files though. */
- #define STACK_SEG 0x7000
- #define STACK_SIZE 0x4000
-
- .text
- .code16
- .arch i386
- .section ".prefix", "ax", @progbits
-
- /* Cheat a little with the relocations: .COM files are loaded at 0x100 */
- _prefix:
- /* Set up temporary stack */
- movw $STACK_SEG, %ax
- movw %ax, %ss
- movw $STACK_SIZE, %sp
-
- pushl $0 /* No parameters to preserve for exit path */
- pushw $0 /* Dummy return address - use prefix_exit */
-
- /* Calculate segment address of image start */
- pushw %cs
- popw %ax
- addw $(0x100/16), %ax
- pushw %ax
- pushw $_start
- /* Calculated lcall to _start with %cs:0000 = image start */
- lret
-
- .section ".text16", "ax", @progbits
- prefix_exit:
- movw $0x4c00,%ax /* return to DOS */
- int $0x21 /* reach this on Quit */
- prefix_exit_end:
- .previous
-
- /* The body of etherboot is attached here at build time.
- * Force 16 byte alignment
- */
- .align 16,0
- _body:
|