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 159