1*479ab7f0SSascha Wildner# $FreeBSD: src/sys/boot/i386/boot2/Makefile,v 1.47 2003/06/26 03:51:57 peter Exp $ 2*479ab7f0SSascha Wildner 3*479ab7f0SSascha WildnerBINDIR?= /boot 4*479ab7f0SSascha WildnerBINMODE= 444 5*479ab7f0SSascha WildnerCLEANFILES= boot \ 6*479ab7f0SSascha Wildner sio.o 7*479ab7f0SSascha Wildner 8*479ab7f0SSascha WildnerCSTD?= c99 9*479ab7f0SSascha Wildner 10*479ab7f0SSascha WildnerNM?= nm 11*479ab7f0SSascha WildnerNXCFLAGS= 12*479ab7f0SSascha WildnerNXLDFLAGS= 13*479ab7f0SSascha Wildner 14*479ab7f0SSascha Wildner.PATH: ${.CURDIR}/.. 15*479ab7f0SSascha Wildner.PATH: ${.CURDIR}/../../common 16*479ab7f0SSascha Wildner.PATH: ${.CURDIR}/../../../lib 17*479ab7f0SSascha Wildner.PATH: ${.CURDIR}/../../../../sys/libkern 18*479ab7f0SSascha Wildner 19*479ab7f0SSascha Wildner# A value of 0x80 enables LBA support. 20*479ab7f0SSascha WildnerB1FLAGS= 0x80 21*479ab7f0SSascha Wildner 22*479ab7f0SSascha WildnerBOOT_COMCONSOLE_PORT?= 0x3f8 23*479ab7f0SSascha WildnerBOOT_COMCONSOLE_SPEED?= 115200 24*479ab7f0SSascha WildnerB2SIOFMT?= 0x3 25*479ab7f0SSascha Wildner 26*479ab7f0SSascha Wildner.if exists(${.OBJDIR}/../btx) 27*479ab7f0SSascha WildnerBTX= ${.OBJDIR}/../btx 28*479ab7f0SSascha Wildner.else 29*479ab7f0SSascha WildnerBTX= ${.CURDIR}/../btx 30*479ab7f0SSascha Wildner.endif 31*479ab7f0SSascha Wildner 32*479ab7f0SSascha Wildner# These origins are taken from bootasm.h. 33*479ab7f0SSascha Wildner# 34*479ab7f0SSascha WildnerREL1 = `${.OBJDIR}/../asmdef/bootasmdef.nx BOOT1_ORIGIN` 35*479ab7f0SSascha WildnerREL1D = `${.OBJDIR}/../asmdef/bootasmdef.nx -d BOOT1_ORIGIN` 36*479ab7f0SSascha WildnerORG1 = `${.OBJDIR}/../asmdef/bootasmdef.nx MEM_BIOS_LADDR` 37*479ab7f0SSascha WildnerORG1D = `${.OBJDIR}/../asmdef/bootasmdef.nx -d MEM_BIOS_LADDR` 38*479ab7f0SSascha Wildner 39*479ab7f0SSascha Wildner# WARNING! The ORG2 calculation is the origin of boot2.bin relative to 40*479ab7f0SSascha Wildner# the start of the BTX *USER* address space, not the start of physical 41*479ab7f0SSascha Wildner# memory. 42*479ab7f0SSascha Wildner# 43*479ab7f0SSascha WildnerORG2= `${.OBJDIR}/../asmdef/bootasmdef.nx BOOT2_VORIGIN` 44*479ab7f0SSascha Wildner 45*479ab7f0SSascha WildnerWORLD_CCOPTLEVEL= s # -Os for size constraints in boot2_32 46*479ab7f0SSascha WildnerCFLAGS= -Os \ 47*479ab7f0SSascha Wildner -fomit-frame-pointer \ 48*479ab7f0SSascha Wildner -fno-unwind-tables \ 49*479ab7f0SSascha Wildner -fno-asynchronous-unwind-tables \ 50*479ab7f0SSascha Wildner -DBOOT2 \ 51*479ab7f0SSascha Wildner -I${.CURDIR}/../../common \ 52*479ab7f0SSascha Wildner -I${.CURDIR}/../../../lib \ 53*479ab7f0SSascha Wildner -I${.CURDIR}/../btx/lib -I. \ 54*479ab7f0SSascha Wildner -Wall -Waggregate-return -Wbad-function-cast -Wcast-align \ 55*479ab7f0SSascha Wildner -Wmissing-declarations -Wmissing-prototypes -Wnested-externs \ 56*479ab7f0SSascha Wildner -Wpointer-arith -Wshadow -Wstrict-prototypes -Wwrite-strings 57*479ab7f0SSascha Wildner 58*479ab7f0SSascha WildnerDEBUG_FLAGS= 59*479ab7f0SSascha Wildner 60*479ab7f0SSascha Wildner# Tell gcc that it shouldn't do fancy optimizations for newer processors. 61*479ab7f0SSascha Wildner# Otherwise it winds up creating larger code and we won't be able to fit boot2. 62*479ab7f0SSascha WildnerCFLAGS+= -march=i386 63*479ab7f0SSascha Wildner 64*479ab7f0SSascha Wildner# Unfortunately, unit-at-a-time creates issues as yet 65*479ab7f0SSascha Wildner# not tracked down, in boot2, so we have to turn it off. Note that 66*479ab7f0SSascha Wildner# the problem has been narrowed down to the 'boot2' code. The /boot/loader 67*479ab7f0SSascha Wildner# doesn't seem to have a problem. Added to BOOT2_GCC_FLAGS since clang 68*479ab7f0SSascha Wildner# doesn't recognize this flag. The no-guess-branch-probability flag is also 69*479ab7f0SSascha Wildner# gcc-specific so it was moved to BOOT2_GCC_FLAGS as well. 70*479ab7f0SSascha Wildner# 71*479ab7f0SSascha WildnerCFLAGS+= ${BOOT2_GCC_FLAGS} 72*479ab7f0SSascha Wildner 73*479ab7f0SSascha Wildner# boot2 area in 32 bit disklabel is 16 sectors (8K) 74*479ab7f0SSascha Wildner# 75*479ab7f0SSascha Wildner# boot2 area in 64 bit disklabel is 64 sectors (32K). 76*479ab7f0SSascha Wildner# However, the boot1 btx loader puts boot2 at a physical address 77*479ab7f0SSascha Wildner# of MEM_BTX_USR+BOOT2_VORIGIN which is typically 0xC000, so we 78*479ab7f0SSascha Wildner# cannot make boot2 any larger then 16KB or we overflow the segment. 79*479ab7f0SSascha Wildner# 80*479ab7f0SSascha WildnerNSECT_32?= 16 81*479ab7f0SSascha WildnerNSECT_64?= 30 82*479ab7f0SSascha WildnerLDFLAGS= -nostdlib -static -N --gc-sections 83*479ab7f0SSascha WildnerLINKSCRIPT= --script ${.CURDIR}/boot2.ldscript 84*479ab7f0SSascha Wildner 85*479ab7f0SSascha Wildnerall: boot 86*479ab7f0SSascha Wildner 87*479ab7f0SSascha Wildnerboot: boot1_32 boot2_32 88*479ab7f0SSascha Wildner cat ${.ALLSRC} > boot 89*479ab7f0SSascha Wildner 90*479ab7f0SSascha Wildner.for s in _32 _64 91*479ab7f0SSascha Wildner 92*479ab7f0SSascha Wildner_ADDCFLAGS$s:= -DNSECT=${NSECT$s} 93*479ab7f0SSascha Wildner_ADDCFLAGS$s+= ${BOOT_CCASM_FLAGS} 94*479ab7f0SSascha Wildner_ts= $s 95*479ab7f0SSascha Wildner.if ${_ts} == "_64" 96*479ab7f0SSascha Wildner_ADDCFLAGS$s+= -DDISKLABEL64 97*479ab7f0SSascha Wildner_ADDCFLAGS$s+= -DHAMMER2FS -DUFS 98*479ab7f0SSascha Wildner_ADDOBJS$s+= hammer2$s.o ufsread$s.o scrc32$s.o 99*479ab7f0SSascha Wildner.else 100*479ab7f0SSascha Wildner_ADDCFLAGS$s+= -DUFS -DUFS1_ONLY 101*479ab7f0SSascha Wildner_ADDOBJS$s+= ufsread$s.o 102*479ab7f0SSascha Wildner.endif 103*479ab7f0SSascha Wildner 104*479ab7f0SSascha Wildnerall: boot1$s boot2$s 105*479ab7f0SSascha Wildner 106*479ab7f0SSascha Wildnerboot1$s: boot1$s.out 107*479ab7f0SSascha Wildner objcopy -S -O binary boot1$s.out ${.TARGET} 108*479ab7f0SSascha Wildner 109*479ab7f0SSascha Wildnerboot1$s.out: boot1$s.o bootasm.h 110*479ab7f0SSascha Wildner ${LD} ${LDFLAGS:N-Wl,*} -e start -Ttext ${ORG1} -o ${.TARGET} ${.ALLSRC:M*.o} 111*479ab7f0SSascha Wildner 112*479ab7f0SSascha Wildnerboot1$s.o: boot1.S 113*479ab7f0SSascha Wildner ${CC} ${CFLAGS} ${_ADDCFLAGS$s} -DFLAGS=${B1FLAGS} \ 114*479ab7f0SSascha Wildner ${BOOT_CCASM_FLAGS} ${.ALLSRC} -o ${.TARGET} -c 115*479ab7f0SSascha Wildner 116*479ab7f0SSascha Wildner#${.CURDIR}/../../common/ufsread.c ${.CURDIR}/../../../lib/hammer2.c 117*479ab7f0SSascha Wildner 118*479ab7f0SSascha Wildnerboot2$s.s: boot2.c boot2$s.h ufsread.c hammer2.c scrc32.c 119*479ab7f0SSascha Wildner ${CC} ${CFLAGS} ${_ADDCFLAGS$s} -S -o boot2$s.s.tmp ${.CURDIR}/boot2.c 120*479ab7f0SSascha Wildner sed -e '/align/d' -e '/nop/d' < ${.TARGET}.tmp > ${.TARGET} 121*479ab7f0SSascha Wildner rm -f ${.TARGET}.tmp 122*479ab7f0SSascha Wildner 123*479ab7f0SSascha Wildnerboot2$s.h: boot1$s.out bootasm.h 124*479ab7f0SSascha Wildner @echo "NOTE: boot2 using xread from boot1 at ${REL1}" 125*479ab7f0SSascha Wildner ${NM} -t d ${.ALLSRC:M*.out} | awk '/([0-9])+ T xread/ \ 126*479ab7f0SSascha Wildner { x = $$1 - ORG1; \ 127*479ab7f0SSascha Wildner printf("#define XREADORG %#x\n", REL1 + x) }' \ 128*479ab7f0SSascha Wildner ORG1=${ORG1D} REL1=${REL1D} > boot2$s.h 129*479ab7f0SSascha Wildner 130*479ab7f0SSascha Wildnerboot2$s: boot2$s.ldr boot2$s.bin ${BTX}/btx/btx 131*479ab7f0SSascha Wildner ${.OBJDIR}/../btxld/btxld.nx -v -E ${ORG2} -f bin -b ${BTX}/btx/btx \ 132*479ab7f0SSascha Wildner -l boot2$s.ldr -o boot2$s.ld -P 1 boot2$s.bin 133*479ab7f0SSascha Wildner stat boot2$s.ld | awk '{ x = (${NSECT$s} - 1) * 512 - $$8; \ 134*479ab7f0SSascha Wildner print x " bytes available"; if (x < 0) exit 1 }' 135*479ab7f0SSascha Wildner dd if=boot2$s.ld of=${.TARGET} obs=$$(( (${NSECT$s} - 1) * 512)) conv=osync 2>/dev/null 136*479ab7f0SSascha Wildner 137*479ab7f0SSascha Wildnerboot2$s.ldr: 138*479ab7f0SSascha Wildner dd if=/dev/zero of=${.TARGET} bs=512 count=1 2>/dev/null 139*479ab7f0SSascha Wildner 140*479ab7f0SSascha Wildnerboot2$s.bin: boot2$s.out 141*479ab7f0SSascha Wildner objcopy -S -O binary boot2$s.out ${.TARGET} 142*479ab7f0SSascha Wildner 143*479ab7f0SSascha Wildnerboot2$s.out: boot2$s.o sio.o ${_ADDOBJS$s} 144*479ab7f0SSascha Wildner ${LD} ${LDFLAGS:N-Wl,*} -Ttext ${ORG2} ${LINKSCRIPT} -o ${.TARGET} \ 145*479ab7f0SSascha Wildner ${BTX}/lib/crt0.o ${.ALLSRC} 146*479ab7f0SSascha Wildner 147*479ab7f0SSascha WildnerCLEANFILES+= boot1$s boot1$s.out boot1$s.o \ 148*479ab7f0SSascha Wildner boot2$s boot2$s.ldr boot2$s.bin \ 149*479ab7f0SSascha Wildner boot2$s.ld boot2$s.out boot2$s.o boot2$s.h boot2$s.s \ 150*479ab7f0SSascha Wildner ${_ADDOBJS$s} 151*479ab7f0SSascha Wildner 152*479ab7f0SSascha Wildnerhammer2$s.o: hammer2.c 153*479ab7f0SSascha Wildner ${CC} ${CFLAGS} ${_ADDCFLAGS$s} ${.ALLSRC} -o ${.TARGET} -c 154*479ab7f0SSascha Wildner 155*479ab7f0SSascha Wildnerufsread$s.o: ufsread.c 156*479ab7f0SSascha Wildner ${CC} ${CFLAGS} ${_ADDCFLAGS$s} ${.ALLSRC} -o ${.TARGET} -c 157*479ab7f0SSascha Wildner 158*479ab7f0SSascha Wildnerscrc32$s.o: scrc32.c 159*479ab7f0SSascha Wildner ${CC} ${CFLAGS} ${_ADDCFLAGS$s} ${.ALLSRC} -o ${.TARGET} -c 160*479ab7f0SSascha Wildner 161*479ab7f0SSascha Wildner.endfor 162*479ab7f0SSascha Wildner 163*479ab7f0SSascha Wildnersio.o: sio.S 164*479ab7f0SSascha Wildner ${CC} ${CFLAGS} -DSIOPRT=${BOOT_COMCONSOLE_PORT} -DSIOFMT=${B2SIOFMT} \ 165*479ab7f0SSascha Wildner -DSIOSPD=${BOOT_COMCONSOLE_SPEED} \ 166*479ab7f0SSascha Wildner ${.ALLSRC} -o ${.TARGET} -c 167*479ab7f0SSascha Wildner 168*479ab7f0SSascha Wildnerinstall: 169*479ab7f0SSascha Wildner ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 170*479ab7f0SSascha Wildner boot ${DESTDIR}${BINDIR}/boot 171*479ab7f0SSascha Wildner ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 172*479ab7f0SSascha Wildner boot1_32 ${DESTDIR}${BINDIR}/boot1 173*479ab7f0SSascha Wildner ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 174*479ab7f0SSascha Wildner boot2_32 ${DESTDIR}${BINDIR}/boot2 175*479ab7f0SSascha Wildner ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 176*479ab7f0SSascha Wildner boot1_64 ${DESTDIR}${BINDIR}/boot1_64 177*479ab7f0SSascha Wildner ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 178*479ab7f0SSascha Wildner boot2_64 ${DESTDIR}${BINDIR}/boot2_64 179*479ab7f0SSascha Wildner 180*479ab7f0SSascha Wildner.include <bsd.prog.mk> 181