[e16e8f2] | 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 |
---|