• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
24BSS_START	equ 0800h
25
26; Text starts at the load address of 07C00h.
27TEXT_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
39STACK_LEN	equ 4096
40%if IS_PXELINUX
41STACK_TOP	equ 7000h
42%else
43STACK_TOP	equ 7c00h
44%endif
45STACK_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.
50LATEBSS_START	equ 0B800h
51
52;
53; 32-bit stack layout
54;
55STACK32_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
82RBFG_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
130serial_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
139core_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
149core_real_mode	resb 65536
150comboot_seg	equ real_mode_seg	; COMBOOT image loading zone
151
152;
153; At the very end, the lowmem heap
154;
155		extern __lowmem_heap
156min_lowmem_heap	equ 65536
157
158		section .text16
159