|
|
1.1 root 1: /*
2: * Copyright (C) 2011 Michael Brown <[email protected]>.
3: *
4: * This program is free software; you can redistribute it and/or
5: * modify it under the terms of the GNU General Public License as
6: * published by the Free Software Foundation; either version 2 of the
7: * License, or any later version.
8: *
9: * This program is distributed in the hope that it will be useful, but
10: * WITHOUT ANY WARRANTY; without even the implied warranty of
11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12: * General Public License for more details.
13: *
14: * You should have received a copy of the GNU General Public License
15: * along with this program; if not, write to the Free Software
16: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17: *
18: */
19:
20: FILE_LICENCE ( GPL2_OR_LATER )
21:
22: /* Initial temporary stack size */
23: #define EXE_STACK_SIZE 0x400
24:
25: /* Temporary decompression area (avoid DOS high memory area) */
26: #define EXE_DECOMPRESS_ADDRESS 0x110000
27:
28: /* Fields within the Program Segment Prefix */
29: #define PSP_CMDLINE_LEN 0x80
30: #define PSP_CMDLINE_START 0x81
31:
32: .text
33: .arch i386
34: .org 0
35: .code16
36: .section ".prefix", "awx", @progbits
37:
38: signature:
39: /* "MZ" signature */
40: .ascii "MZ"
41:
42: last_block:
43: /* Number of bytes in last block that are really used */
44: .word 0
45:
46: blocks:
47: /* Number of 512-byte blocks */
48: .word 0
49: .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */
50: .ascii "ADDW"
51: .long blocks
52: .long 512
53: .long 0
54: .previous
55:
56: num_reloc:
57: /* Number of relocation entries stored after the header */
58: .word 0
59:
60: header_pgh:
61: /* Number of paragraphs in the header */
62: .word ( ( _exe_start - signature ) / 16 )
63:
64: min_bss_pgh:
65: /* Minimum number of paragraphs of additional (BSS) memory */
66: .word ( EXE_STACK_SIZE / 16 )
67:
68: max_bss_pgh:
69: /* Maximum number of paragraphs of additional (BSS) memory */
70: .word ( EXE_STACK_SIZE / 16 )
71:
72: init_ss:
73: /* Initial stack segment (relative to start of executable) */
74: .word -( ( _exe_start - signature ) / 16 )
75: .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */
76: .ascii "ADDW"
77: .long init_ss
78: .long 16
79: .long 0
80: .previous
81:
82: init_sp:
83: /* Initial stack pointer */
84: .word EXE_STACK_SIZE
85:
86: checksum:
87: /* Checksum (ignored) */
88: .word 0
89:
90: init_ip:
91: /* Initial instruction pointer */
92: .word _exe_start
93:
94: init_cs:
95: /* Initial code segment (relative to start of executable) */
96: .word -( ( _exe_start - signature ) / 16 )
97:
98: reloc_table:
99: /* Relocation table offset */
100: .word 0
101:
102: overlay:
103: /* Overlay number */
104: .word 0
105:
106: .align 16, 0
107:
108: .globl _exe_start
109: _exe_start:
110: /* Install iPXE. Use a fixed temporary decompression area to
111: * avoid trashing the DOS high memory area.
112: */
113: call alloc_basemem
114: xorl %esi, %esi
115: movl $EXE_DECOMPRESS_ADDRESS, %edi
116: clc
117: call install_prealloc
118:
119: /* Set up real-mode stack */
120: movw %bx, %ss
121: movw $_estack16, %sp
122:
123: /* Jump to .text16 segment */
124: pushw %ax
125: pushw $1f
126: lret
127: .section ".text16", "awx", @progbits
128: 1:
129: /* Terminate command line with a NUL */
130: movzbw PSP_CMDLINE_LEN, %si
131: movb $0, PSP_CMDLINE_START(%si)
132:
133: /* Calculate command line physical address */
134: xorl %esi, %esi
135: movw %ds, %si
136: shll $4, %esi
137: addl $PSP_CMDLINE_START, %esi
138:
139: /* Set up %ds for access to .data16 */
140: movw %bx, %ds
141:
142: /* Record command line address */
143: movl %esi, cmdline_phys
144:
145: /* Run iPXE */
146: pushl $main
147: pushw %cs
148: call prot_call
149: popl %ecx /* discard */
150:
151: /* Uninstall iPXE */
152: call uninstall
153:
154: /* Exit back to DOS. This is very unlikely to work */
155: movw $0x4c00, %ax
156: int $0x21
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.