159 lines
4.4 KiB
PHP
159 lines
4.4 KiB
PHP
; -----------------------------------------------------------------------
|
|
;
|
|
; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
|
|
; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
|
|
;
|
|
; This program is free software; you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
|
|
; Bostom MA 02111-1307, USA; either version 2 of the License, or
|
|
; (at your option) any later version; incorporated herein by reference.
|
|
;
|
|
; -----------------------------------------------------------------------
|
|
|
|
;
|
|
; layout.inc
|
|
;
|
|
; Memory layout of segments
|
|
;
|
|
|
|
; Default to 16-bit code
|
|
bits 16
|
|
|
|
; Memory below 0800h is reserved for the BIOS and the MBR.
|
|
BSS_START equ 0800h
|
|
|
|
; Text starts at the load address of 07C00h.
|
|
TEXT_START equ 7C00h
|
|
|
|
;
|
|
; 16-bit stack layout
|
|
;
|
|
; PXELINUX: There are apparently some AMI BIOSes in the field which
|
|
; put their BEV stack somewhere below 7C00h (and therefore don't
|
|
; handle localboot properly), so avoid that immediate memory region.
|
|
; The range that is known to be bad is approximately 75E8..7C00; the
|
|
; lower bound is tight.
|
|
;
|
|
global STACK_LEN, STACK_TOP, STACK_BASE
|
|
STACK_LEN equ 4096
|
|
%if IS_PXELINUX
|
|
STACK_TOP equ 7000h
|
|
%else
|
|
STACK_TOP equ 7c00h
|
|
%endif
|
|
STACK_BASE equ STACK_TOP - STACK_LEN
|
|
|
|
; The secondary BSS section, above the text; we really wish we could
|
|
; just make it follow .bcopy32 or hang off the end,
|
|
; but it doesn't seem to work that way.
|
|
LATEBSS_START equ 0B800h
|
|
|
|
;
|
|
; 32-bit stack layout
|
|
;
|
|
STACK32_LEN equ 64*1024
|
|
|
|
section .stack nobits write align=4096
|
|
resb STACK32_LEN
|
|
|
|
;
|
|
; The various sections and their relationship
|
|
;
|
|
; Use .earlybss for things that MUST be in low memory.
|
|
section .earlybss nobits write
|
|
section .config write progbits align=4
|
|
section .replacestub exec write progbits align=16
|
|
section .gentextnr exec write nobits align=16
|
|
section .stack16 write nobits align=16
|
|
|
|
; Use .bss16 for things that doesn't have to be in low memory;
|
|
; .earlybss should be used for things that absolutely have
|
|
; to be below 0x7c00.
|
|
section .bss16 write nobits align=16
|
|
|
|
%if 0 ; IS_PXELINUX
|
|
; Warning here: RBFG build 22 randomly overwrites
|
|
; memory location [0x5680,0x576c), possibly more. It
|
|
; seems that it gets confused and screws up the
|
|
; pointer to its own internal packet buffer and starts
|
|
; writing a received ARP packet into low memory.
|
|
section .rbfg write nobits
|
|
RBFG_brainfuck: resb 2048 ; Bigger than an Ethernet packet...
|
|
%endif
|
|
|
|
section .init exec write progbits align=1
|
|
section .text16 exec write progbits align=1
|
|
section .textnr exec nowrite progbits align=1
|
|
section .bcopyxx.text exec nowrite progbits align=16
|
|
section .bcopyxx.data noexec write progbits align=16
|
|
section .data16 noexec write progbits align=16
|
|
|
|
section .adv write nobits align=512
|
|
|
|
; .uibss contains bss data which is guaranteed to be
|
|
; safe to clobber during the loading of the image. This
|
|
; is because while loading the primary image we will clobber
|
|
; the spillover from the last fractional sector load.
|
|
section .uibss write nobits align=16
|
|
|
|
section .savedata write nobits align=16
|
|
|
|
; Symbols from linker script
|
|
%macro SECINFO 1
|
|
extern __%1_start, __%1_lma, __%1_end
|
|
extern __%1_len, __%1_dwords
|
|
%endmacro
|
|
SECINFO bss16
|
|
SECINFO uibss
|
|
SECINFO config
|
|
SECINFO replacestub
|
|
SECINFO bcopyxx
|
|
|
|
SECINFO pm_code
|
|
SECINFO high_clear
|
|
|
|
SECINFO bss
|
|
|
|
extern free_high_memory
|
|
|
|
global _start
|
|
|
|
section .text16
|
|
|
|
;
|
|
; Segment assignments in the bottom 640K
|
|
; Keep the low-memory footprint as small as possible... overrun is a hard
|
|
; failure!
|
|
;
|
|
|
|
serial_buf_size equ 4096 ; Should be a power of 2
|
|
|
|
;
|
|
; Transfer buffer segment: guaranteed to be aligned 64K, used for disk I/O
|
|
; One symbol for the segment number, one for the absolute address
|
|
;
|
|
extern xfer_buf_seg
|
|
section .xfer_buf write nobits align=65536
|
|
global core_xfer_buf:data hidden
|
|
core_xfer_buf resb 65536
|
|
|
|
;
|
|
; Segment for the real mode code (needed as long as we have a in-kernel
|
|
; loader and/or COM16 support.
|
|
; One symbol for the segment number, one for the absolute address
|
|
;
|
|
extern real_mode_seg
|
|
section .real_mode write nobits align=65536
|
|
global core_real_mode:data hidden
|
|
core_real_mode resb 65536
|
|
comboot_seg equ real_mode_seg ; COMBOOT image loading zone
|
|
|
|
;
|
|
; At the very end, the lowmem heap
|
|
;
|
|
extern __lowmem_heap
|
|
min_lowmem_heap equ 65536
|
|
|
|
section .text16
|