1 | ; ----------------------------------------------------------------------- |
---|
2 | ; |
---|
3 | ; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved |
---|
4 | ; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin |
---|
5 | ; |
---|
6 | ; This program is free software; you can redistribute it and/or modify |
---|
7 | ; it under the terms of the GNU General Public License as published by |
---|
8 | ; the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
---|
9 | ; Bostom MA 02111-1307, USA; either version 2 of the License, or |
---|
10 | ; (at your option) any later version; incorporated herein by reference. |
---|
11 | ; |
---|
12 | ; ----------------------------------------------------------------------- |
---|
13 | |
---|
14 | ; |
---|
15 | ; layout.inc |
---|
16 | ; |
---|
17 | ; Memory layout of segments |
---|
18 | ; |
---|
19 | |
---|
20 | ; Default to 16-bit code |
---|
21 | bits 16 |
---|
22 | |
---|
23 | ; Memory below 0800h is reserved for the BIOS and the MBR. |
---|
24 | BSS_START equ 0800h |
---|
25 | |
---|
26 | ; Text starts at the load address of 07C00h. |
---|
27 | TEXT_START equ 7C00h |
---|
28 | |
---|
29 | ; |
---|
30 | ; 16-bit stack layout |
---|
31 | ; |
---|
32 | ; PXELINUX: There are apparently some AMI BIOSes in the field which |
---|
33 | ; put their BEV stack somewhere below 7C00h (and therefore don't |
---|
34 | ; handle localboot properly), so avoid that immediate memory region. |
---|
35 | ; The range that is known to be bad is approximately 75E8..7C00; the |
---|
36 | ; lower bound is tight. |
---|
37 | ; |
---|
38 | global STACK_LEN, STACK_TOP, STACK_BASE |
---|
39 | STACK_LEN equ 4096 |
---|
40 | %if IS_PXELINUX |
---|
41 | STACK_TOP equ 7000h |
---|
42 | %else |
---|
43 | STACK_TOP equ 7c00h |
---|
44 | %endif |
---|
45 | STACK_BASE equ STACK_TOP - STACK_LEN |
---|
46 | |
---|
47 | ; The secondary BSS section, above the text; we really wish we could |
---|
48 | ; just make it follow .bcopy32 or hang off the end, |
---|
49 | ; but it doesn't seem to work that way. |
---|
50 | LATEBSS_START equ 0B800h |
---|
51 | |
---|
52 | ; |
---|
53 | ; 32-bit stack layout |
---|
54 | ; |
---|
55 | STACK32_LEN equ 64*1024 |
---|
56 | |
---|
57 | section .stack nobits write align=4096 |
---|
58 | resb STACK32_LEN |
---|
59 | |
---|
60 | ; |
---|
61 | ; The various sections and their relationship |
---|
62 | ; |
---|
63 | ; Use .earlybss for things that MUST be in low memory. |
---|
64 | section .earlybss nobits write |
---|
65 | section .config write progbits align=4 |
---|
66 | section .replacestub exec write progbits align=16 |
---|
67 | section .gentextnr exec write nobits align=16 |
---|
68 | section .stack16 write nobits align=16 |
---|
69 | |
---|
70 | ; Use .bss16 for things that doesn't have to be in low memory; |
---|
71 | ; .earlybss should be used for things that absolutely have |
---|
72 | ; to be below 0x7c00. |
---|
73 | section .bss16 write nobits align=16 |
---|
74 | |
---|
75 | %if 0 ; IS_PXELINUX |
---|
76 | ; Warning here: RBFG build 22 randomly overwrites |
---|
77 | ; memory location [0x5680,0x576c), possibly more. It |
---|
78 | ; seems that it gets confused and screws up the |
---|
79 | ; pointer to its own internal packet buffer and starts |
---|
80 | ; writing a received ARP packet into low memory. |
---|
81 | section .rbfg write nobits |
---|
82 | RBFG_brainfuck: resb 2048 ; Bigger than an Ethernet packet... |
---|
83 | %endif |
---|
84 | |
---|
85 | section .init exec write progbits align=1 |
---|
86 | section .text16 exec write progbits align=1 |
---|
87 | section .textnr exec nowrite progbits align=1 |
---|
88 | section .bcopyxx.text exec nowrite progbits align=16 |
---|
89 | section .bcopyxx.data noexec write progbits align=16 |
---|
90 | section .data16 noexec write progbits align=16 |
---|
91 | |
---|
92 | section .adv write nobits align=512 |
---|
93 | |
---|
94 | ; .uibss contains bss data which is guaranteed to be |
---|
95 | ; safe to clobber during the loading of the image. This |
---|
96 | ; is because while loading the primary image we will clobber |
---|
97 | ; the spillover from the last fractional sector load. |
---|
98 | section .uibss write nobits align=16 |
---|
99 | |
---|
100 | section .savedata write nobits align=16 |
---|
101 | |
---|
102 | ; Symbols from linker script |
---|
103 | %macro SECINFO 1 |
---|
104 | extern __%1_start, __%1_lma, __%1_end |
---|
105 | extern __%1_len, __%1_dwords |
---|
106 | %endmacro |
---|
107 | SECINFO bss16 |
---|
108 | SECINFO uibss |
---|
109 | SECINFO config |
---|
110 | SECINFO replacestub |
---|
111 | SECINFO bcopyxx |
---|
112 | |
---|
113 | SECINFO pm_code |
---|
114 | SECINFO high_clear |
---|
115 | |
---|
116 | SECINFO bss |
---|
117 | |
---|
118 | extern free_high_memory |
---|
119 | |
---|
120 | global _start |
---|
121 | |
---|
122 | section .text16 |
---|
123 | |
---|
124 | ; |
---|
125 | ; Segment assignments in the bottom 640K |
---|
126 | ; Keep the low-memory footprint as small as possible... overrun is a hard |
---|
127 | ; failure! |
---|
128 | ; |
---|
129 | |
---|
130 | serial_buf_size equ 4096 ; Should be a power of 2 |
---|
131 | |
---|
132 | ; |
---|
133 | ; Transfer buffer segment: guaranteed to be aligned 64K, used for disk I/O |
---|
134 | ; One symbol for the segment number, one for the absolute address |
---|
135 | ; |
---|
136 | extern xfer_buf_seg |
---|
137 | section .xfer_buf write nobits align=65536 |
---|
138 | global core_xfer_buf:data hidden |
---|
139 | core_xfer_buf resb 65536 |
---|
140 | |
---|
141 | ; |
---|
142 | ; Segment for the real mode code (needed as long as we have a in-kernel |
---|
143 | ; loader and/or COM16 support. |
---|
144 | ; One symbol for the segment number, one for the absolute address |
---|
145 | ; |
---|
146 | extern real_mode_seg |
---|
147 | section .real_mode write nobits align=65536 |
---|
148 | global core_real_mode:data hidden |
---|
149 | core_real_mode resb 65536 |
---|
150 | comboot_seg equ real_mode_seg ; COMBOOT image loading zone |
---|
151 | |
---|
152 | ; |
---|
153 | ; At the very end, the lowmem heap |
---|
154 | ; |
---|
155 | extern __lowmem_heap |
---|
156 | min_lowmem_heap equ 65536 |
---|
157 | |
---|
158 | section .text16 |
---|