xref: /dflybsd-src/stand/boot/pc32/bootasm.h (revision 479ab7f0492f2a51b48e8537e4f1dc686fc6014b)
1*479ab7f0SSascha Wildner /*
2*479ab7f0SSascha Wildner  * Copyright (c) 2004 The DragonFly Project.  All rights reserved.
3*479ab7f0SSascha Wildner  *
4*479ab7f0SSascha Wildner  * This code is derived from software contributed to The DragonFly Project
5*479ab7f0SSascha Wildner  * by Matthew Dillon <dillon@backplane.com>
6*479ab7f0SSascha Wildner  *
7*479ab7f0SSascha Wildner  * Redistribution and use in source and binary forms, with or without
8*479ab7f0SSascha Wildner  * modification, are permitted provided that the following conditions
9*479ab7f0SSascha Wildner  * are met:
10*479ab7f0SSascha Wildner  *
11*479ab7f0SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
12*479ab7f0SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
13*479ab7f0SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
14*479ab7f0SSascha Wildner  *    notice, this list of conditions and the following disclaimer in
15*479ab7f0SSascha Wildner  *    the documentation and/or other materials provided with the
16*479ab7f0SSascha Wildner  *    distribution.
17*479ab7f0SSascha Wildner  * 3. Neither the name of The DragonFly Project nor the names of its
18*479ab7f0SSascha Wildner  *    contributors may be used to endorse or promote products derived
19*479ab7f0SSascha Wildner  *    from this software without specific, prior written permission.
20*479ab7f0SSascha Wildner  *
21*479ab7f0SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22*479ab7f0SSascha Wildner  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23*479ab7f0SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24*479ab7f0SSascha Wildner  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25*479ab7f0SSascha Wildner  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26*479ab7f0SSascha Wildner  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27*479ab7f0SSascha Wildner  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28*479ab7f0SSascha Wildner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29*479ab7f0SSascha Wildner  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30*479ab7f0SSascha Wildner  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31*479ab7f0SSascha Wildner  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*479ab7f0SSascha Wildner  * SUCH DAMAGE.
33*479ab7f0SSascha Wildner  *
34*479ab7f0SSascha Wildner  * $DragonFly: src/sys/boot/pc32/bootasm.h,v 1.4 2004/07/27 19:37:15 dillon Exp $
35*479ab7f0SSascha Wildner  */
36*479ab7f0SSascha Wildner 
37*479ab7f0SSascha Wildner /*
38*479ab7f0SSascha Wildner  * Set the bootloader address set.
39*479ab7f0SSascha Wildner  *
40*479ab7f0SSascha Wildner  * UNSET - default backwards compatible boot blocks
41*479ab7f0SSascha Wildner  *   1   - experimental move addresses above 0x1000 and hardwire the user
42*479ab7f0SSascha Wildner  *	   stack.
43*479ab7f0SSascha Wildner  *   2   - experimental move addresses abobe 0x2000 and hardwire the user
44*479ab7f0SSascha Wildner  *	   stack.
45*479ab7f0SSascha Wildner  *      NOTE: some changes to the standard bootloader address set and the
46*479ab7f0SSascha Wildner  *            rest of the code are not reflected in the experimental sets
47*479ab7f0SSascha Wildner  */
48*479ab7f0SSascha Wildner /* #define BOOT_NEWBOOTLOADER 2 */
49*479ab7f0SSascha Wildner 
50*479ab7f0SSascha Wildner /*
51*479ab7f0SSascha Wildner  * Various fixed constants that do not change
52*479ab7f0SSascha Wildner  */
53*479ab7f0SSascha Wildner 
54*479ab7f0SSascha Wildner #define BDA_MEM		0x413		/* Free memory		*/
55*479ab7f0SSascha Wildner #define BDA_SCR		0x449		/* Video mode		*/
56*479ab7f0SSascha Wildner #define BDA_POS		0x450		/* Cursor position	*/
57*479ab7f0SSascha Wildner #define BDA_BOOT	0x472		/* Boot howto flag	*/
58*479ab7f0SSascha Wildner #define BDA_NHRDRV	0x475		/* Number of drivers found by BIOS */
59*479ab7f0SSascha Wildner #define BDA_KEYBOARD	0x496		/* BDA byte with keyboard bit */
60*479ab7f0SSascha Wildner 
61*479ab7f0SSascha Wildner /*
62*479ab7f0SSascha Wildner  * Structural equivalences
63*479ab7f0SSascha Wildner  */
64*479ab7f0SSascha Wildner #define BOOTINFO_SIZE	0x48		/* bootinfo structure size */
65*479ab7f0SSascha Wildner #define MEM_ARG_SIZE	0x18
66*479ab7f0SSascha Wildner #define MEM_PAGE_SIZE	0x1000
67*479ab7f0SSascha Wildner #define MEM_BTX_LDR_OFF	MEM_PAGE_SIZE	/* offset of btx in the loader */
68*479ab7f0SSascha Wildner #define USR_ARGOFFSET	(BOOTINFO_SIZE+MEM_ARG_SIZE)
69*479ab7f0SSascha Wildner 
70*479ab7f0SSascha Wildner /* -------- WARNING, BOOT0 STACK BELOW MEM_BIOS_LADDR -------- */
71*479ab7f0SSascha Wildner #define MEM_BIOS_LADDR	0x7c00		/* Load address (static/BIOS) */
72*479ab7f0SSascha Wildner 
73*479ab7f0SSascha Wildner /*
74*479ab7f0SSascha Wildner  * This is the origin of boot2.bin relative to the BTX user address space
75*479ab7f0SSascha Wildner  * (e.g. physical address would be MEM_BTX_USR+BOOT2_VORIGIN).
76*479ab7f0SSascha Wildner  *
77*479ab7f0SSascha Wildner  * The physical origin is typically around 0xC000 and limits the size of
78*479ab7f0SSascha Wildner  * boot2 to 16K, otherwise the loader will overflow the segment in v86 mode.
79*479ab7f0SSascha Wildner  */
80*479ab7f0SSascha Wildner #define BOOT2_VORIGIN	0x2000
81*479ab7f0SSascha Wildner 
82*479ab7f0SSascha Wildner /*
83*479ab7f0SSascha Wildner  * NOTE: BOOT0_ORIGIN is extracted from this file and used in boot0/Makefile
84*479ab7f0SSascha Wildner  * 	 BOOT1_ORIGIN is extracted from this file and used in boot2/Makefile
85*479ab7f0SSascha Wildner  *
86*479ab7f0SSascha Wildner  *	 NOTE: boot0 has a variable space after its sector which contains
87*479ab7f0SSascha Wildner  *	 the fake partition and other variables.  ~128 bytes should be reserved
88*479ab7f0SSascha Wildner  *	 for this variable space, but it may overlap BOOT1's data space.
89*479ab7f0SSascha Wildner  */
90*479ab7f0SSascha Wildner 
91*479ab7f0SSascha Wildner #if !defined(BOOT_NEWBOOTLOADER)
92*479ab7f0SSascha Wildner 
93*479ab7f0SSascha Wildner /************************************************************************
94*479ab7f0SSascha Wildner  *			STANDARD BOOTLOADER ADDRESS SET 		*
95*479ab7f0SSascha Wildner  ************************************************************************
96*479ab7f0SSascha Wildner  *
97*479ab7f0SSascha Wildner  *
98*479ab7f0SSascha Wildner  */
99*479ab7f0SSascha Wildner 
100*479ab7f0SSascha Wildner #define USR_ARGSPACE	0x1000		/* BTX loader / ttl argspace reserved */
101*479ab7f0SSascha Wildner 
102*479ab7f0SSascha Wildner #define BOOT0_ORIGIN	0x600		/* boot0 relocated to (512+128 bytes) */
103*479ab7f0SSascha Wildner /* -------- WARNING, BOOT1 STACK BELOW BOOT1_ORIGIN ------- */
104*479ab7f0SSascha Wildner #define BOOT1_ORIGIN	0x700		/* boot1 relocated to (512 bytes) */
105*479ab7f0SSascha Wildner #define MEM_ARG		0x900		/* tmp arg store cdboot/pxeboot */
106*479ab7f0SSascha Wildner 
107*479ab7f0SSascha Wildner #define MEM_BTX_ESP	0x1000		/* btxldr top of stack? */
108*479ab7f0SSascha Wildner #define MEM_BTX_START	0x1000		/* start of BTX memory */
109*479ab7f0SSascha Wildner #define MEM_BTX_ESP0	0x1800		/* Supervisor stack */
110*479ab7f0SSascha Wildner #define MEM_BTX_BUF	0x1800		/* Scratch buffer stack */
111*479ab7f0SSascha Wildner #define MEM_BTX_ESPR	0x5e00		/* Real mode stack */
112*479ab7f0SSascha Wildner #define MEM_BTX_IDT	0x5e00		/* IDT */
113*479ab7f0SSascha Wildner #define MEM_BTX_TSS	0x5f98		/* TSS */
114*479ab7f0SSascha Wildner #define MEM_BTX_MAP	0x6000		/* I/O bit map */
115*479ab7f0SSascha Wildner #define MEM_BTX_TSS_END	0x7fff		/* Start of user memory */
116*479ab7f0SSascha Wildner 
117*479ab7f0SSascha Wildner /*
118*479ab7f0SSascha Wildner  * NOTE: page table location is hardwired in /usr/src/usr.sbin/btxld/btx.h
119*479ab7f0SSascha Wildner  */
120*479ab7f0SSascha Wildner #define MEM_BTX_ZEND	0x7000		/* Zero from IDT to here in btx.S */
121*479ab7f0SSascha Wildner 
122*479ab7f0SSascha Wildner /********************   0x7c00 BIOS LOAD ADDRESS (512 bytes) **********/
123*479ab7f0SSascha Wildner 
124*479ab7f0SSascha Wildner /*
125*479ab7f0SSascha Wildner  * NOTE: BOOT2_LOAD_BUF also determines where the btx loader and boot2.bin
126*479ab7f0SSascha Wildner  *       code are loaded, since they are all in the boot2 file.
127*479ab7f0SSascha Wildner  */
128*479ab7f0SSascha Wildner #define BOOT2_LOAD_BUF	0x8c00		/* boot1 loads boot2	*/
129*479ab7f0SSascha Wildner #define MEM_BTX_ORG	0x9000		/* base of BTX code */
130*479ab7f0SSascha Wildner #define MEM_BTX_ENTRY	0x9010		/* BTX starts execution here */
131*479ab7f0SSascha Wildner /*
132*479ab7f0SSascha Wildner  * WARNING!  The USR area may be messed around with in 16 bit code mode,
133*479ab7f0SSascha Wildner  *           data loaded should probably not cross 0xffff (e.g. boot2 loads
134*479ab7f0SSascha Wildner  *	     ~8K at MEM_BTX_USR).
135*479ab7f0SSascha Wildner  *
136*479ab7f0SSascha Wildner  *	     MEM_BTX_USR is basically the segment offset BTX uses when
137*479ab7f0SSascha Wildner  *	     running 'client' code.  So address 0 in the client code will
138*479ab7f0SSascha Wildner  *	     actually be physical address MEM_BTX_USR.
139*479ab7f0SSascha Wildner  */
140*479ab7f0SSascha Wildner #define MEM_BTX_USR	0xa000		/* base of BTX client/user memory */
141*479ab7f0SSascha Wildner #define MEM_BTX_USR_ARG	0xa100
142*479ab7f0SSascha Wildner 
143*479ab7f0SSascha Wildner /*
144*479ab7f0SSascha Wildner  * By default the user stack is (theoretically) placed at the top of
145*479ab7f0SSascha Wildner  * BIOS memory (typically around the 640K mark).  See btx.S.  BTX loads
146*479ab7f0SSascha Wildner  * the stack from a BIOS memory address (BDA_MEM) rather than figuring it
147*479ab7f0SSascha Wildner  * out from the smap.
148*479ab7f0SSascha Wildner  *
149*479ab7f0SSascha Wildner  * There aren't really any other places we can put it short of intruding on
150*479ab7f0SSascha Wildner  * the kernel/module load space.
151*479ab7f0SSascha Wildner  */
152*479ab7f0SSascha Wildner /*#define MEM_BTX_USR_STK	0x3000000*/
153*479ab7f0SSascha Wildner /*#define MEM_BTX_USR_STK	0x0F0000*/
154*479ab7f0SSascha Wildner 
155*479ab7f0SSascha Wildner #elif defined(BOOT_NEWBOOTLOADER) && BOOT_NEWBOOTLOADER == 1
156*479ab7f0SSascha Wildner 
157*479ab7f0SSascha Wildner /************************************************************************
158*479ab7f0SSascha Wildner  *		EXPERIMENTAL BOOTLOADER ADDRESS SET 1			*
159*479ab7f0SSascha Wildner  ************************************************************************
160*479ab7f0SSascha Wildner  *
161*479ab7f0SSascha Wildner  *
162*479ab7f0SSascha Wildner  */
163*479ab7f0SSascha Wildner 
164*479ab7f0SSascha Wildner #define USR_ARGSPACE	0x1000		/* BTX loader / ttl argspace reserved */
165*479ab7f0SSascha Wildner #define MEM_BTX_USR_STK	0x90000		/* (phys addr) btx client usr stack */
166*479ab7f0SSascha Wildner 
167*479ab7f0SSascha Wildner #define MEM_BTX_START	0x1000		/* (unchanged)		*/
168*479ab7f0SSascha Wildner #define MEM_BTX_ESP0	0x1800		/* (unchanged)		*/
169*479ab7f0SSascha Wildner #define MEM_BTX_BUF	0x1800		/* (unchanged)		*/
170*479ab7f0SSascha Wildner #define MEM_BTX_ESP1	0x1e00		/* (unchanged)		*/
171*479ab7f0SSascha Wildner #define MEM_BTX_IDT	0x1e00		/* (unchanged)		*/
172*479ab7f0SSascha Wildner #define MEM_BTX_TSS	0x1f98		/* (unchanged)		*/
173*479ab7f0SSascha Wildner #define MEM_BTX_MAP	0x2000		/* (unchanged)		*/
174*479ab7f0SSascha Wildner #define MEM_BTX_DIR	0x4000		/* (unchanged)		*/
175*479ab7f0SSascha Wildner #define MEM_BTX_TBL	0x5000		/* (unchanged)		*/
176*479ab7f0SSascha Wildner #define MEM_BTX_ZEND	0x7000		/* (unchanged)		*/
177*479ab7f0SSascha Wildner 
178*479ab7f0SSascha Wildner #define MEM_BTX_ESP	0x7800		/* don't use 0x1000 		*/
179*479ab7f0SSascha Wildner #define BOOT0_ORIGIN	0x7800		/* boot0 relocated		*/
180*479ab7f0SSascha Wildner #define BOOT1_ORIGIN	0x7900		/* boot1 relocated (data only?) */
181*479ab7f0SSascha Wildner #define MEM_ARG		0x7b00		/* cdboot/pxeboot disk/slice xfer */
182*479ab7f0SSascha Wildner /********************   0x7c00 BIOS LOAD ADDRESS (512 bytes) **********/
183*479ab7f0SSascha Wildner 
184*479ab7f0SSascha Wildner #define BOOT2_LOAD_BUF	0x8c00		/* (unchanged)		*/
185*479ab7f0SSascha Wildner #define MEM_BTX_ORG	0x9000		/* (unchanged)		*/
186*479ab7f0SSascha Wildner #define MEM_BTX_ENTRY	0x9010		/* (unchanged)		*/
187*479ab7f0SSascha Wildner 
188*479ab7f0SSascha Wildner #define MEM_BTX_USR	0xa000		/* (unchanged)		*/
189*479ab7f0SSascha Wildner #define MEM_BTX_USR_ARG	0xa100		/* (unchanged)		*/
190*479ab7f0SSascha Wildner 
191*479ab7f0SSascha Wildner 
192*479ab7f0SSascha Wildner #elif defined(BOOT_NEWBOOTLOADER) && BOOT_NEWBOOTLOADER == 2
193*479ab7f0SSascha Wildner 
194*479ab7f0SSascha Wildner /************************************************************************
195*479ab7f0SSascha Wildner  *		EXPERIMENTAL BOOTLOADER ADDRESS SET 2			*
196*479ab7f0SSascha Wildner  ************************************************************************
197*479ab7f0SSascha Wildner  *
198*479ab7f0SSascha Wildner  *
199*479ab7f0SSascha Wildner  */
200*479ab7f0SSascha Wildner #define USR_ARGSPACE	0x1000		/* BTX loader / ttl argspace reserved */
201*479ab7f0SSascha Wildner #define MEM_BTX_USR_STK	0x90000		/* (phys addr) btx client usr stack */
202*479ab7f0SSascha Wildner 
203*479ab7f0SSascha Wildner #define MEM_BTX_START	0x2000		/* (unchanged)		*/
204*479ab7f0SSascha Wildner #define MEM_BTX_ESP0	0x2800		/* (unchanged)		*/
205*479ab7f0SSascha Wildner #define MEM_BTX_BUF	0x2800		/* (unchanged)		*/
206*479ab7f0SSascha Wildner #define MEM_BTX_ESP1	0x2e00		/* (unchanged)		*/
207*479ab7f0SSascha Wildner #define MEM_BTX_IDT	0x2e00		/* (unchanged)		*/
208*479ab7f0SSascha Wildner #define MEM_BTX_TSS	0x2f98		/* (unchanged)		*/
209*479ab7f0SSascha Wildner #define MEM_BTX_MAP	0x3000		/* (unchanged)		*/
210*479ab7f0SSascha Wildner #define MEM_BTX_DIR	0x5000		/* (unchanged)		*/
211*479ab7f0SSascha Wildner /****** MEM_BTX_TBL (16K) SUPPORT REMOVED ***********************/
212*479ab7f0SSascha Wildner #define MEM_BTX_ZEND	0x6000		/* (unchanged)		*/
213*479ab7f0SSascha Wildner 
214*479ab7f0SSascha Wildner #define MEM_BTX_ESP	0x7800		/* don't use 0x1000 		*/
215*479ab7f0SSascha Wildner #define BOOT0_ORIGIN	0x7800		/* boot0 relocated		*/
216*479ab7f0SSascha Wildner #define BOOT1_ORIGIN	0x7900		/* boot1 relocated (data only?) */
217*479ab7f0SSascha Wildner #define MEM_ARG		0x7b00		/* cdboot/pxeboot disk/slice xfer */
218*479ab7f0SSascha Wildner /********************   0x7c00 BIOS LOAD ADDRESS (512 bytes) **********/
219*479ab7f0SSascha Wildner 
220*479ab7f0SSascha Wildner #define BOOT2_LOAD_BUF	0x8c00		/* (unchanged)		*/
221*479ab7f0SSascha Wildner #define MEM_BTX_ORG	0x9000		/* (unchanged)		*/
222*479ab7f0SSascha Wildner #define MEM_BTX_ENTRY	0x9010		/* (unchanged)		*/
223*479ab7f0SSascha Wildner 
224*479ab7f0SSascha Wildner #define MEM_BTX_USR	0xa000		/* base of BTX client/user memory */
225*479ab7f0SSascha Wildner #define MEM_BTX_USR_ARG	0xa100		/* boot1->boot2 disk/slice xfer */
226*479ab7f0SSascha Wildner 
227*479ab7f0SSascha Wildner #else
228*479ab7f0SSascha Wildner 
229*479ab7f0SSascha Wildner #error "BAD BOOT_NEWBOOTLOADER SETTING.  UNSET TO GET DEFAULT"
230*479ab7f0SSascha Wildner 
231*479ab7f0SSascha Wildner #endif	/* BOOT_NEWBOOTLOADER */
232*479ab7f0SSascha Wildner 
233