Home | History | Annotate | Download | only in core
      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