[build] Kill off the multiple-object-per-source-file mechanism
[people/asdlkf/gpxe.git] / src / arch / i386 / core / etherboot.prefix.lds
1 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
2 OUTPUT_ARCH(i386)
3
4 ENTRY(_prefix_start)
5 SECTIONS {
6         /* Prefix */
7         .prefix : {
8                 _verbatim_start = . ;
9                 _prefix_start = . ;
10                 *(.prefix)
11                 . = ALIGN(16);
12                 _prefix_end = . ;
13         } = 0x9090
14         _prefix_size = _prefix_end - _prefix_start;
15
16         .text.nocompress : {
17                 *(.prefix.udata)
18         } = 0x9090
19
20         decompress_to = . ;
21         .prefix.zdata : {
22                 _compressed = . ;
23                 *(.prefix.zdata)
24                 _compressed_end = . ;
25         }
26         _compressed_size = _compressed_end - _compressed;
27
28         . = ALIGN(16);
29         _verbatim_end = . ;
30
31
32         /* Size of the core of etherboot in memory */
33         _base_size = _end - _text;
34
35         /* _prefix_size is the length of the non-core etherboot prefix */
36         _prefix_size = _prefix_end - _prefix_start;
37
38         /* _verbatim_size is the actual amount that has to be copied to base memory */
39         _verbatim_size = _verbatim_end - _verbatim_start;
40
41         /* _image_size is the amount of base memory needed to run */
42         _image_size = _base_size +  _prefix_size;
43
44         /* Standard sizes rounded up to paragraphs */
45         _prefix_size_pgh   = (_prefix_size + 15) / 16;
46         _verbatim_size_pgh = (_verbatim_size + 15) / 16;
47         _image_size_pgh    = (_image_size + 15) / 16 ;
48         
49         /* Standard sizes in sectors */
50         _prefix_size_sct   = (_prefix_size + 511) / 512;
51         _verbatim_size_sct = (_verbatim_size + 511) / 512;
52         _image_size_sct    = (_image_size + 511) / 512;
53
54         /* Symbol offsets and sizes for the exe prefix */
55         _exe_hdr_size   = 32;
56         _exe_size       = _verbatim_size; /* Should this be - 32 to exclude the header? */
57         _exe_size_tail  = (_exe_size) % 512;
58         _exe_size_pages = ((_exe_size) + 511) / 512;
59         _exe_bss_size   = ((_image_size - _verbatim_size) + 15) / 16;
60         _exe_ss_offset  = (_stack_offset + _prefix_size - _exe_hdr_size + 15) / 16 ;
61
62         /* This is where we copy the compressed image before decompression.
63          * Prepare to decompress in place.  The end mark is about 8.25 bytes long,
64          * and the worst case symbol is about 16.5 bytes long.  Therefore
65          * We need to reserve at least 25 bytes of slack here.  
66          * Currently I reserve 2048 bytes of just slack to be safe :)
67          * 2048 bytes easily falls within the BSS (the defualt stack is 4096 bytes)
68          * so we really are decompressing in place.
69          * 
70          * Hmm. I missed a trick.  In the very worst case (no compression)
71          * the encoded data is 9/8 the size as it started out so to be completely
72          * safe I need to be 1/8 of the uncompressed code size past the end.
73          * This will still fit compfortably into our bss in any conceivable scenario.
74          */
75         _compressed_copy = _edata + _prefix_size  - _compressed_size +
76                 /* The amount to overflow _edata */
77                 MAX( ((_edata - _text + 7) / 8) , 2016 ) + 32; 
78         _assert = ASSERT( ( _compressed_copy - _prefix_size ) < _ebss , "Cannot decompress in place" ) ; 
79
80         decompress = DEFINED(decompress) ? decompress : 0;
81         /DISCARD/ : {
82                 *(.comment)
83                 *(.note)
84         }
85
86         /* Symbols used by the prefixes whose addresses are inconvinient 
87          * to compute, at runtime in the code.
88          */
89         image_basemem_size = DEFINED(image_basemem_size)? image_basemem_size : 65536;
90         image_basemem      = DEFINED(image_basemem)?     image_basemem : 65536;
91         _prefix_real_to_prot          = _real_to_prot         + _prefix_size ;
92         _prefix_prot_to_real          = _prot_to_real         + _prefix_size ;
93         _prefix_image_basemem_size    = image_basemem_size    + _prefix_size ;
94         _prefix_image_basemem         = image_basemem         + _prefix_size ;
95         _prefix_rm_in_call            = _rm_in_call           + _prefix_size ;
96         _prefix_in_call               = _in_call              + _prefix_size ;
97         _prefix_rom                   = rom                   + _prefix_size ;
98         _prefix_rm_etherboot_location = rm_etherboot_location + _prefix_size ;
99         _prefix_stack_end             = _stack_end            + _prefix_size ;
100 }